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