用于保存列表的良好数据结构

时间:2015-06-30 14:15:09

标签: algorithm list binary-search-tree

我需要一个包含有序列表的数据结构。我需要插入,删除操作以及getPosition操作。

经常在连续元素上调用getPosition操作,例如我有列表:

[a0, a1, …, ak, ak', …, an]

我经常需要获得ak的索引,然后是ak'的索引。

我在想一个类似于splay树的算法,但是移动被访问元素的邻居也是有效的,但是我找不到任何引用。你有什么建议吗?

编辑: 我还需要快速插入+删除。 O(log(n))中的东西就足够了。

2 个答案:

答案 0 :(得分:1)

解决方案,但不是很好的解决方案:

由于getPosition操作被“频繁”调用,我认为你的节点应该是这样的:

struct node {
    int key;
    int index;
    node *next;
    node *last;
}

每次添加或删除节点时,都会在列表的其余部分上运行并更新索引。

更好的解决方案:

您可以使用树结构,其中所有节点都保存在叶节点中,每个根保存其下的叶子数。 InsertDeletegetPostion应为O(log n)

答案 1 :(得分:1)

Skip List怎么样?这应该允许您保留一个有序列表,并为插入,删除和搜索提供O(log n)性能(平均)。

在优化搜索元素k+1方面,可能只是缓存最后搜索到的索引并从那里开始搜索。