我一直在研究关于各种数据结构及其性能特征的scala-lang注释。
我注意到immutable.Stack
的追加和前置都有 C(Const.) 复杂性,而mutable.Stack
堆栈的预置有 C 复杂度和附加的 L(线性)复杂度。这让我有点惊讶。
我认为,"追加"意味着push()
到堆栈的顶部。由于预置和追加的复杂性不同,这是否意味着"前置"实际上是在堆栈的底部放置一些东西?为什么它的性能(C 表示可变)比附加(L 表示可变)更好?而且,我什至如何预置堆栈?我在 scaladoc 中看不到任何适合此的方法。
编辑。
如注释中所述@Łukasz,您可以使用 +:
运算符在堆栈前置和追加:+
运算符。但问题仍然存在 - 为什么预置比附加到堆栈更好(更快)?我应该添加到底部而不是推到顶部吗?
看起来这个表中有一个错误,或者我没有得到什么。如果你看一下实现,可变和不可变Stack
的push
需要恒定的时间,可变和不可变的:+
需要线性时间,因为:+
来自线性时间SeqLike
,这对于堆栈作为数据结构来说是非常合理的
可变和不可变堆栈都使用内部不可变List
并使用::
操作,这是恒定的。 List
它的追加操作作为L
,所以Stack
不可能做得更好
对于不可变堆栈,它是:
def push[B >: A](elem: B): Stack[B] = new Stack(elem :: elems)
对于可变的,它是:
def push(elem: A): this.type = { elems = elem :: elems; this }
另请注意,不可变Stack
自 2.11 起已弃用
附言我什至检查了 2.12 的最新来源,但似乎自 2.11 以来代码没有改变
附言我找不到任何Stack
的插入实现,并且查看表格似乎很奇怪,只有不可变结构中的Stack
可以插入数据,所以我猜该列中的L
应该在append
列中