前言:
在优快云上看到一个网友利用最小堆实现 “ 获取一亿数据获取前100个最大值” 。原帖请看:http://blog.youkuaiyun.com/yjflinchong/article/details/7533972。 然后自己利用quicksort的原理也写了一个程序来解决那个问题。通过测试,基于quicksort原理的方法平均运行时间是1.264秒,基于最小堆方法的平均运行时间是0.288秒 (网友写的程序运行时间比我的大很多,0.288秒这个程序是我自己写的,如果测试网友写的基于minHeap的方法,运行时间是2.501秒)。基于最小堆方法运行时间很稳定(每次运行时间相差很小),基于quicksort原理的方法运行时间不稳定(每次运行时间相差大)。
基于quicksort实现的原理如下:
1. 假设数组为 array[N] (N = 1 亿),首先利用quicksort的原理把array分成两个部分,左边部分比 array[N - 1] (array中的最后一个值,即pivot) 大, 右边部分比pivot 小。然后,可以得到 array[array.length - 1] (即 pivot) 在整个数组中的位置,假设是 k.
2. 如果 k 比 99 大,原数组变成了 array [0, ... k - 1], 然后在数组里找前 100 最大值。 (继续递归)
3. 如果 k 比 99 小, 原数组变成了 array [k + 1, ..., N ], 然后在数组里找前 100 - (k + 1) 最大值。(继续递归)
4. 如果 k == 99,

本文介绍了两种方法来解决在一亿数据中获取前100个最大值的问题。一种是基于quicksort的策略,将数组分为两部分并找到基准值的位置,然后递归地解决问题;另一种是使用最小堆,其时间复杂度为O(lg K * N)。实验表明,最小堆方法平均运行时间为0.288秒,而quicksort方法平均为1.264秒,但quicksort方法运行时间不稳定。
最低0.47元/天 解锁文章
5万+

被折叠的 条评论
为什么被折叠?



