【问题标题】: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】:

      它的目的是(或更准确地说曾经)只是为了节省内存。

      使用异或链表,你可以做任何你可以用普通的双向链表做的事情。唯一的区别是,每次需要时,您都必须从每个节点的异或指针中解码 previousnext 内存地址。

      【讨论】:

        【解决方案3】:

        这是关于节省内存。我有一种情况,我的数据结构是 40 字节。内存管理器在 16 字节边界上对齐,所以每次分配是 48 字节;尽管我只需要 40 个字节。通过使用异或链表,我能够消除 8 个字节并将我的数据结构大小降低到 32 个字节。现在,我可以同时在 64 字节管道缓存中容纳 2 个节点。因此,我能够减少内存使用并提高性能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-15
          • 1970-01-01
          • 2012-07-11
          • 2015-11-10
          • 1970-01-01
          • 2018-08-28
          • 1970-01-01
          相关资源
          最近更新 更多