Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 保存列表的良好数据结构_Algorithm_List_Binary Search Tree - Fatal编程技术网

Algorithm 保存列表的良好数据结构

Algorithm 保存列表的良好数据结构,algorithm,list,binary-search-tree,Algorithm,List,Binary Search Tree,我需要有一个保存有序列表的数据结构。我需要一个insert,一个delete操作,以及一个getPosition操作 getPosition操作经常在后续元素上调用,例如,我有以下列表: [a0, a1, …, ak, ak', …, an] 我经常需要得到ak的索引,然后是ak的索引 我在想,一个类似于splay树的算法,但也可以移动访问元素的邻居,可能是有效的,但我找不到任何参考。你有什么建议吗 编辑: 我还需要一个快速插入+删除。O(log(n))中的某些内容就足够了。一个解决方案,但不

我需要有一个保存有序列表的数据结构。我需要一个insert,一个delete操作,以及一个getPosition操作

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

[a0, a1, …, ak, ak', …, an]
我经常需要得到ak的索引,然后是ak的索引

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

编辑: 我还需要一个快速插入+删除。O(log(n))中的某些内容就足够了。

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

由于
getPosition
操作被称为“频繁”,我认为您的节点应该如下所示:

struct node {
    int key;
    int index;
    node *next;
    node *last;
}
每次添加或删除节点时,都会运行列表的其余部分并更新索引

更好的解决方案:

您可以使用一个树结构,其中所有节点都保存在叶节点中,每个根都保存其下的叶数
Insert
Delete
getposition
应该是
O(logn)

一个如何?这应该允许您保持一个有序列表,并为插入、删除和搜索提供O(平均)性能


就优化元素
k+1
的搜索而言,可能只需缓存上次搜索的索引,然后从那里开始搜索。

一旦找到
ak
的位置,就找到了
ak'
,否?是,但在选中
ak
位置后,可能发生了插入或删除,因此,以前计算的位置可能不再相关。请查看linux进程调度器。有一个很适合你的条件。它用于CFS(完全公平调度程序)。它使用RBTree,但是,有一个额外的双链表,以遍历顺序将所有节点链接在一起。这种冗余可以将后续操作和前置操作减少到
O(1)
,同时保持delete和insert
O(lg n)
。是的,但这意味着插入和删除在O(n)中运行,n是我列表的长度,而二叉树会给我O(log(n)),但速度较慢。我正在更新这个问题,以强调快速插入和删除的必要性。索引有什么帮助?我完全同意,您仍然需要迭代所有节点以获得更好的解决方案,但您是否有任何建议可以从最近访问的leaf的邻居不久后被访问这一事实中获益?是的。找到他们的生命周期评价,这将使它(而不是渐进地)更好。最坏的情况是,他们的生命周期评价是根本,这将是无用的。此外,每个节点都可以持有指向其邻居的指针,然后如果您在
ak
之后立即获得
ak'
,您可以检查它是否是您刚才检索到的最后一个节点的邻居,并且您知道该位置与之前的位置是+1