【问题标题】:How unrolled linked list works展开链表的工作原理
【发布时间】:2013-05-03 19:24:11
【问题描述】:

谁能解释一下什么是展开链表。据我所知,它是一个链表,其中每个节点都有元素数组。当然,这使搜索更快。

在这张图中,添加那张图中的数据 1,2,3 是清楚的,没有复杂性……但是为什么他们在第二个节点中添加了 4?为什么不在第一个节点的第四个元素中?这样做有什么好处?而他们在那里分裂的策略是什么?

【问题讨论】:

    标签: linked-list


    【解决方案1】:

    好处是,他们可以在之后插入数据,而无需移动列表中的每个项目。是否要分段也取决于您。您可以使添加功能检查最后一个节点是否已满 3/4,并在这种情况下创建一个新节点。或者他们可能做了什么:

    如果数组已经满了,我们首先在当前节点之前或之后插入一个新节点,并将当前节点中的一半元素移动到其中。 (http://en.wikipedia.org/wiki/Unrolled_linked_list)

    【讨论】:

    • 非常感谢....但是它在缓存内存中有什么用处?我们将使用缓存来快速检索权利!!! den 这种快速插入会有什么帮助????
    • 理论上,展开链表比“普通”链表更快,因为后者的节点可能在内存中更加碎片化,从而导致处理器加载更多内存页面。此外,展开的链表更小,因为它们不需要为每个节点存储指针。实际上,当您只想在列表中存储小对象或指针/引用时,请考虑使用动态数组(向量),因为它是迄今为止最有效的容器,请参阅:stackoverflow.com/questions/9764452/…
    • 非常感谢 :) :) 真的很有帮助 :)
    【解决方案2】:

    数字 4 被添加到第一个节点的第 4 个元素。添加 5 后,它会拆分该节点,其中 1、2、3 位于节点 1 中,4、5 位于节点 2 中。

    【讨论】:

    • 但是朋友,为什么留下空白空间?目标是什么...好的,根据 philip dahen,插入数据时会更快。但是它将如何在缓存中发挥作用。
    【解决方案3】:

    假设你现在的元素不超过'n'(当然你可以在以后添加元素)并且你想创建一个链表,就缓存性能而言,最好的方法是选择Unrolledlinked list .您在 n 上创建一个大小为 ceil 平方根的块,然后如果其大小小于 n 的平方根的 ceil,则开始在块中添加元素。因此,您最终在 n 个块上获得了平方根的地板。这对于搜索链表中的第 k 个节点很有用,因为它的复杂性现在已从 n 降低到 n 的平方根。

    当块已满时,意味着如果该块包含等于 n 个元素的平方根,您必须进行移位操作,使得该块中的尾部成为下一个块的头部和下一个块的尾部成为其下一个的头部,依此类推,直到你命中 NULL

    在每个块中,维护的是循环链表,而不是简单的链表。

    希望这会有所帮助.. :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 2011-11-11
      相关资源
      最近更新 更多