【发布时间】:2020-11-28 10:30:56
【问题描述】:
我正在寻找一种可以存储元素列表的数据结构,同时还支持 sub-O(n) 查找给定元素的索引和给定索引的元素,以及在索引处插入。
元素密集(整数0..n)且唯一,但未排序。
例如,在 Rust 中,这个数据结构会这样使用:
fn main() {
let mut list = List::new();
list.extend(vec![5, 2, 0, 4, 1, 3]);
assert_eq!(list.get(2), 0);
assert_eq!(list.get(3), 4);
assert_eq!(list.index_of(0), 2);
assert_eq!(list.index_of(4), 3);
}
O(√n) 操作是可以接受的,O(log n) 是理想的。我在这里画一个空白;非常感谢任何帮助!
【问题讨论】:
-
这能回答你的问题吗? List as O(log(n))
-
@Stargateur 我发现github.com/masyamandev/indexable-set 实现了这一点。
-
@Stargateur 不,AVL 树仅根据索引进行排序,因此它确实也是元素的索引列表。因此,按索引搜索、插入和删除是 O(log n)。聪明的一点是找到一个元素的索引,为此使用了一个单独的哈希映射。 OP是正确的。
-
@Max 这是一个很好的问题,你在 github 上找到的答案是最有趣的。请考虑自己添加一个带有数据结构描述的答案,以防链接在某个时候过期。
-
@Stargateur 我检查了它,它似乎有效。我自己不会认为这是可能的,但它实际上非常简单和聪明。当然,具有 O(log n) 操作的 AVL 树在实践中比具有 O(n) 操作的简单列表的实际大 n 更有效。哈希映射根本不支持所需的操作。我确实希望 OP 自己回答这个问题!
标签: vector indexing data-structures rust time-complexity