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



从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相比(不利)。(是的,我意识到它是可变的,List不是……但放弃这种性能是不可能的)。

那么,在Scala中,使用O(1)进行基于索引的查找(最好是长度查找),什么是可能/首选的"转到"不可变列表实现呢。附加和反向是O(n)是可以理解/接受的

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

从Vector:上的javadoc

Vector是一种通用的、不可变的数据结构。它提供在有效的恒定时间内进行随机访问和更新,以及非常快速的追加和预处理。因为矢量可以很好地平衡在快速随机选择和快速随机功能更新之间,它们目前是不可变索引的默认实现序列。

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

ArrayBuffer是可变的,基本上与java.util.ArrayList的数据结构相同,只是上面有所有Scala集合的优点。(地图等)

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

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

Java中的ArrayList是什么?它只是一个遵守List契约的数组。如果Java Collections在今天被设计,他们可能会像Scala一样,将Array作为一个类而不是一个语言特性。

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

最新更新