找出最大的前K个数

来源:互联网 发布:男生淘宝网名昵称大全 编辑:程序博客网 时间:2024/05/21 17:34

是编程之美里的一个问题,

找出一个列表中的最大的前k个数,最先想到,

也是最简单的思路是做一个K长度的盒子,然后一个一个数据往里放,有大的来了就把小的剔除掉。

但是这样的做法会导致盒子内部要是有序的。(不然找不出谁是最小的,比较和剔除就不能做了)

这个做法的复杂度是O(N*K)

 

书里面讲了一种比较好的办法,就是类似于快速排序,做一个切割,看够不够。然后递归出结果。

这样的复杂度就是O(N*logK)了

 

接下去的一个思路是来自堆排序,看一下把一个数组整理成大顶堆的代码

 

 

所以说,如果我们定义一个长度是K的小顶堆,让他盛满。

来一个数,比较顶和数字的大小,如果大于顶,就把顶剔除,放入新数字后整理堆。

直到整个数组被遍历一遍。这样的好处是整个数组只要遍历一次。

 

如果说对于一个Gb的数据找出前20个,这是比较好的办法。

 

但是貌似在数组里实现堆要判断好多越界的情况,于是有了下面一堆代码……

 

 

写完这个程序的时候,我发现heap建立的时候,可以从下到上建立,就是下标,除以二直到0.

 

而追加一个数据到顶以后就要从上往下走了。

 

所以上面有两段不同的代码。iniheap和rTidyHeap