Indexing 具有快速节点顺序查询的链表

Indexing 具有快速节点顺序查询的链表,indexing,linked-list,Indexing,Linked List,我们使用双链表数据结构来存储一些无序的数据,这些数据本身是无序的,但是链接列表中的节点顺序是相关的。此数据结构上的一个常见操作是NodeBeforeNodeNodeNodeNodeNodeNode N1,Node N2,它在列表中有两个节点指针,并确定其中哪个在另一个之前 这个操作需要线性时间,因为它需要遍历列表来找到另一个元素,这相当慢。为了加快速度,我们缓存了节点本身中每个节点的序号,并根据需要刷新了该缓存。但是,刷新缓存是线性的,修改列表和访问此缓存的操作往往非常缓慢 我正在寻找加快这种行

我们使用双链表数据结构来存储一些无序的数据,这些数据本身是无序的,但是链接列表中的节点顺序是相关的。此数据结构上的一个常见操作是NodeBeforeNodeNodeNodeNodeNodeNode N1,Node N2,它在列表中有两个节点指针,并确定其中哪个在另一个之前

这个操作需要线性时间,因为它需要遍历列表来找到另一个元素,这相当慢。为了加快速度,我们缓存了节点本身中每个节点的序号,并根据需要刷新了该缓存。但是,刷新缓存是线性的,修改列表和访问此缓存的操作往往非常缓慢

我正在寻找加快这种行为的建议。我基本上需要一个数据结构,它允许在常量或对数时间内执行以下所有操作:

在节点之后或之前插入 删除节点 节点前节点 有人能推荐一个类似链表的结构来支持同样的功能吗


谢谢

实现一个修改的二叉搜索树

struct node {
   /*add your data*/
   node *parent;
   node *left;
   node *right;
}

您可以通过父指针访问前一个元素,插入、搜索和删除时间在Ologn

也许您应该考虑用某种索引更新节点?节点的插入和删除是确定的线索,该列表应该是linkedlist实现。我建议将新变量添加到表示其在列表中位置的节点中

所以基本上:

插入到末尾的每个新项都应具有index=last_index+CONST 插入到列表中的每个新项都应具有索引=相邻项的算术平均值 当然,只有当给定的两个节点在同一个列表上时,这才有效。比较它们将是简单的索引比较


请注意,索引应该是浮点数。这个简单的场景假设有无限可分割的。如果您的程序将运行很长时间,那么可能应该运行一些定期的工作程序,使索引值相乘?

谢谢Mathew!我评估了很多方法,我认为你的方法效果最好。谢谢。这就是我最初尝试的——根据顺序编号,用下一个和上一个指针创建一个AVL树。它确实工作得很好,但插入元素列表或删除N个元素的成本太高。