具有O(1)插入(摊销)和O(n)迭代的容器

时间:2011-11-09 13:47:07

标签: c++ algorithm containers

我正在寻找具有这些基本属性的类似集合的容器类:

  1. 已摊销O(1)插入时间,重复插入被忽略
  2. 有O(n)次迭代时间(特别是O(容量)不可接受)
  3. 重用内存/仅在超出当前容量时分配
  4. 用例是我有一个更大的对象容器。在每个循环期间,我将向这个新容器添加这些对象的子集。该子集可以是1-5个对象,也可以是整个集合的10%。然后我迭代这个新集合中的对象。每个循环对象将被清除,处理再次开始。

    我的原始方法在对象上使用了一个入侵布尔值,表明它是否属于这个新集合。因此插入是真正的恒定时间,并且它没有使用新的内存。然而,迭代是次优的。

    我尝试了boost::unordered_set并且性能比原来的方法差。据推测,因为作为哈希映射,它无法满足Point#2。

    第3点是相关的,因为我在延迟级别进行编码,其中内存分配的成本非常高。因此,具有连续分配的容器极不可能表现良好。

4 个答案:

答案 0 :(得分:5)

使用您的第一种方法来检测元素是否已经在集合中(哈希映射)。并把它放在一个迭代列表中..

答案 1 :(得分:2)

您可以使用链接的哈希集。 java中的LinkedHashSet。我不知道c ++中是否存在实现它的库,但这个想法很简单:有一个hash set主菜,让主菜也形成一个linked list

迭代在链表上,插入是从哈希集中进行的。请注意,此方法仅允许在其背面插入列表。

答案 2 :(得分:1)

试试Emde Boas tree。它可以满足您的目的:

  1. 插入O(log(log(n))),
  2. 迭代O(log(log(n))),
  3. 记忆......好吧,只需阅读提供的链接......

答案 3 :(得分:-1)

您可以通过添加链接列表来改进您的方法。

将有一个指向插入对象的指针(或任何适合的标识符)的链接列表。另外,在每个对象中留下布尔变量,以了解它是否已经插入到列表中。