【问题标题】:Best data structure/ container in C++ for insertion and deletionC ++中用于插入和删除的最佳数据结构/容器
【发布时间】:2012-07-04 09:48:17
【问题描述】:

我正在寻找 C++ 的最佳数据结构,其中插入和删除可以非常高效和快速地进行。

这种数据结构的遍历也应该很容易。我应该和哪一个一起去? C++ 中的 SET 呢??

【问题讨论】:

  • 您需要提供更多信息。你到底想怎么用?
  • 物品取决于很多因素,包括您要存储多少物品。
  • 许多其他因素也起着重要作用..例如插入和删除是在结尾/开头还是在随机位置?查找性能有多重要?是否允许重复?
  • 我有一些细胞和叶子。当一个单元格被拆分时,我想作为叶子存储在另一个单元格中以及所有这些东西。基本上插入可能不是顺序的。它们可以是随机的。我只想要一个有叶子的容器......顺序无关紧要......我想要一个像数组但在搜索和所有方面更有效的东西。
  • 你确定吗? 8^20 是 2^60。由于您不能有重复项,因此每个项目至少需要 60 位。如果您按顺序存储它们,那就是 8.65 exabytes - 没有花哨的结构。您很快就无法将其安装在普通计算机中。

标签: c++ data-structures


【解决方案1】:

链接的list 提供了任意元素的高效插入和删除。这里的删除是迭代器的删除,而不是值的删除。遍历速度非常快。

dequeue 仅在末端提供有效的插入和删除,但它们比链表更快,并且遍历也更快。

set 仅在您想按值查找元素时才有意义,例如删除它们。否则检查重复的开销以及保持排序的开销将被浪费。

【讨论】:

    【解决方案2】:

    这取决于您要放入此数据结构中的内容。如果项目是无序的或者您关心它们的顺序,则可以使用 list。如果您希望它们按排序顺序排列,set 或 multiset(后者允许多个相同的元素)可能是另一种选择。

    list 通常是一个双链表,所以插入和删除可以在恒定时间内完成,只要你知道位置。遍历所有元素也很快,但访问指定元素(按值或按位置)可能会变慢。

    set 及其家族通常是二叉树,因此插入、删除和搜索元素大多是在对数时间内(当您知道在哪里插入/删除时,它是常数时间)。遍历所有元素也很快。

    (注意:boost 和 C++11 都有基于哈希表的数据结构,这也是一个选项)

    【讨论】:

    • 当你分裂一片叶子时,你大致知道在哪里插入新的叶子,所以它会是恒定的时间。
    【解决方案3】:

    我会说一个链接列表,具体取决于您的删除是否具体且经常。关于它的迭代器。

    【讨论】:

      【解决方案4】:

      我突然想到,你需要一个tree

      我不确定确切的结构(因为您没有提供详细信息),但如果您可以将数据放入binary tree,您可以在搜索、删除和插入元素时达到不错的速度(O(logn) 平均和 O(n) 最坏情况)。

      注意我这里说的是数据结构,你可以用不同的方式实现。

      【讨论】:

      • 一个集合最常使用red-black tree 来实现,它是一种二叉树形式,将保证O(log n) 的删除和插入。重新实现该树将产生很小的价值。
      • @MvG,我没有说他需要重新实现,我只是命名了他可以使用不同的数据结构,具体取决于他的数据(目前还不太清楚数据看起来如何,例如他是否有键值对)。如果一个集合或多集合很适合他,那就没问题了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 2013-03-13
      • 1970-01-01
      • 2014-03-04
      • 2013-03-05
      • 2022-06-10
      相关资源
      最近更新 更多