我有一个包含1,000,000个浮点值的文件。我需要找到10,000个最大值。
我在考虑:
我知道我会有
这是一个很好的解决方案吗?这是家庭作业。
答案 0 :(得分:8)
您的解决方案非常好。它基本上是heapsort,在获取K元素后会停止,从而将运行时间从O(NlogN)
(完整排序)提高到O(N + KlogN)
。这里N = 1000000且K = 10000。
但是,您最初不应该对堆执行N次插入,因为这将需要O(NlogN)
- 而是使用heapify操作将线性时间内的数组转换为堆。
如果不需要对K个数字进行排序,您可以使用selection algorithm找到线性时间内的第K个最大数字,然后输出大于它的所有数字。这给出了O(n)
解决方案。
答案 1 :(得分:0)
在您全部读完数据后,是否可以合并数组中的值?这是对值进行排序的快速方法。然后你可以请求your_array [10000],你会知道它是第10000大。合并排序听起来像你想要的。此外,如果你真的需要速度,你可以考虑格式化基数排序的值,这需要一些格式化,但听起来这将是解决这个问题的绝对最快的方法。
答案 2 :(得分:0)
如何使用mergesort(在最坏的情况下记录n个操作)将1,000,000个整数排序到一个数组中,然后直接得到最后的10000个?
答案 3 :(得分:0)
排序很昂贵,输入设置也不小。幸运的是,你不关心秩序。您所需要的只是知道您拥有前X个数字。所以,不要排序。
如果您不是在寻找1,000,000中的前10,000名,而是在寻找100中的前1名(即单个最大值),那么您将如何解决这个问题呢?您只需要跟踪到目前为止看到的最大值,并将其与下一个数字进行比较,然后将其与下一个数字进行比较,直到找到较大的数字或输入用完为止。您能否将这个想法扩展回您正在查看的输入大小?什么是大O(提示:你只能看一次每个输入数字)?
最后一点,因为你说这是作业:如果你刚刚在课堂上学习堆积,并且你认为你的老师/教授正在寻找堆解决方案,那么是的,你的想法很好。