【问题标题】:Linked List with fast node order querying具有快速节点顺序查询的链表
【发布时间】:2011-09-02 07:19:55
【问题描述】:

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

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

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

  1. 插入(在节点之后或之前)
  2. 删除一个节点
  3. NodeBeforeNode

谁能推荐一个类似链表的结构来支持相同的结构?

谢谢!

【问题讨论】:

    标签: indexing linked-list


    【解决方案1】:

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

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

    可以通过父指针访问前一个元素,插入、查找、删除时间为O(logn)

    【讨论】:

    • 谢谢。这就是我最初尝试的 - 根据顺序编号制作一个带有下一个和上一个指针的 AVL 树。它确实工作得很好,但是插入一个元素列表或删除 N 个元素被证明成本太高。
    【解决方案2】:

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

    所以基本上:

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

    这当然只有在给定两个节点在同一个列表中时才有效。比较它们将是简单的索引比较。

    请注意,该索引应该是浮点数。这个简单的场景假设,有无限可分。如果您的程序要运行很长时间,也许应该运行一些将索引值相乘的周期性工作人员?

    【讨论】:

    • 谢谢马修!我评估了很多方法,我认为你的方法效果最好。
    猜你喜欢
    • 2016-12-09
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    相关资源
    最近更新 更多