TopK问题[对于堆]
找到N个数里的前K个
高效解法:
建一个K个数的堆,求前K个最大值就建小堆/求前K个最小值就建大堆
[下面以求前K个数的最大值为例]
初始时,先将列表中的前 K 个数放入堆中,堆的根(堆顶)是当前堆中的最小值。
然后遍历剩余的元素,如果某个元素比堆顶的最小值还大,就将堆顶元素移除并将该元素插入堆中。
由于堆的特性,这会使得堆重新调整,从而保持 K 个最大的数在堆中。
每一次遍历可能把堆的最小值更新的更大,每一次遍历都有贡献。
这个过程可以形象地通过堆顶元素下沉来理解,因为每次替换堆顶元素后,它需要下沉到合适的位置,这就是堆的“下沉”操作。
把N个数的列表看成一个纸带,让堆在上面跑,比堆最小值大的数自然会下沉到堆里,
有点那种液体密度的感觉,堆的最上面密度最小,如果N列表里密度更大就会自然下沉到堆里合适位置。
这样跑完整个纸带,堆里面的K个值就是整个N列表里最大(“密度最大的K个值了”)
建小堆大数下沉 ,建大堆小的数会下沉
选出最小的几个数
同理,只需要建大堆,然后再遍历一遍N列表,最后堆中只会留下最小的K个数