【问题标题】:Efficient algorithm to sort file records对文件记录进行排序的高效算法
【发布时间】:2011-07-02 01:27:01
【问题描述】:

我有一个文件,其中包含不同长度的记录数。对这些记录进行排序的有效算法是什么。

记录样本:

000000000000dc01 t error_handling 44

0000000dfa01a000 有趣的 44

总记录 = >5000 编程语言c

我想知道哪种算法适合根据地址对该文件进行排序以及读取这些记录的有效方法是什么?

【问题讨论】:

  • 你说每条记录超过5000字节?或者您有超过 5000 条记录,每条记录长度为 20-100 字节?
  • 对不起,文件将有最少 5000 条记录,最大未定义。
  • 您真的需要自己对该文件进行排序吗?还是有一个实用程序来做到这一点就足够了?如果您在 Windows 上运行,则可以使用 SORT 命令。我成功地使用它对数百兆字节的文件进行了排序。
  • @Patrick 我真的需要自己对这个文件进行排序。这是我程序中的模块之一。

标签: c algorithm file sorting data-structures


【解决方案1】:

如果文件太大而无法放入内存,那么您唯一合理的选择是基于文件的合并排序,它涉及两次。

在第一遍中,读取包含 N 条记录的块(其中 N 定义为可放入内存的记录数),对它们进行排序,然后将它们写入临时文件。完成此过程后,您要么拥有一定数量(称为 M)的临时文件,每个临时文件都有不同数量的已排序记录,要么您拥有一个包含已排序记录块的临时文件。

第二遍是M路合并。

前段时间我写了一篇关于如何使用文本文件执行此操作的文章。见Sorting a Large Text File。扩展它非常简单,以便对您定义的其他类型的记录进行排序。

如需了解更多信息,请参阅External sorting

【讨论】:

    【解决方案2】:

    由于记录的长度不同,一个有效的方法是:

    1. 读取文件并将其解析为指向记录的指针数组
    2. 对指针数组进行排序
    3. 写出结果

    随机访问文件会很慢,因为必须计算换行符才能找到特定记录。

    如果您有一个非常大的文件,请将流程调整为:

    for each n records
       read and parse
       sort
       write to temporary file
    
    mergesort temporary files
    

    【讨论】:

      【解决方案3】:

      就地Quicksort 是最好的通用排序算法之一。更快的排序是可能的(例如桶排序),但这取决于您正在排序的数据的某些属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-29
        • 2022-01-18
        • 2015-07-29
        • 2019-08-04
        • 1970-01-01
        • 2012-07-27
        • 2017-02-02
        • 2014-04-20
        相关资源
        最近更新 更多