【发布时间】:2018-10-22 22:58:56
【问题描述】:
许多编程语言都提供了内置的数据结构,尽管已知一些数据结构,例如 链表 很容易实现,因此,语言通常不将其作为内置的-在数据结构中。
一些语言,如C++ has(如std::list,双向链接)、as well as Java(如LinkedList<T>,双向链接)。
例如,Python 已经在其库中内置了多个数据结构,包括列表、元组、集合、字典(甚至不需要导入),以及来自 collections 库的数据结构。它没有内置的 LinkedList 数据结构,因为在 Python 中实现自己的 LinkedList 已经很容易了。
请注意,Python 列表的底层数据结构实际上是一个数组,正如"What is the underlying data structure for Python lists?" 中所回答的那样。此外,collections 中的 deque 是一个双端 queue,它应该缺少一些功能,因为它通常不支持在中间进行索引或插入(但是,自 3.5 起已添加索引功能,带有 index 和 insert,但在 Python 2 中不存在)。
似乎提供内置的LinkedList 数据结构是多余且不必要的。为什么其他一些编程语言库(例如 C++ 和 Java 库)包含LinkedList 数据结构,即使它们很容易实现?如果是这样,用这些语言实现自己的链表有什么风险?
【问题讨论】:
-
我相信 Guido 有一篇关于这个的帖子,可能在他的 Python History 博客上,但我找不到它。 IIRC,关键是链表有很多不同的选项(单链还是双链?节点作为列表还是作为列表处理?可变还是不可变?尾部共享?),它们都很容易在 Python 中构建,在 C 中实现它们并没有真正的速度或空间优势(与数组或哈希表不同),而且它们中没有一个比其他需要内置的更有用。
-
链接列表通常是一个可怕的想法。他们的主要声名是它们实施起来很简单。特别是,大多数现实世界的链表都是临时侵入式链表,而不是类似容器的链表。
-
@abarnert 你能找到这个吗?这对于提供正确的答案非常有用。
-
@abarnert 我一直在考虑编写一个推测性的答案,将您的评论与来自各种语言的链表 API 文档中的引号相结合,大约是
Almost always it is better to use *our contigous resizable array* or *our deque* instead of *our linked list*. In general, array-based containers are faster, more memory efficient and make better use of CPU cache.虽然我有点新,所以我不确定在实际答案中对这种猜测的不满程度。 -
@Cosmo 标准的答案是,你几乎总是想要一棵宽树或一根长绳,以便两全其美……除了实际上,你不需要扩展到 30 亿元素并且仍然在中间拼接,所以你只需要一个数组。 Raymond Hettinger 在the
blistpep 上的 cmets 可能与此相关。
标签: java python c++ data-structures linked-list