Xor链接列表的目的?

时间:2014-05-02 18:11:52

标签: performance memory data-structures xor low-level

我偶然发现了一篇关于Xor linked list的维基百科文章,这是一个有趣的琐事,但这篇文章似乎暗示偶尔会在实际代码中使用它。我很好奇它有什么好处,因为我不明白为什么即使在严重的内存/缓存约束系统中它也有意义:

  • 常规双向链表的主要优点是能够在列表中间插入或删除元素,只有指向要删除/插入的节点的指针。使用xor链接列表无法做到这一点。
  • 如果在迭代时想要O(1)prepending或O(1)插入/删除,那么单链表就足够了,避免了很多代码复杂性和垃圾收集,调试工具等方面的警告。
  • 如果不需要O(1)前置/插入/移除,那么使用阵列可能在空间和时间上都更有效。即使在迭代时只需要有效的插入/移除,数组也可以很好,因为插入/移除可以在迭代时完成。

鉴于上述情况,重点是什么?是否有任何奇怪的角落案例,其中xor链表实际上是值得的?

3 个答案:

答案 0 :(得分:4)

除了节省内存外,它还允许O(1)反转,同时仍能有效地支持所有其他破坏性更新操作,例如

  • {{1}在O(1)
  • 中破坏性地列出两个列表 O(1)中的
  • concat / insertAfter,当您只有对节点及其后继/前任(与标准双向链表略有不同)的引用时
  • O(1)中的
  • insertBefore,也提到了后继者或前任者。

我不认为内存方面非常重要,因为对于您可能使用XOR列表的大多数情况,您可以使用单链接列表。

答案 1 :(得分:1)

其目的是(或者更确切地说 )只是为了节省内存。

使用xor-linked-list,您可以使用普通的双向链表执行任何操作。唯一的区别是每次需要时,必须从每个节点的xor-ed指针解码previousnext内存地址。

答案 2 :(得分:1)

这是关于节省内存。我的数据结构是40个字节。内存管理器在16字节边界上对齐事物,因此每个分配为48字节;无论我只需要40个字节,都是事实。通过使用xor链表,我能够消除8个字节并将数据结构大小减小到32个字节。现在,我可以同时在64字节管道缓存中容纳2个节点。因此,我能够减少内存使用并提高性能。