【发布时间】:2017-07-17 02:02:46
【问题描述】:
我正在寻找一种存储元素数组并支持这些操作的数据结构:
- 访问给定索引处的元素
- 在给定索引处添加或删除元素(并因此移动以下元素)
数组在 O(1) 中执行第一个操作,但第二个操作需要 O(n),而链表则相反。是否存在中间数据结构?比如说,可以在 O(lg n) 或 O(n^epsilon) “最坏情况”时间内完成这两种操作的东西?
请注意,我不是要求平衡二叉搜索树。每次添加/删除新元素时,键(索引)都会更改和移动。例如,删除最小元素会将所有其他元素的索引减少 1。
【问题讨论】:
-
这个公式是不精确的。每个平衡的搜索树都将在 log n 时间内支持两者。如果您将键视为索引,则完成。 (但它不是影响您的任务中未考虑的迭代的元素数组;这就是您的问题开始不精确的地方)
-
@sascha 关键是元素没有顺序。唯一的顺序是通过添加或删除它们隐式创建的顺序。我会让它更精确。
-
还是太宽泛了。这是一个非常模糊的规范,很难使用。您仍然可以使平衡的搜索树工作。它不会更改以下索引的索引,但这并不重要,因为您的访问/迭代仍然表现得好像这会发生一样。您只需要使用一些不断增长的索引作为每个插入的键,并且可能保留一个键间隙计数器。 (你有朋友支持你的 cmets 吗?:-D)
-
一根绳子在叶子上用单个元素代替绳子就可以了
-
@harold 绳索中的重新平衡可能需要线性时间。 sgi.com/tech/stl/ropeimpl.html 再平衡的最坏情况成本在字符串中仍然是线性的。但是,观察到的行为是重新平衡通常会消耗一小部分运行时间。事实上,所有通过重复连接构建长度为 N 的绳索的自然方法都需要在 N 中线性的总时间。设计违反这一点的连接序列是可能的,但并不简单。
标签: data-structures linked-list