找出1,000,000总价值中最大的10,000个

时间:2012-09-20 17:15:36

标签: algorithm data-structures

我有一个包含1,000,000个浮点值的文件。我需要找到10,000个最大值。

我在考虑:

  1. 阅读文件
  2. 将字符串转换为浮点数
  3. 将浮动放入最大堆(最大值为根的堆)
  4. 在所有值都在堆中之后,删除根10,000次并将这些值添加到列表/ arraylist中。
  5. 我知道我会有

    1. 1,000,000个插入堆
    2. 从堆中删除10,000次
    3. 10,000个插入到返回列表中
    4. 这是一个很好的解决方案吗?这是家庭作业。

4 个答案:

答案 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(提示:你只能看一次每个输入数字)?

最后一点,因为你说这是作业:如果你刚刚在课堂上学习堆积,并且你认为你的老师/教授正在寻找堆解决方案,那么是的,你的想法很好。