5

たとえば、次のクラスがあるとします。

class Foo{
  String id;
  Foo(this.id);
}

ある種の Foos のコレクションが必要であり、その ID で任意の Foo を見つけることができます。これを達成するこれら2つの方法を比較したい:

地図付き:

var foosMap  = <String, Foo>{"foo1": new Foo("foo1"), "foo2": new Foo("foo2")}; 
var foo2 = foosMap["foo2"];

リストの場合:

var foosList = <Foo>[new Foo("foo1"), new Foo("foo2")];
var foo2 = foosList.singleWhere((i) => i.id == "foo2");

最初の方法 (マップを使用) の方がパフォーマンスの面で便利ですか? 他に考慮すべき考慮事項はありますか?

4

1 に答える 1

9

それは本当にあなたが探しているアイテムの数に依存します。big-O表記を知っている場合、マップから値を取得するのはO(1)または定数時間ですが、リストを線形検索するのはO(n)または線形時間です。つまり、マップ内に多くの要素が含まれていなくても、マップのルックアップ時間は同じですが、リストのルックアップ時間は要素の数とともに増加します。

このため、非常に小さなセットの場合、リストの方が高速であることが多い場合、多くのプログラマーがすべてにハッシュマップを使用します。ルックアップを実行するパフォーマンスクリティカルなコードを見ると、小さなセットのマップではなくリストに切り替える特殊なケースが見られることがあります。これが適切な戦略であるかどうかを知る唯一の方法は、パフォーマンステストを行うことです。

ただし、速度がすべてではありません。すでにマップがあると仮定すると、多くの状況でマップ構文を明確にすることをお勧めします。ルックアップを実行するためだけにマップを作成する必要がある場合は、singleWhere()またはfirstWhere()が最適です。

于 2013-03-20T04:25:37.780 に答える