Stack – scala实现/性能问题

我一直关注各种数据结构及其性能特征的
scala-lang注释.

我注意到immutable.Stack的附加和前置都具有C(Const.)复杂度,而mutable.Stack栈具有C复杂性,用于前置和L(线性)复杂度的附加.这让我有些惊讶.

我认为,“追加”意味着只需将push()移到堆栈顶部即可.由于前置和附加的复杂性不同,是否意味着“前置”实际上是在堆栈的底部放置了什么?为什么它表现得更好(C表示可变)而不是附加(L表示可变)?而且,我怎么能在筹码前加上?我在scaladoc看不到任何适合这种方法.

编辑.

正如@Łukasz在评论中指出的那样,您可以使用:和:运算符预先添加并附加到堆栈.问题仍然存在 – 为什么前置工作比附加到堆栈更好(更快)?我应该添加到底部而不是推到顶部?

最佳答案 看起来这张桌子上有一个错误,或者我没有得到什么.如果你看一下实现,推送可变和不可变Stack需要恒定时间,并且:对于可变和不可变都需要线性时间,因为:来自SeqLike,它在线性时间内完成,这对于堆栈作为数据是非常合理的结构体

可变和不可变堆栈都使用不可变List并使用:: operation,这是常量. 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开始不推荐使用不可变堆栈

附:我甚至检查了2.12的最新来源,但似乎代码自2.11以来没有改变

P.P.S.我找不到Stack的任何插入实现,看着表格似乎很奇怪,只有不可变结构中的Stack可以插入数据,所以我猜这个列中的L应该是在追加列中

点赞