[英]STL like container with O(1) performance
我找不到答案,但我很确定我不是第一个寻找答案的人。 有没有人知道/使用/看到像具有插入/擦除/查找的 O(1)复杂度的双向访问迭代器的STL容器 ?
谢谢。
插入,擦除和查找没有具有O(1)复杂度的抽象数据类型,它还提供了双向访问迭代器。
编辑:
对于任意大的域都是如此。 给定一个足够小的域,您可以使用数组和双向链表实现插入,擦除和查找的O(1)复杂度集和双向访问迭代器:
std::list::iterator array[MAX_VALUE];
std::list list;
初始化:
for (int i=0;i<MAX_VALUE;i++)
array[i] = list.end();
插入:
if (array[value] != list.end())
array[value] = list.insert(value);
删除:
if (array[value] != list.end()) {
array[value].erase();
array[value] = list.end();
}
抬头:
array[value] != list.end()
tr1的unordered_set
(也可用于boost)可能就是你要找的东西。 你没有指定你是否希望序列容器或没有,你没有指定要使用给Ø 什么 (1)查找(即向量具有O(1)索引查找,unordered_set上述已O(1)基于元素本身的平均案例查找。
关联数组(哈希表)具有O(1)
查找复杂性,而双向链表具有O(1)
双向迭代。
我在搞乱存储优化时所做的一个技巧是实现一个添加了O(1)[1]的链表,然后进行缓存操作,提供一个更快的O(n)查找结构[2]。 实际的缓存需要一些O(n)时间来构建,我没有专注于擦除。 所以我“欺骗了一下”并将工作推向了另一个操作。 但是如果你不需要进行大量的添加/删除,那么这不是一个糟糕的方法。
[1]存储结束指针并仅添加到结尾。 不需要遍历。
[2]我创建了一个动态数组[3]并搜索它。 由于数据没有排序,我无法在O(lg n)时间内对其进行binsearch。 虽然我想我可以对它进行排序。
[3]数组具有比列表更好的缓存性能。
可以在此处找到STL所有复杂性保证的完整列表:
标准容器的复杂性保证是什么?
摘要:
有容器提供有限的插入保证
抹去
抬头:
所以答案是基于容器类型。
这就是标准保证对于如何转换为真正的容器的定义:
std::vector: Sequence, Back Sequence, Forward/Reverse/Random Container
std::deque: Sequence, Front/Back Sequence, Forward/Reverse/Random Container
std::list: Sequence, Front/Back Seuqence, Forward/Reverse Container
std::set: Sorted/Simple/Unique Associative Container, Forward Container
std::map: Sorted/Pair/Unique Associative Container, Forward Container
std::multiset: Sorted/Simple/Multiple Associative Container, Forward Container
std::multimap: Sorted/Pair/Multiple Associative Container, Forward Container
实际上,使用数组(向量)并延迟插入和删除的成本可能就足够了。
通过将元素标记为已删除来删除元素,将元素插入到所需位置的bin中,并记住较大索引的偏移量。
插入和删除将在方便的时候进行O(1)加O(N)清理; 查找将是O(1)平均值,O(自上次清理以来的更改次数)最差情况。
你将无法将所有要求放入一个容器中......有些东西需要给予;)但是,这对你来说很有意思: http : //www.cplusplus.com/reference/stl/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.