2016-04-27 19 views
2

私はタイプであるネストされた2つの辞書を持っているとの違いを探しますキーを比較している、現在私は周りにループをネストしていると私はこれが最も効率的な方法だとは思わないが、それらを比較する。ネストされた2つの辞書

+1

を使用することができます。ネストされたループではなく、ネストされた辞書です。なぜそれが必要ですか?それを行う別の方法がないと確信していますか? –

答えて

3

アルゴリズムはリニアに最良に実行されます(Nはキーの集まりの長さです)。 インデックスで辞書メンバーにアクセスするのは定数O(1)操作ですしたがって、インデクサーまたはTryGetValueメソッドを使用していることを確認してください 結果として、アルゴリズムはコレクションのサイズでライナーになるはずです 複数のネストされた汎用辞書を使用する代わりに、の方がはるかに優れています。すなわち、キーが複合キーを表すいくつかの文字列フィールドを持つ構造体を持ち、その後、ちょうどこれがあれば

+0

私はアプリケーションでデシリアライズされるjsonオブジェクトの形でデータをプッシュしています。しかし、キーは不明なので、ネストされたディクショナリに行ったのですが、私はより良い提案を歓迎します。また、可変キーにも対応していますか? – DorkMonstuh

+1

Json.NETとデータを表すクラスを使用します。 –

+1

@OscarVicentePerezはJson .NETのマップキーを変数名に変換しますか?もしそうなら、これはおそらくアプリケーションによってプッシュされているデータセットでは機能しません。 – DorkMonstuh

2

わからないネストせずに1つの辞書を使いますあなたが達成しようとしているものは何かを確認したいが、他のキーではないことを確認したい場合は、LINQ

var keysJustInFirst = dict1.Keys.Except(dict2.Keys); 
var keysJustInSecond = dict2.Keys.Except(dict1.Keys); 
var commonKeys = dict1.Keys.Intersect(dict2.Keys); 
+0

LINQ Exceptメソッドは、実行時間の点でパフォーマンスが悪くなることに注意してください。つまり、NとMは 'dict1'と' dict2'キーのコレクションの長さです。これは、ExceptIteratorがどのように実装されているかに起因します。内部的には 'Set 'を使用し、両方のキーコレクションをループします。さらに、この質問には必要ないO(N + M)ストレージを使用しています。私のソリューションでは、O(1)ストレージが使用されています – ironstone13

+0

はい、努力はO(N + M)ですが、すべての辞書のキーを少なくとも一度、これはあなたが行うことを期待できる最高です – dyrssen

+0

合意、あなたは完全な違いを見つける必要がある場合は、合意。 要素が同じかどうかを知るだけであれば、短絡のために最良の場合にはより早く行うことができます。最初の不一致で繰り返しを終了します。最良の場合はO(1) – ironstone13

関連する問題