我们使用双链接列表数据结构来存储一些无序数据(这样的数据是无序的,但是链接列表中的节点顺序是相关的)。对此数据结构的常见操作是NodeBeforeNode(节点N1,节点N2),在列表中给出两个节点指针,并确定哪一个在另一个之前。
此操作需要线性时间,因为它需要遍历列表以找到另一个元素,这非常慢。为了加快速度,我们缓存了节点本身内每个节点的序号,并根据需要刷新了这个缓存。但是,刷新缓存是线性的,并且可选地修改列表并访问此缓存的操作往往非常慢。
我正在寻找加快此行为的建议。我基本上需要一个数据结构,它允许在常数或对数时间内执行以下所有操作:
任何人都可以建议支持相同的链接列表结构吗?
谢谢!
答案 0 :(得分:0)
实施修改后的二进制搜索树
struct node {
/*add your data*/
node *parent;
node *left;
node *right;
}
你可以通过父指针和插入来访问前一个元素,搜索和删除时间在O(logn)
答案 1 :(得分:0)
也许您应该考虑使用某种索引更新节点?插入和删除节点肯定是线索,该列表应该是链表实现。我建议在节点中添加新变量来表示它在列表中的位置。
基本上是这样的:
这当然只有在两个节点位于同一列表中时才有效。比较它们将是简单的指数比较。
请注意,该索引应为浮点数。这个简单的场景假设,有无限可分。如果您的程序运行时间很长,可能会运行一些与索引值相乘的定期工作程序吗?