【发布时间】:2022-01-17 01:50:35
【问题描述】:
我正在使用 Python 学习数据结构和算法。我了解到链表的优点是它没有最大节点数,不像其他语言中的数组。
-
由于 Python 会自动为我们调整列表大小,因此优势已被我们抽象掉。
-
因此,我一直认为链表的唯一优势是在链表的前面或后面添加一个节点是 O(1),而向列表添加一个元素最终可能是 O( n) 来自 Python,必须调整数组大小并复制每个元素。
但是,我刚刚了解到摊销时间复杂度在今天是一个问题,附加到列表需要摊销 O(1)。因此,将元素添加到列表实际上比将节点添加到链表中要快,因为在链表的前/后以外的任何位置添加节点需要 O(n) 时间复杂度。
那么,在数组/列表上使用链表有什么意义呢?
【问题讨论】:
-
您并不总是希望追加到列表的末尾。对于涉及在任意点插入或移动项目(例如,将项目从末尾拉出并将其移动到开头)的任务,链表是 O(1),而数组是 O(n)。不同的数据结构在不同的情况下各有优缺点。请注意,这绝不是 Python 特有的!
-
一般来说,现在很少使用链接列表。现代处理器使用多少缓存和预读,内存局部性非常重要。缓存未命中和页面错误非常昂贵。具有非连续访问模式的链表在实践中表现不佳,即使在纸面上它们的 O(1) 操作应该比数组的 O(n) 更快。
-
链表有有个用例,但它们比动态数组的用例少得多。
-
作为从业者,你从来没有在实践中使用过 Python 中的链表。理解链表作为一个概念的意义在于,如果您使用不同的非 Python 语言编写代码,您可以识别和使用它们。
-
@CharlesDuffy deques use linked lists,你是说在实践中不使用双端队列吗?
标签: python arrays list data-structures linked-list