寻找特殊的c++数据结构
Looking for special C++ data structure
我正在寻找一个符合以下标准的数据结构(或数据结构的组合)的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_tree
和std::rb_node
将是我的起点。
请参阅这里:STL容器(向下滚动页面以查看有关算法复杂性的信息),我认为std::deque
符合您的要求。
AVL-Array应该符合要求。
这是我的"lv"容器符合要求,O(log n)插入/删除/访问时间。https://github.com/xhawk18/lv
容器头仅为c++库,并具有与其他c++容器(如list和vector)相同的迭代器和函数。
"lv"容器基于rb-tree,其每个节点的大小值与子树中节点的数量有关。通过检查树的左/右子节点的大小,我们可以快速随机访问节点
- 链表,反向函数,数据结构
- 如何使用set实现无序数据结构?
- 我们可以将数据永久保存为数据结构吗?
- C++中的可变长度数组/数据结构
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 通过 NIF 从C++返回自定义数据结构
- 编译器上的策略数据结构不起作用
- 尝试构建"lock-free"数据结构C++
- 设计将引用元素移动到开头的数据结构.C++
- 在学习数据结构之前对STL有一个了解是好的吗?
- 如何解析表示树状数据结构的字符串
- 我对数据结构、双向链表有一些问题
- googletest:测试太大的数据结构
- C++中deque数据结构的大O是什么?
- 我可以使用哪种数据结构来处理这种方式
- 将文本文件解析为树状数据结构
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 哪些存储了不完整类型的 STL 数据结构可以用作类成员?
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- 带参数的数据结构的全局声明