良好的数据结构来保存列表
Good data structure to hold a list
我需要一个包含有序列表的数据结构。我需要有一个插入,一个删除操作,以及一个getPosition操作。
getPosition 操作经常在连续元素上调用,例如我有列表:
[a0, a1, …, ak, ak', …, an]
我经常需要获取 ak
的索引,然后是 ak'
的索引。
我在想一个类似于splay树的算法,但它也会移动被访问元素的邻居可能是有效的,但我找不到任何参考。你有什么建议吗?
编辑:
我还需要快速插入+删除。 O(log(n)) 中的东西就足够了。
一个解决方案,但不是很好:
由于 getPosition
操作被调用 "frequently",我认为您的节点应该如下所示:
struct node {
int key;
int index;
node *next;
node *last;
}
并且每次添加或删除节点时,您都会 运行 遍历列表的其余部分并更新索引。
更好的解决方案:
您可以使用一个树结构,其中所有节点都保存在叶节点中,每个根保存其下的叶数。 Insert
、Delete
和 getPostion
应该是 O(log n)
。
Skip List 怎么样?这应该允许您保持有序列表并为您提供 O(log n) 的插入、删除和搜索性能(平均)。
在优化搜索元素 k+1
方面,也许只是缓存最后搜索的索引并从那里开始搜索。
我需要一个包含有序列表的数据结构。我需要有一个插入,一个删除操作,以及一个getPosition操作。
getPosition 操作经常在连续元素上调用,例如我有列表:
[a0, a1, …, ak, ak', …, an]
我经常需要获取 ak
的索引,然后是 ak'
的索引。
我在想一个类似于splay树的算法,但它也会移动被访问元素的邻居可能是有效的,但我找不到任何参考。你有什么建议吗?
编辑: 我还需要快速插入+删除。 O(log(n)) 中的东西就足够了。
一个解决方案,但不是很好:
由于 getPosition
操作被调用 "frequently",我认为您的节点应该如下所示:
struct node {
int key;
int index;
node *next;
node *last;
}
并且每次添加或删除节点时,您都会 运行 遍历列表的其余部分并更新索引。
更好的解决方案:
您可以使用一个树结构,其中所有节点都保存在叶节点中,每个根保存其下的叶数。 Insert
、Delete
和 getPostion
应该是 O(log n)
。
Skip List 怎么样?这应该允许您保持有序列表并为您提供 O(log n) 的插入、删除和搜索性能(平均)。
在优化搜索元素 k+1
方面,也许只是缓存最后搜索的索引并从那里开始搜索。