有序列表的最佳数据结构(性能)

时间:2013-06-25 11:51:39

标签: c++ algorithm sorting

我的应用程序有一个关键部分,包括获取数据源(无序),然后按顺序对每个元素执行算法。实际上我遵循下一个算法:

  • 阅读源代码并将其放入std :: map,使用排序元素作为键,信息作为内容。
  • 使用迭代器读取地图并执行算法。

我看到地图可能不是最好的数据结构,因为我只需要将数据添加到排序列表中然后完全“刻录”列表(同样,内存分配在移动设备上也很昂贵,所以我会我喜欢自己做。)

我做了一些研究,我正在阅读像B树和黑红树这样的东西。它们可能就是我要搜索的内容,但我会在这里询问是否有人知道一个方便该任务的数据结构。

简而言之,我想要一个结构:

  • 快速插入。
  • 快速迭代(从开始到结束)。
  • 其他一切都不重要(既不删除也不搜索)。

快速插入也比快速迭代更重要(我的分析师这样说:D)。

谢谢大家。

4 个答案:

答案 0 :(得分:2)

至少有两种有效的解决方案:

  1. 将元素附加到矢量;对矢量进行排序;扫描矢量。
  2. 将元素插入priority_queue;排干它。
  3. 向量具有O(N)加载时间(对于priority_queue对O(N log N))的优点。 (注意,由于排序,它总是需要O(N log N)。

    priority_queue具有在耗尽内存时释放内存的优势。这不会减少最大内存占用,并且可能带来微不足道的好处,但无论如何都值得尝试。

答案 1 :(得分:2)

理论上更好的方法是使用heapsort

但是,实际上,最快的方法是将元素附加到矢量,然后使用快速排序对它们进行排序。

在这两种情况下,平均需要O(N * log(N)),但快速排序具有最低的常数因子。

答案 2 :(得分:0)

我建议写一个skip list。这正是您所要求的 - 带有O(log(n))插入的排序列表。它也相对容易实现。

答案 3 :(得分:0)

如果您的密钥值有限,您可能需要考虑使用Bucketsort