展开的链表列表与节点

时间:2016-07-16 19:16:26

标签: c data-structures linked-list unroll

我正在阅读有关展开的链接列表,并找到了两种不同的方法。我已经实现了这样一本书:

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

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

然而,维基百科显示,LinkedBlock不是Node指向ForContext,而是有一个数组。我认为这可能是内存是连续的,有关缓存效率的东西?这样做有其他好处吗?我的书实现它的方式不那么优化/更糟吗?是否碰巧有共同或偏好的方式?

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

1 个答案:

答案 0 :(得分:3)

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

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

我的建议是:要知道它们存在并且它们可以提高实际应用程序的性能,但除非你有一个特定的应用程序试图加速,否则不要过多担心它们。