用于插入/排序的最快数据结构

时间:2010-09-03 11:36:47

标签: sorting data-structures insert performance

我需要一个可以插入元素并尽快排序的数据结构。我将插入比排序更多。删除不是一个问题,而是空间。我的具体实现还会在一个数组中存储节点,因此查找将是O(1),即你不必担心它。

6 个答案:

答案 0 :(得分:6)

只需使用其中一个self-balanced binary search trees,例如红黑树。

答案 1 :(得分:6)

如果您要插入 lot 而不是排序,那么最好使用未排序的列表/向量,并在需要排序时快速排序。这样可以非常快速地插入。一个 1 缺点是排序是一个相对冗长的操作,因为它没有在许多插入上分摊。如果你依赖相对恒定的时间,这可能是坏事。

1 想想看,还有第二个缺点。如果您低估了排序频率,这可能很快就会比树或排序列表慢一些。例如,如果你在每个插入后排序,那么insert + quicksort循环将是一个坏主意。

答案 2 :(得分:1)

如果你可以在每种排序之前做很多插入,那么显然你应该只是追加这些项目,并在你需要的时候进行排序。我最喜欢的是合并排序。即O(N * Log(N)),表现良好,存储操作最少(new,malloc,树平衡等)

但是,如果集合中的值是整数且相当密集,则可以使用O(N)排序,其中您只需将每个值用作足够大的数组的索引,并在此处设置布尔值TRUE指数。然后你只扫描整个数组并收集真正的索引。

您说您将项目存储在查找为O(1)的数组中。除非您使用哈希表,否则表明您的项目可能是密集整数,因此我不确定您是否 有问题。

无论如何,内存分配/删除都很昂贵,如果可以的话,你应该通过预先分配或汇集来避免它。

答案 3 :(得分:1)

使用任何平衡二叉树,如AVL树。它应该为你正在寻找的两个操作提供O(lg N)的时间复杂度。

答案 4 :(得分:0)

我使用Skip List

为这种任务获得了一些很好的经验

至少在我的情况下,与首先将所有内容添加到列表然后在最后对其进行排序相比,它快了大约5倍。

答案 5 :(得分:0)

如果您不需要随机访问阵列,则可以使用Heap

最差和平均时间复杂度:

  • O(log N)插入
  • O(1)读取最大值
  • O(log N)删除最大值

可以重新配置为最小值而不是最大值。通过重复删除最大/最小值,您将获得O(N log N)中的排序列表。

相关问题