【问题标题】:Does a linked list have any value in a language which has dynamic arrays?链表在具有动态数组的语言中是否具有任何价值?
【发布时间】:2015-09-10 17:33:12
【问题描述】:

链表在具有动态数组的语言中是否具有任何值,例如 Python(当然,它具有列表数据结构)?

我目前理解 python 中的列表实际上只是一个静态数组,随着更多数据的插入,它会将自身重新定义为一个新数组(大小更大),将数据从旧数组复制到新数组(从而使其成为动态数组) )。这是正确的吗?

我也了解列表和链表在内存中存储数据的方式不同(列表以连续方式和链表以非连续方式存储),但这是否提供任何主要优势?

【问题讨论】:

    标签: python arrays linked-list dynamic-arrays


    【解决方案1】:

    是的,确实如此。从链表中删除一个链接是O(1),而动态数组是线性的。

    假设您要为 LRU 构建数据结构。通常,您将有一个用于“触摸”操作的哈希表,以及一个用于查看老化的序列数组。当访问一个项目时,哈希表会在序列中找到它,并将其移动到末尾。如果需要逐出某个项目,则使用序列中的第一个项目在哈希表中找到该项目,然后将其删除。

    在此示例中,使用链表进行序列操作意味着一切都在(预期的)O(1) 时间内工作。使用动态向量,一切都是线性的。链表仍有其用途。

    【讨论】:

    • @Veedrac 在有序字典中插入/删除真的是 O(1) 吗?我猜你会得到 O(lg(n)) - 差异可能很重要。另请注意,提到的有序字典是按插入顺序排序的,这意味着您只能在序列的一端插入。
    • @skyking 这是按插入时间排序的,而不是按值排序的。像大多数字典操作一样,它是摊销的 O(1)。它是连续内存的事实应该超过偶尔重新压缩的代价。
    • @Veedrac 还有其他首选链表的场景。有序字典在所有这些情况下都不能正常工作。
    • @skyking 当然可以,但是对于 LRU 队列,我会坚持使用字典。
    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多