2017-08-23 4 views
-2

Scalaでキーを効率的に検索する方法を知っていますか? は、私が地図を持って想像:Scalaでキーを効率的に検索する方法は、順序付けられたマップで知ることができますか?

val unorderdMap: Map[Int, String] = ... 
val orederedMap: Map[Int, String] = unorderedMap.sort 

はorderedMapで高速化キーのルックアップ操作ですか?

unorderedMap.get(i) //Slower??? 
orderedMap.get(i) //Faster??? 

効率的に検索する方法をコンパイラが知っていますか?

コンパイラは、それぞれの場合で異なる検索操作を実行しますか?

* EDIT: 私は が、それは次のようにそれから地図を作るために、より良いです(これは私は興味を持って何が)キーで高速検索操作を持ちたい

case class A(key: Int, value1: String, value2: String, ...) 
val SeqA: Seq[A] = Seq(A(1, "One", "Uno", ...), A(2, "Two", "Duo",...), ..., A(20000,... ,...)) 

あります

val mapA = SeqA.map(a => a.key -> a)(collection.breakOut) 

または、それをシーケンスとして残しておく方がいいですか? それから私はそれを注文する必要がありますマップを作るかどうか? *エレメントは約 です。20K〜30Kエレメント!

+0

「ソートムーソウ」とは何ですか? – Dima

+0

同じマップですが、ソートされました! – Spartan

+0

技術的には実際に使用されている実装に依存します(Mapはインタフェースであり、サンプルはマップの作成方法を指定せず、Mapには 'sort'メソッドがありません)。しかし、スカラのデフォルト(HashMapとSortedMap)を使用していると仮定すると、MichelLemayの答えは正しいです。 @Spartan; –

答えて

2

ソートマップは通常、どの言語のハッシュマップよりも(*)遅くなります。これは、ソートされたマップがO(1)の複雑さを償却するハッシュマップと比較して、複雑さがO(log n)であるためです。

詳細な説明については、関連するwikiページをご覧ください。

(*)マップのサイズなど、多くの要因によって異なります。小さなセットの場合、バイナリ検索でソートされた配列は、キャッシュに収まる方が良いでしょう。

+0

これはまた、使用するハッシュ関数の速度と品質に大きく依存します。 – puhlen

関連する問題