1. ホーム
  2. スカラ

[解決済み】ScalaでVectorを選択するのはどんなとき?

2022-04-10 12:33:50

質問

どうやら Vector はScalaコレクション・パーティに遅刻し、影響力のあるブログ記事はすべてすでに去っていました。

Javaで ArrayList はデフォルトのコレクションです。 LinkedList しかし、それはアルゴリズムを考え尽くし、最適化するのに十分な注意を払った場合のみです。Scalaでは Vector をデフォルトの Seq とか、いつ List の方がより適切なのでしょうか?

どのように解決するのですか?

原則として、デフォルトで Vector . よりも高速です。 List に対して ほとんど を使用し、自明なサイズより大きなシーケンスに対してはよりメモリ効率が良くなります。こちらをご覧ください。 ドキュメント 他のコレクションと比較したVectorの相対的な性能について。を使用することには、いくつかの欠点があります。 Vector . 具体的には

  • ヘッドでの更新は、以下のように遅くなります。 List (ただし、あなたが考えるほどではありません)

Scala 2.10以前のもう一つの欠点は、パターンマッチングのサポートが List しかし、これは2.10で修正され、一般化された +::+ エクストラクタを使用します。

また、より抽象的、代数的な方法でこの問題にアプローチすることもできます:どのようなシーケンスで 概念的に を持っていますか? また、あなたは何を 概念的に を使用していますか? を返す関数があったら Option[A] ということは、その関数はドメインに穴がある(つまり部分的である)ことがわかります。 これと同じ論理をコレクションに適用することができる。

型のシーケンスを持っている場合 List[A] という2つのことを主張していることになる。 第一に,私のアルゴリズム(とデータ)は完全にスタック構造である. 第二に,このコレクションで行うのは完全なO(n)トラバーサルだけであると断言している. この2つは本当に密接に関係している。 逆に,もし私が Vector[A] は、その だけ というのは、私が主張しているのは、私のデータがきちんと定義された順序と有限の長さを持っているということです。 従って、アサーションは Vector そのため、柔軟性に優れています。