Warm tip: This article is reproduced from serverfault.com, please click

vector-带有O(log n)indexOf操作的列表

(vector - List with O(log n) indexOf operation)

发布于 2020-11-28 10:30:56

我正在寻找一种可以存储元素列表的数据结构,同时还允许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)将是理想的。我在这里画一个空白。任何帮助,不胜感激!

Questioner
Max
Viewed
0
16.7k 2020-12-01 19:33:54

这个库提供了一个“ IndexedTreeListSet”数据结构,该结构实现了所需的三个操作O(log n)

  • 查找索引->元素
  • 查找元素->索引(也称为索引)
  • 在索引处插入元素

它这样做,因为莫B.笔记,用ancilliary散列映射到映射的树中,然后将其向上遍历到根元素它们的节点。由于树中的每个节点都包含其相对索引,因此可以在根目录计算绝对索引。

我从单纯的方法(使用O(n)插入)切换到了这种方法,并将插入(每秒发生约100次)的墙执行时间从〜100ms减少到了〜1ms。