最近在看看算法,对一道曾经见过好几次的问题忽感兴趣。
就是如何从一个大集合中,选出其中的TOPN,举个例子: 从100 0000个int中,选出最大的100个。
其实,解决办法应该有很多,这里选择的是一种利用最大堆来解决这个问题的办法,这种办法效率还是比较高的。
基本原理就是:建立100个元素的最大堆,然后在堆中找出最小元素,如果此元素小于后面即将参与比较的元素,则删除最小元素,将新元素插入后,重新构建最大堆,以此类推,直至处理完100 0000个数字,堆中存在的元素,即为TOP100。
我在这里给出一个STL的实现:
我们可以发现,在STL中,利用heap的相关算法,还是很容易实现我们的功能的,我们并不需要自己从头造轮子,STL的东西还是相当丰富的。
其后我还做了一个小测试:
首先,利用Python生成测试数据:
两端程序生成结果为HeapSort.exe和inputSet.txt
利用 HeapSort.exe < inputSet.txt命令测试一下结果:Runtime: 0.015
可以发现,效率还是很高的。
鉴于对比,我重新写了一个bubbleSort的代码:
测试结果是:暂时没有结果。
在有限的时间内(<=10秒),我没有看到结果的输出,可以看到差距是非常大的(而且,这里还省去了IO的输入)