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

Looking for special C++ data structure

本文关键字:c++ 数据结构 寻找      更新时间:2023-10-16

我正在寻找一个符合以下标准的数据结构(或数据结构的组合)的c++实现:

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

提前感谢您的建议

Dalibor

(编辑)答案:

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

(编辑)一些需求没有正确指定。根据更正(:original)

进行修改

(编辑)我已经找到了在公认的答案中描述的数据结构的实现。到目前为止,它像预期的那样工作。它叫做计数器树

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

根据您的需求,boost::multi_index具有两个索引。

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

让我们来看看这些…

  • 平均项目查找时间在最坏的情况下为O(log(n))复杂度
  • 项的删除/插入不会使先前获得的迭代器失效
  • 提供最多0 (log(n))复杂度的物品插入和移除

这简直就是"树"。

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

我假设您提供的随机访问迭代器的索引是按插入顺序排列的,因此[0]将是容器中最古老的元素,[1]将是下一个最古老的元素,等等。这意味着,在删除时,为了使迭代器有效,迭代器内部不能存储索引,因为它可以在没有通知的情况下更改。因此,仅使用map键作为插入顺序是行不通的。

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

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

AVL-Array应该符合要求。

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

容器头仅为c++库,并具有与其他c++容器(如list和vector)相同的迭代器和函数。

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