【问题标题】:Unrolled linked list arrays vs. nodes展开的链表数组与节点
【发布时间】:2016-11-19 18:17:09
【问题描述】:

我正在阅读有关展开链表的信息,并找到了两种不同的制作方法。我拥有的这本书实现了这样的一个:

// Node
typedef struct node {
    int data;
    struct node *next;
} Node;

// Block of nodes
typedef struct linkedblock {
    struct linkedblock *next;
    Node *head;
    int nodeCount;
} LinkedBlock;

然而 Wikipedia 显示 LinkedBlock 没有指向 Node 的指针,而是有一个数组。我认为这可能是因为内存是连续的并且与缓存效率有关?这样做还有其他好处吗?我的书实现它的方式是否优化/更差?是否有一种常见或首选的方式?

我正在尝试实现一个展开的链表,这样我就可以了解它们的工作原理,但也以防我将来需要使用它(奇怪的是,我在 GitHub 或其他地方找不到任何 C 实现)。基本上我想知道这两种方式中哪一种更有可能在实际应用中使用。这也是我不应该浪费太多时间学习的数据结构吗?因为在我的其他算法书籍 (CLRS) 中,我什至没有看到它提到过。

【问题讨论】:

  • 似乎是其中一个在理论上看起来不错的想法,但在实践中却是一个痛苦的......您找不到任何实现这一事实很好地表明展开列表没有实际价值。
  • “展开链表”是指“侵入式链表”吗?因为如果是这样,这样的列表肯定确实具有实用价值。
  • 我没听说过“插入式链表”,我的书叫它“展开链表”。不知道这些是否相同。在我的书中,它看起来像是一个大块的链接列表,每个块中都有较小的节点。我想如果它不是我将来最终会使用的东西,我会略过它并继续前进,而不是花一天的剩余时间来尝试实现它。

标签: c data-structures linked-list unroll


【解决方案1】:

这本书的实现似乎用处不大,因为它实际上比标准链表(存储那些LinkedBlock 结构)使用更多 内存。 展开链表的主要优点之一是与普通链表相比,您可以在每个节点存储更多数据。这是数组和链表之间的平衡,数组只使用一个整数的额外空间来存储大小(空间效率),链表在给定指向某些数据的指针的情况下具有高效的插入和删除(时间效率)。

至于了解它们的价值:它们具有与普通链表相似的算法属性。制作展开链表的大部分好处是,如果您有一个需要加速或使用过多内存的现有应用程序,因为它们将具有与常规链表相同的接口。如果您了解了渐近分析(在 CLRS 中也进行了讨论),那么您可能会认识到展开链表的内存使用和时间效率仅相差一个常数因子,因此渐近地说,它们是相同的。

我的建议是:请注意它们的存在,并且它们可以提高实际应用程序的性能,但除非您有一个特定的应用程序要尝试加速,否则不要太担心它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多