Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
最容易在C语言中实现在线排序数据结构_C_Sorting_Data Structures_Binary Tree_Binary Search Tree - Fatal编程技术网

最容易在C语言中实现在线排序数据结构

最容易在C语言中实现在线排序数据结构,c,sorting,data-structures,binary-tree,binary-search-tree,C,Sorting,Data Structures,Binary Tree,Binary Search Tree,我正在扫描一个大数据源,目前大约有800万个条目,提取每个条目的字符串,我希望按字母顺序 目前,我将它们放在一个数组中,然后使用qsort()对索引进行排序,这很好 但出于好奇,我考虑将每个字符串插入到一个数据结构中,在我从数据源扫描它们时按字母顺序维护它们,部分是为了体验emlplementone,部分是因为在扫描完成后,如果不等待排序完成,它会感觉更快(-: 用C实现什么样的数据结构最简单 更新 为了澄清,我需要执行的唯一操作是插入一个项目,并在完成后转储索引,我的意思是,对于原始顺序中的每

我正在扫描一个大数据源,目前大约有800万个条目,提取每个条目的字符串,我希望按字母顺序

目前,我将它们放在一个数组中,然后使用
qsort()
对索引进行排序,这很好

但出于好奇,我考虑将每个字符串插入到一个数据结构中,在我从数据源扫描它们时按字母顺序维护它们,部分是为了体验emlplementone,部分是因为在扫描完成后,如果不等待排序完成,它会感觉更快(-:

用C实现什么样的数据结构最简单

更新

为了澄清,我需要执行的唯一操作是插入一个项目,并在完成后转储索引,我的意思是,对于原始顺序中的每个项目,转储一个整数,表示排序后的顺序

摘要

  • 最容易实现的是二进制搜索树
  • 自平衡二叉树更好,但实现起来并不重要
  • 插入可以迭代完成,但转储结果的顺序遍历和删除树的后顺序遍历都需要递归或显式堆栈
  • 如果不实现平衡,有序输入的运行将导致退化的最坏情况,即链表。这意味着深树严重影响插入操作的速度
  • 稍微洗牌输入可以显著分解有序输入,并且更容易实现这种平衡

二进制搜索树。或自平衡搜索树。但不要期望它们比正确实现的动态数组快,因为数组的引用位置比指针结构好得多。此外,不平衡的BST可能“线性化”,因此整个算法变为O(n²),就像快速排序一样。

二进制搜索树。或自平衡搜索树。但不要期望它们比正确实现的动态数组快,因为数组的引用局部性比指针结构好得多。此外,不平衡的BST可能“线性化”,因此整个算法变为O(n²),就像快速排序一样。

您可以使用nlog(n)最坏情况实现更快的排序算法,如us Timsort或其他排序算法,并使用二进制搜索进行搜索,因为如果列表已排序,则其速度更快。

您可以使用nlog(n)实现更快的排序算法,如us Timsort或其他排序算法在最坏的情况下,只需使用二进制搜索即可,因为如果对列表进行排序,搜索速度会更快。

您应该看看Trie数据结构
我认为这将满足您的需求

您应该看看Trie数据结构
我认为这将满足您的需求

您已经在使用最佳方法。最后的排序将比维护在线排序的数据结构便宜得多。使用rb树可以获得相同的O(logN),但常数将更糟糕,更不用说显著的空间开销了


也就是说,如果您不需要支持删除,AVL树和rb树的实现要简单得多。左倾rb树可以容纳50行左右的代码。请参见(Sedgewick)

您已经在使用最佳方法。最后的排序将比维护在线排序的数据结构便宜得多。您可以得到相同的O(logN)使用rb树,但常数会更糟糕,更不用说显著的空间开销了


也就是说,如果您不需要支持删除,AVL树和rb树的实现要简单得多。左倾的rb树可以容纳50行左右的代码。请参阅(Sedgewick)

继续线性排序,我注意到数据中有相当多的部分已经进行了大范围的排序。@hippietrail:那么自平衡树将是理想的结构。请注意,
qsort
通常是快速排序,因此在此类数据上也可能是二次排序。也许尝试实现合并排序?@larsmans不是t
快速排序
(如果正确实施)将需要二次时间,这在所有实际目的中都是可以忽略的?@abeln:这种可能性很大程度上取决于输入的分布。如果这可能接近排序,那么快速排序(和不平衡树排序)很可能是二次的。@hippietrail,关于你的更新:我认为一个好的动态数组实现加上一个定制的排序算法将是最优的。但是实现BST只是为了看看它们的表现有多好会很有趣,你可以跳过愚蠢的删除算法:)继续线性,我注意到,数据中有相当多的部分已经进行了大量排序。@hippietrail:那么,自平衡树就是理想的结构。请注意,
qsort
通常是快速排序,因此对此类数据也可能进行二次排序。也许尝试实现mergesort?@larsmans
quicksort
(如果实现正确)花费二次时间的概率在所有实际用途中都是可以忽略的吗?@abeln:这种概率很大程度上取决于输入的分布。如果这很可能接近排序,那么快速排序(和不平衡树排序)很可能是二次排序。@hippietrail,关于您的更新:我认为一个好的动态数组实现加上一个定制的排序算法将是最佳的。但是,实现BST只是为了看看它们的表现如何,这会很有趣,你可以跳过愚蠢的删除算法:)事实上,我甚至不需要搜索操作。只需插入,然后在最后我要转储索引。我可能会编辑这个问题来说明这一点。事实上,我甚至不需要搜索操作。只需插入,然后在最后我要转储索引。我可以编辑这个问题来说明这一点。