繁体   English   中英

STL喜欢具有O(1)性能的容器

[英]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所有复杂性保证的完整列表:
标准容器的复杂性保证是什么?

摘要:


  • 插入:没有容器保证O(1)用于通用插入。
    • 唯一具有genric插入保护的容器是:'Associative Container'。 这是O(ln(n))
  • 有容器提供有限的插入保证

    • 转发保证保证在O(1)的头部插入
    • 后序列保证在O(1)的尾部插入
  • 抹去

    • 关联容器保证O(1)擦除(如果你有一个迭代器)。
  • 抬头:

    • 如果你的意思是通过查找访问元素(因为没有容器有O(1)查找功能)。
    • 然后随机访问容器是唯一具有O(1)访问权限的容器

所以答案是基于容器类型。
这就是标准保证对于如何转换为真正的容器的定义:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM