寻找特殊的C ++数据结构

时间:2011-08-10 12:13:08

标签: c++ data-structures iterator complexity-theory

我正在寻找符合以下条件的数据结构(或数据结构组合)的C ++实现:

  • 以与std :: vector
  • 相同的方式访问项目
  • 提供随机访问迭代器(以及迭代器比较<,>)
  • 平均商品访问(:查询)时间最差O(log(n))复杂性
  • 项目按照与添加到容器中相同的顺序进行迭代
  • 给定一个迭代器,我可以找出容器中指向的项的序数位置,最差O(log(n))复杂度
  • 提供项目插入和移除在特定位置最差O(log(n))复杂度
  • 删除/插入项目不会使先前获得的迭代器无效

提前感谢您提出任何建议

DALIBOR

(编辑)答案:

我选择的答案描述了满足所有这些要求的数据结构。但是,正如Maxim Yegorushkin所建议的那样,boost :: multi_index提供的功能非常接近上述功能。

(编辑)未正确指定某些要求。它们根据更正(:原创)

进行修改

(编辑)我发现了接受的答案中描述的数据结构的实现。到目前为止,它按预期工作。它被称为counter tree

(编辑)考虑使用sp2danny建议的AVL-Array

5 个答案:

答案 0 :(得分:4)

根据您的要求boost::multi_index有两个索引就可以了。

第一个索引是ordered index。它允许O(log(n))插入/查找/删除。第二个索引是random access index。它允许随机访问,元素按插入顺序存储。对于这两个索引,当删除其他元素时,迭代器不会失效。从一个迭代器转换到另一个迭代器是O(1)操作。

答案 1 :(得分:3)

让我们来看看......

  
      
  • 平均项目查找时间最差为O(log(n))复杂度
  •   
  • 删除/插入项目不会使先前获得的迭代器无效
  •   
  • 提供项目插入和删除最坏的O(log(n))复杂度
  •   

几乎尖叫着“树”。

  
      
  • 提供随机访问迭代器(以及迭代器比较<,>)
  •   
  • 给定一个迭代器,我可以找出容器中指向的项的序数位置,最差的是O(log(n))复杂度
  •   
  • 项目按照与添加到容器中相同的顺序进行迭代
  •   

我假设您提供随机访问迭代器的索引是按插入顺序排列的,因此[0]将是容器中最旧的元素,[1]将是下一个最旧的元素这意味着,在删除时,迭代器有效,迭代器内部无法存储索引,因为它可能会更改,恕不另行通知。因此,只使用map并且密钥是插入顺序不起作用。

鉴于此,除了通常的成员之外,树的每个节点都需要跟踪每个子树中有多少元素。这将允许O(log(N))时间的随机访问。我不知道一组现成的代码,但是std::rb_treestd::rb_node的子类化将是我的起点。

答案 2 :(得分:0)

请参阅此处:STL Containers(向下滚动页面以查看有关算法复杂性的信息),我认为std::deque符合您的要求。

答案 3 :(得分:0)

AVL-Array应符合该法案。

答案 4 :(得分:0)

这是符合要求的“lv”容器,O(log n)插入/删除/访问时间。    https://github.com/xhawk18/lv

容器只是标头C ++库, 并且与其他C ++容器具有相同的迭代器和函数,例如list和vector。

“lv”容器基于rb-tree,其每个节点的大小值约为子树中的节点数量。通过检查树的左/右子的大小,我们可以随机快速访问节点。