我一直关注各种数据结构及其性能特征的scala-lang注释。
我注意到immutable.Stack
对于附加和前置都具有C(Const。)复杂度,而mutable.Stack
堆栈具有用于前置的C复杂度和用于追加的L(线性)复杂度。这让我有些惊讶。
我认为,“追加”只意味着push()
到堆栈的顶部。由于前置和附加的复杂性不同,是否意味着“前置”实际上是在堆栈的底部放置了什么?为什么它表现得更好(C表示可变)而不是附加(L表示可变)?而且,我怎么能在筹码前加上?我在scaladoc中看不到任何适用于此的方法。
修改
正如@Łukasz在评论中指出的那样,您可以使用+:
和:+
运算符作为前缀并附加到堆栈。问题仍然存在 - 为什么前置工作比附加到堆栈更好(更快)?我应该添加到底部而不是推到顶部吗?
答案 0 :(得分:2)
看起来这张表中有错误,或者我没有得到任何东西。如果你看一下实现,push
可变和不可变Stack
需要恒定时间,而:+
可变和不可变需要线性时间,因为:+
来自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 }
另请注意,自2.11以来,不可变Stack
已被弃用
P.S。我甚至检查了2.12的最新来源,但似乎代码自2.11以来没有改变
P.P.S。我找不到Stack
的任何插入实现,并且查看表格似乎很奇怪只有Stack
在不可变结构中可以插入数据,所以我猜测L
来自那个列应该在append
列