我正在寻找符合以下条件的数据结构(或数据结构组合)的C ++实现:
O(log(n))
复杂性O(log(n))
复杂度O(log(n))
复杂度提前感谢您提出任何建议
DALIBOR
(编辑)答案:
我选择的答案描述了满足所有这些要求的数据结构。但是,正如Maxim Yegorushkin所建议的那样,boost :: multi_index提供的功能非常接近上述功能。
(编辑)未正确指定某些要求。它们根据更正(:原创)
进行修改(编辑)我发现了接受的答案中描述的数据结构的实现。到目前为止,它按预期工作。它被称为counter tree
(编辑)考虑使用sp2danny建议的AVL-Array
答案 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_tree
和std::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,其每个节点的大小值约为子树中的节点数量。通过检查树的左/右子的大小,我们可以随机快速访问节点。