【问题标题】:Problem in understanding XOR linked list理解异或链表的问题
【发布时间】:2009-10-26 14:42:46
【问题描述】:

我正在阅读XOR linked list(来自维基百科)。但我在理解它时遇到了一些问题。

我没有得到以下段落。

要从某个点开始沿任一方向遍历列表,您需要两个连续项目的地址,而不仅仅是一个。如果两个连续项目的地址颠倒,你最终会以相反的方向遍历列表。

我有几个问题:

  1. 它(XOR 链表本身)实际上是如何工作的?

    (如果您通过举一些例子来证明您的答案是正确的,那就太好了。即 通过获取一些地址,然后 做一些相应的计算。)

  2. 如何实现它?关于实施的简要想法。

  3. 实际上它在哪里或可以在哪里使用?看起来真的很有帮助吗?

【问题讨论】:

  • 应该也适用于加法,虽然这样虐待指针是很恶心的。

标签: data-structures linked-list xor-linkedlist


【解决方案1】:
  1. 上述过程的工作原理是将下一个和前一个元素的地址存储在一个字段中(我们称之为 A)。因此,要获取列表中下一个元素的值,您需要获取另一个元素的地址(这就是为什么您需要两个...称为 B)。要查找下一个元素的地址,只需 A XOR B 即可得到 C(下一个元素的位置)。

  2. 取决于您使用的语言。用你使用的任何语言研究按位运算,你应该能够很快弄清楚。

  3. 它可以在任何使用双链表的地方使用(异或链表会节省内存)。需要注意的是,您必须有两个连续的列表元素才能遍历这些元素。

【讨论】:

    【解决方案2】:

    3。 这种链表现在不太实用。它的主要好处是节省内存,这通常既便宜又丰富。您链接到的维基百科文章非常清楚地说明了缺点:

    这种形式的链表可能是 不建议:

    • 通用调试工具无法遵循异或链,调试更加困难;
    • 内存使用量减少的代价是代码复杂性增加,维护成本更高;
    • 大多数垃圾回收方案不适用于不包含文字指针的数据结构;
    • 在某些上下文(例如 C 语言)中未定义指针的 XOR,尽管许多语言提供了指针和整数之间的某种类型转换;
    • 如果不遍历列表,则指针将不可读 - 例如,如果指向列表项的指针包含在另一个数据结构中;
    • 在遍历列表时,您需要记住之前访问的节点的地址,以便计算下一个节点的地址。

    计算机系统越来越 廉价而丰富的内存,以及 存储开销通常不是 专业以外的首要问题 嵌入式系统。还在哪里 希望减少一个开销 链表,展开提供了更多 实用的方法(以及其他 优点,例如增加缓存 性能和超速随机 访问)。

    【讨论】:

    • 不要忘记,并不是每个人都在为 PC 编写代码。嵌入式系统仍然存在内存限制,可以/必须使用这种方法(取决于施加的限制)。
    • 确实在某些情况下它可能有用。如果你看看我引用的最后一段,它特别提到了这一点。 “......存储开销通常不是专门的嵌入式系统之外的首要问题......”
    • 另外,尽管它只在某些情况下使用,但我仍然认为这是一个非常聪明的想法。
    猜你喜欢
    • 1970-01-01
    • 2022-11-02
    • 2014-08-06
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    相关资源
    最近更新 更多