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

时间:2011-09-02 07:19:55

标签: indexing linked-list

我们使用双链接列表数据结构来存储一些无序数据(这样的数据是无序的,但是链接列表中的节点顺序是相关的)。对此数据结构的常见操作是NodeBeforeNode(节点N1,节点N2),在列表中给出两个节点指针,并确定哪一个在另一个之前。

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

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

  1. 插入(节点之前或之前)
  2. 删除节点
  3. NodeBeforeNode
  4. 任何人都可以建议支持相同的链接列表结构吗?

    谢谢!

2 个答案:

答案 0 :(得分:0)

实施修改后的二进制搜索树

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

你可以通过父指针和插入来访问前一个元素,搜索和删除时间在O(logn)

答案 1 :(得分:0)

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

基本上是这样的:

  • 插入到end的每个新项都应该有index = last_index + CONST
  • 插入到列表中的每个新项目都应具有index =邻居的算术平均值

这当然只有在两个节点位于同一列表中时才有效。比较它们将是简单的指数比较。

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