Stack - scala实现/性能问题

时间:2016-01-27 15:02:26

标签: scala data-structures

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

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

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

修改

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

1 个答案:

答案 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