【问题标题】:external sorting外部排序
【发布时间】:2011-02-24 04:08:09
【问题描述】:

在此网页中:

http://web.eecs.utk.edu/~huangj/CS302S04/notes/external-sorting2.html

将生成的运行合并到 连续更大的运行,直到 文件已排序。

正如我所引用的,我们如何将结果运行合并在一起???我们没有那么多内存。

【问题讨论】:

    标签: algorithm sorting


    【解决方案1】:

    想象一下你有数字 1 - 9

    9  7  2  6  3  4  8  5  1
    

    让我们假设一次只有 3 个适合内存。

    因此,您可以将它们分成 3 个块并对每个块进行排序,将每个结果存储在一个单独的文件中:

    279
    346
    158
    

    现在您将打开三个文件中的每一个作为流并从每个文件中读取第一个值:

    2 3 1
    

    输出最小值1,并从该流中获取下一个值,现在您有:

    2 3 5
    

    输出下一个最小值2,然后继续往下直到输出整个排序列表。

    【讨论】:

    • 谢谢你。但是,请看那个网站的例子,上面写着“使用了 6 个 I/O 单元。”......怎么样?如果按照你的方式,那就是很多 IOs
    • 嗯,原理是一样的,但是不能一下子全部搞定,你得先分区,排序部分,然后全部合并,再对分区的其余部分排序,合并与最初的合并排序列表。因此,您不会使用超过 6 个 i/o 单元。页面上的算法描述了在给定 i/o 单元约束的情况下对数据进行分区的最佳方法。
    • 这适用于那个例子,但是你有这个列表怎么样? 9 7 8 6 3 4 2 5 1,那么你最终会得到以下组:789、346、125。如果你从每个组中排序第一个,然后是秒,然后是三分之一,你最终会得到类似的结果这个:127248569,这是不正确的。所以简而言之,我仍然不明白它是如何工作的......
    • @Gaara 你是怎么得到 1272xxxx 的? 789 - 346 - 125 .. 从每个流中选择第一个值,给你 [731].. 打印 1.. 从第三流中选择 2,[732].. 打印 2.. 从第三流中选择 5 [735] .. 打印 3 .. 以正确的方式进行..
    • 知道了,everlasto!我误解了该算法的工作原理,但现在我通过您的清晰示例了解了它。非常感谢!
    【解决方案2】:

    如果您将两个运行 AB 处理成更大的运行 C,您可以逐行执行此操作,生成逐渐更大的运行,但一次最多只能读取 2 行。因为该过程是迭代的,并且因为您正在处理数据流而不是完整的数据切割,所以您无需担心内存使用情况。另一方面,磁盘访问可能会使整个过程变慢——但它肯定胜过一开始就无法完成工作。

    【讨论】:

    • 兄弟,这有点尴尬,今天我发了一个面试官问的问题,希望能得到一些帮助,但没有人回答,被浏览了30+次。我真的希望你能抽出一点时间来帮助我,这是链接:stackoverflow.com/q/7425400/888051非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2021-07-28
    • 2013-05-11
    相关资源
    最近更新 更多