scala中的惯用方法是在List上获得O(1)索引查找

时间:2014-04-09 21:51:25

标签: scala scala-collections

来自List.scala的javadoc:

 Time: List has O(1) prepend and head/tail access. Most other operations are `O(n)` on the number of elements in the list.
 *  **This includes the index-based lookup of elements**, `length`, `append` and `reverse`.

这与java中的ArrayList相比(不利)。 (是的,我意识到它是可变的,列表不是......但放弃这种表现是不可能的)。

那么什么是可能/首选" go-to" Scala中的不可变List实现,O(1)用于基于索引的查找(并且最好也用于长度)。可以理解/接受附加和反向是O(n)

更新 Om-nom-nom提名Vector和我同意(等待他就此做出真正的回答)。

来自Vector上的javadoc:

  

Vector是一种通用的,不可变的数据结构。它提供   随机访问和更新有效的恒定时间,以及   非常快速的追加和前置。因为载体达到了很好的平衡   在快速随机选择和快速随机功能更新之间,   它们目前是不可变索引的默认实现   序列。

2 个答案:

答案 0 :(得分:3)

只需使用数组。这是查找的O(1)。

Java中的ArrayList是什么?它只是一个符合List合同的数组。如果今天设计Java Collections,他们可能会使Array成为一个类而不是像Scala那样的语言特性。

所以在Scala中我们可以像使用任何其他类型的Seq一样使用数组,例如List或Vector。

答案 1 :(得分:3)

对于不可变结构,您可能需要Vector;与数组相比,直接访问速度相当慢,但是对于查找重复的追加或前置,它接近O(1)。 (然而,混合的追加/预先混淆了它。)

ArrayBuffer是可变的,与java.util.ArrayList基本上是相同的数据结构,除了所有Scala集合上的好东西。 (地图等)。

如果你喜欢列表的类似堆栈的属性,ArrayStack有推/弹和索引,其中堆栈的顶部元素为0(ArrayStack也是可变的)。