【发布时间】:2017-08-06 20:53:53
【问题描述】:
SML 中是否有一个运算符允许我在不必创建新列表的情况下追加到列表中?例如
我不能这样做:
[1,2,3]::1
但我可以这样做:
[1,2,3]@[1]
这很奇怪,因为我必须创建一个包含 1 的列表。有更好的方法吗?
【问题讨论】:
-
正如@sepp2k 所说,附加到列表的末尾很昂贵。构建列表的最慢方法之一是将元素一个一个地附加到列表的末尾,因为任何这样的方法在列表的长度上最多是二次方的。出于这个原因,SML 程序员有时会编写函数以向后顺序创建列表(追加到前面而不是后面,即使在追加到后面看起来更自然的情况下)然后通过
rev运行结果列表(其中以一种巧妙的方式实现,因此它是O(n)) 来获取所需的列表。 -
没有尾指针可以追加吗?这也将是 O(1)
-
@Har 附加到尾指针(如果有的话,则没有)会改变原始列表。 SML 列表是不可变的,所以这是不可能的。
-
@Har 是正确的,没有尾指针可以追加。
标签: sml