【问题标题】:C Sorting records from a fileC 对文件中的记录进行排序
【发布时间】:2018-04-29 08:59:34
【问题描述】:

大家好,我正在做一个项目,根据给定的标准(姓名或年龄或性别或家乡)对包含大量记录的文件进行排序,并以原始文件的格式写入输出文件。但是,我正在辩论什么是最快的方法。该文件包含以下记录:

Name Age gender hometown
Adam 28  Male   New york
Kevin 42 Male   Boston
...

我的想法是读取文件并创建结构的链表:

struct record
{   
char * SortCriteriaString;
int SortCriteriaInt;
char * Name;
int Age;
char * Gender;
char * Hometown;};

然后根据我从命令行读取的条件对链表进行mersort并存储在结构的SortCriteriaInt或SortCriteriaString成员中。

这是我计划对这个项目做的事情。但是我被要求提出最快的排序器,所以我的问题是:如果不是我上面描述的,那么这个任务最快的数据结构和排序算法是什么?

【问题讨论】:

  • @MitchWheat 但是如果我将排序标准作为命令行中的字符串,我如何访问结构的成员?如果复制到排序标准的行中会变慢,那么为所有情况编写排序函数会更好吗?
  • 真的取决于您稍后会对该结构做什么,但我个人会选择动态数组和快速排序。如果您的文件大小差异很大,那么二叉树可能是一个不错的方法
  • @Fureeish 您好,感谢您的反馈!如果我需要进行归并排序怎么办?链表是一种快速性能的良好数据结构吗?
  • mallocquicksort 最简单最快,应该是选项1。如果你有一台30年前的旧电脑,那么你会发现链表稍微快一点。
  • 没有。 Mergesort 是 Linked Lists 的首选,但之所以如此,是因为其他排序要么无法实现,要么对于这种数据结构效率非常低。您最好的平均性能是数组 + 快速排序,但如果您无法使用 Mergesort,请使用这两者中的任何一个。这里的问题在于,Mergesort 除了具有O(n*log_2(n)) 的时间复杂度之外,还使用了额外的O(n) 空间,因此它在您的“文件中真的效率低下大量记录”。

标签: c file sorting


【解决方案1】:

对指向结构的指针数组进行排序比对结构的链表进行排序要快。如果结构不是太大,那么直接对结构数组进行排序会比对结构指针数组进行排序要快,但这意味着如果使用归并排序,则使用 O(n) 空间(临时数组)。

由于您的结构具有指向字符串的指针,因此合并排序应该比快速排序更快。合并排序比快速排序移动更多,但比较次数更少,在这种情况下,它主要是移动指针,但必须比较字符串。

为字符串分配最大长度的固定大小的结构可能会更快,以便在排序期间移动字符串。如果字符串不是太大,这将有助于在排序期间缓存局部性。

【讨论】:

    【解决方案2】:

    通常,您不需要结构的每个实例中列出的排序条件,因此建议删除这两个字段。

    最快的排序方式是不必对char* 字段指向的每个数据字段执行“深拷贝”。

    为了避免深度复制(甚至避免结构实例的简单复制。开发一个指向结构实例的指针数组。 然后实现类似 'qsort()' 的东西,它在结构实例的字段中执行比较,实际上只修改指向这些实例的指针。

    然后通过遍历指向结构实例的指针数组来遍历排序后的数组。

    【讨论】:

    • 您好,感谢您的反馈!但是,如果我删除排序标准并从命令行获取排序标准作为字符串,我的程序如何访问正确的结构成员?
    • 另外,在处理大量记录时,快速排序不存在安全问题吗?对于合并排序等更稳定的排序算法,对指针数组进行排序会不会比链表花费更多的时间来交换元素(复制)?
    • @woshidashen,使用与实际数据分开的指针数组,意味着只需要移动指针数组中的指针。我不熟悉使用快速排序功能的任何安全风险。您可以使用任何算法进行排序,包括合并排序。请记住,唯一的数据移动是指针,因此不需要链表
    猜你喜欢
    • 2017-02-02
    • 2022-01-18
    • 2019-02-04
    • 1970-01-01
    • 2020-07-30
    • 2011-07-02
    • 2013-06-06
    • 2019-08-04
    • 2015-02-26
    相关资源
    最近更新 更多