Q:Top K问题:从海量数据n中找出前K个数据?
- 使用 排序算法 进行全排序,时间复杂度
-
使用 数据结构 二叉堆 来解决,时间复杂度
1.使用小顶堆
2.将前个数放入堆中,然后从
个数开始,如果大于堆顶元素,replace操作
3.扫描完毕后,堆中剩下的就是最大的前个数
1. 二叉堆(Heap)
(1) 定义
堆(Heap):是一种树状的数据结构
- 堆中的元素必须具备 可比较性
- 任意节点的值总是
或
子节点的值
如果任意节点的值总是子节点 的值,称为:最大堆、大根堆、大顶堆
如果任意节点的值总是子节点 的值,称为:最小堆、小根堆、小顶堆
最大堆_二叉堆、最小堆_二叉堆
2. 二叉堆(Binary Heap)
(1) 定义
二叉堆(Binary Heap):逻辑结构就是一棵完全二叉树,也叫完全二叉堆
二叉堆的底层一般用数组实现即可
二叉堆
索引 i 的规律(n是元素数量)
- 如果
,它是根节点
- 如果
,它的父节点的索引为
![]()
- 如果
,它的左子节点的索引为
![]()
- 如果
,它没有左子节点
- 如果
,它的右子节点的索引为
![]()
- 如果
,它没有右子节点
(2) 最大堆 - 添加
上滤(Sift Up):时间复杂度
- 循环执行以下操作
如果 node父节点 - 与父节点交换位置
如果 node父节点,或者node没有父节点 - 退出循环
上滤
(3) 最大堆 - 删除
下滤(Sift Down):时间复杂度
- 用最后一个节点 覆盖 根节点
- 删除 最后一个节点
- 循环执行以下操作
如果 node最大子节点 - 与最大子节点交换位置
如果 node最大子节点,或者node没有子节点 - 退出循环
下滤
(4) 最大堆 - 批量建堆(Heapify)
批量建堆2种方法:
- 自上而下的上滤
- 自下而上的下滤
1> 自上而下的上滤
自上而下的上滤 本质是:添加
自上而下的上滤
2> 自下而上的下滤
自上而下的上滤 本质是:删除
自下而上的下滤
3> 效率对比
所有节点的深度之和
- 仅仅是叶子节点,就有近
个每个叶子节点的深度是
级别
所有节点的高度之和
- 假设是满树,节点总个数为
,树高为
,那么
![]()
- 所有节点的树高之和
![]()
效率对比