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

时间:2011-04-11 17:23:29

标签: c sorting data-structures binary-tree binary-search-tree

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

Currenlty我把它们放在一个数组中,然后使用qsort()为它们排序索引,效果很好。

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

哪种数据结构在C中最直接实现?

更新

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

概要

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

也就是说,如果您不需要支持删除,AVL树和rb-tree更容易实现。左倾rb树可以容纳50行左右的代码。见http://www.cs.princeton.edu/~rs/talks/LLRB/(塞奇威克)

答案 2 :(得分:0)

你可以实现一个更快的排序算法,例如Timsort或其他排序算法,使用nlog(n)最坏的情况,只使用二进制搜索进行搜索,因为如果列表排序,它会更快。

答案 3 :(得分:0)

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