【问题标题】:Purpose of Xor Linked List?异或链表的目的?
【发布时间】:2014-05-02 18:11:51
【问题描述】:
我偶然发现了一篇关于 Xor linked list 的 Wikipedia 文章,这是一个有趣的琐事,但文章似乎暗示它偶尔会在实际代码中使用。我很好奇它有什么好处,因为我不明白为什么即使在内存/缓存严重受限的系统中它也有意义:
- 常规双向链表的主要优点是能够从列表中间插入或删除元素,只需一个指向要删除/插入的节点的指针即可。异或链表无法做到这一点。
- 如果在迭代过程中想要 O(1) 前置或 O(1) 插入/删除,那么单链表就足够了,并且避免了很多代码复杂性和与垃圾收集、调试工具等有关的警告。李>
- 如果不需要 O(1) 前置/插入/删除,那么使用数组可能在空间和时间上都更有效。即使在迭代时只需要有效的插入/删除,数组也可以很好,因为插入/删除可以在迭代时完成。
鉴于上述情况,有什么意义?是否有任何奇怪的极端情况表明异或链表实际上是值得的?
【问题讨论】:
标签:
performance
memory
data-structures
xor
low-level
【解决方案1】:
除了节省内存之外,它还允许 O(1) 反转,同时仍然有效地支持所有其他破坏性更新操作,例如
-
concat在 O(1) 中破坏性地使用两个列表
-
insertAfter/insertBefore 在 O(1) 中,当您只有对节点及其后继/前任的引用时(与标准双向链表略有不同)
-
remove 在 O(1) 中,还引用了继任者或前任者。
我不认为内存方面真的很重要,因为对于大多数可能使用 XOR 列表的场景,您可以改用单链表。
【解决方案2】:
它的目的是(或更准确地说曾经)只是为了节省内存。
使用异或链表,你可以做任何你可以用普通的双向链表做的事情。唯一的区别是,每次需要时,您都必须从每个节点的异或指针中解码 previous 和 next 内存地址。
【解决方案3】:
这是关于节省内存。我有一种情况,我的数据结构是 40 字节。内存管理器在 16 字节边界上对齐,所以每次分配是 48 字节;尽管我只需要 40 个字节。通过使用异或链表,我能够消除 8 个字节并将我的数据结构大小降低到 32 个字节。现在,我可以同时在 64 字节管道缓存中容纳 2 个节点。因此,我能够减少内存使用并提高性能。