は、なぜ我々は、ラムダ式内の任意のネイティブコンテナにContains()
を使用してメンバーシップの検索を避けるために持っているのですか?C#で最も速いメンバーシップルックアップを提供するものは何ですか?
答えて
のは、次のことを考えてみましょう:
今var source = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var matches = new[] { 12, 2, 19, 8, 40, 12, 123, 121, 1212, 122334, 2, 102, 10, 29 };
foreach (var item in source.Where(i => matches.Contains(i)))
{
Console.WriteLine(item);
}
、我々はそれを書き出しするかどうかを知る前と比較する必要がありますどのように多くの項目matches
i
で考えてみましょう:
1: 14
2: 2
3: 14
5: 14
6: 14
7: 14
8: 4
9: 14
10: 13
ながら答えは、我々はいけないということである場合は特に、我々は時々我々が一般的にない、非常に素早く答えを得るので、私たちは10個の項目を処理するために、103回の比較を持っています。我々はまた、我々はすでにチェックした値(2
は二回matches
であるという事実を)比較する時間を無駄に。
我々はO(m)
操作をやっているので、n回アルゴリズムがO(nm)
です。
我々はとのより良い行うことができます。
var source = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var matches = new HashSet<int> { 12, 2, 19, 8, 40, 12, 123, 121, 1212, 122334, 2, 102, 10, 29 };
foreach (var item in source.Where(i => matches.Contains(i)))
{
Console.WriteLine(item);
}
ハッシュセットにContains
は、アルゴリズムは全体的にそれができると同じくらい良いですO(n)
、あるO(1)
ですので。
注意すべきいくつかの重要な事柄ですけれども:
上記はどんなタイプ
matches
それはそう、生産SQLでWHERE
句のCONTAINS
一部に変えられるでしょうし、次いで、データベース上で行われている場合それは(CONTAINS
が連鎖=
の一定数までまだ=
よりもはるかに遅いですが、劇中での要因が異なっている)問題ではありません。比較的小さな一致のセットでは、
O(n)
のコストがContains
であることは、ハッシュセットの作成と検索の一定コストよりも安いです。 (上記の例はおそらくほぼ同じ時間で実行されます)。
コストがあるときに、それは決してしないためのものではないのですが、あなたはコストとそれらがどのようにソースデータとそれらが実行されている方法によって影響を受けているの知っておくべきもの、およびパフォーマンスを向上させる方法特に高い。
私たちがラムダを使用していることは特に重要ではありませんが、いくつかのコードを素早く書くことができるという点を除けば、隠された非効率なコードを素早く書くことができます。 O(nm)
がより明確になります。 HashSetの
- 1. ModeShapeはJackRabbitが提供しないものは何ですか?
- 2. ClojureScriptデスクトップアプリケーションを提供する最も普通の方法は何ですか
- 3. Cでbmpイメージを回転する最も速い方法は何ですか?
- 4. デスクトップをストリーミングする最も速い方法は何ですか?
- 5. タイプをチェックする最も速い方法は何ですか?
- 6. iOSで最も速い描画方法は何ですか?
- 7. iPadで最も速いアニメーションは何ですか
- 8. デバイス間で最も速い通信方法は何ですか?
- 9. 最も速いAndroid SDKの設定は何ですか?
- 10. netTcpBindingの最も速いセキュリティ設定は何ですか?
- 11. ペアの配列で最も近い数のペアを見つける最も速い方法は何ですか?
- 12. iPhone/iPadでも動作するウェブ上のビデオを提供する最善の方法は何ですか?
- 13. 最も速いwinformsデータグリッドは何ですか?
- 14. Pythonを使用してIIS 6.0のWebページを提供する最も良い方法は何ですか
- 15. JSPにサーバーサイドのプロパティを提供する最も良い方法は何ですか?
- 16. Gtk +で画像を描画する最も速い方法は何ですか?
- 17. Pythonで重複をチェックする最も速い方法は何ですか?
- 18. マップインライン(Jupyter)で座標をプロットする最も速い方法は何ですか?
- 19. 最も高速で純粋なJavascript、Graphビジュアライゼーションツールキットは何ですか?
- 20. Javaでは、システム時間を得る最も速い方法は何ですか?
- 21. NSTimerを実行するのが最も速いのは何ですか?
- 22. HBaseからデータを抽出する最も速い方法は何ですか
- 23. Rのデータセットを更新する最も速い方法は何ですか?
- 24. std :: stringのサイズを変更する最も速い方法は何ですか?
- 25. UIViewの背景を実装する最も速い方法は何ですか?
- 26. このHTMLテーブルを解析する最も速い方法は何ですか?
- 27. IDの配列をクエリする最も速い方法は何ですか?
- 28. メテオでIPトラックツールをインストールするには、最速/最速/最も経済的な方法は何ですか?
- 29. 最も速いjQuery autoellipsisプラグインですか?
- 30. 最も支配的な固有値/特異値を計算する最も速い方法は何ですか?
、コレクションは、メンバーシップの検索に最適化されていません。したがって、Contains() をラムダ内に使用すると、メンバーシップの状態を見つけるためにコレクション全体をループする必要があります。これにより、 クエリが遅くなります。 –
ご協力ありがとうございます。あなたは例で説明できますか? –
ラムダ式はどのような違いがありますか? – NetMage