堆栈 - scala 实现/性能问题



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

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

我认为,"追加"意味着push()到堆栈的顶部。由于预置和追加的复杂性不同,这是否意味着"前置"实际上是在堆栈的底部放置一些东西?为什么它的性能(C 表示可变)比附加(L 表示可变)更好?而且,我什至如何预置堆栈?我在 scaladoc 中看不到任何适合此的方法。

编辑。

如注释中所述@Łukasz,您可以使用 +: 运算符在堆栈前置和追加:+运算符。但问题仍然存在 - 为什么预置比附加到堆栈更好(更快)?我应该添加到底部而不是推到顶部吗?

看起来这个表中有一个错误,或者我没有得到什么。如果你看一下实现,可变和不可变Stackpush需要恒定的时间,可变和不可变的:+需要线性时间,因为:+来自线性时间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列中

最新更新