【发布时间】:2011-12-04 07:25:31
【问题描述】:
或者换一种说法,只有一个头指针的基本单链表有什么好处?我可以看到尾指针的好处是:
- O(1) 列表连接
- O(1) 在列表右侧追加内容
与 O(n) 列表连接(其中 n 是左侧列表的长度?)相反,这两者都是相当方便的东西。丢弃尾指针有什么好处?
【问题讨论】:
-
我知道每次我想做一些有用的事情时我都可以反转列表,但这会将每个操作变成
O(n)操作。我想知道他们为什么不采摘这个低垂的果实并访问尾部O(1)=) -
F# 列表是不可变的,所以无论你做什么,任何列表修改至少是
O(n)。 -
@RamonSnir:我认为不可变列表的意义在于您可以重复使用其中的一部分,这样您就可以在不到
O(n)的时间内获得列表的“修改副本” -
@LiHaoyi 但是你建议的操作会改变列表,因此不能用不可变列表“有效地”完成。在不改变列表的情况下唯一可以执行的操作是添加项目,这就是
(::)运算符。 -
@LiHaoyi 一个 cons 项是一个值,然后是另一个 cons 项或 null。前置时(即
h::t),您创建一个新的 cons 项,其值为h,而它的另一部分(另一个 cons 项或 null)为t。此操作创建了一个新的 cons 项,但不影响t(因为每个 cons 项只指向“前进”,而不是“后退”)。但是当您执行t @ [h]时,没有简单的方法可以创建您想要的列表,因为t的结尾是空值,并且无法更改(不变性)。为了创建您想要的列表,我们需要复制t并在末尾附加h。
标签: f# linked-list