キーによるImmutableSortedDictionary範囲列挙


11

私はC#のについて読んでいたImmutableSortedDictionary中でSystem.Collections.Immutable、私のプログラムでそれを適用する方法を考えます。私はC ++ lower_boundupper_boundここを参照)をかなり気に入っており、範囲検索のようなものを見たいと思っていました。ただし、同様のメソッドがドキュメントに不思議に欠けているようです。何か不足していますか?または、MSはソートされた範囲への効率的なアクセスなしにソートされた辞書を本当に提供しますか?それはIEnumerable、拡張メソッドのように、キーに対して実行できることとまったく同じではないようです。そのため、コレクションから直接提供されるものを見ていません。


Eric Lippertは、2008年に不変のAVLツリー実装を共有しました。コメントから、速度や効率のために特に最適化されているとは思いませんが、IBinarySearchTree<K,V>実装は期待どおりに見えます。彼はそれをさらにいじくり回したのだろうか?
J Trana

ImmutableList<T>クラスはまた、AVLツリーとして実装されています。ソースコードから:/// The root node of the AVL tree that stores this set.
Theodor Zoulias

リストがAVL trueを使用して不変性を実装することを意味するのか、それともAVLツリー自体が不変かを知っていますか?(とにかくツリーを公開しないので、それは問題ではないかもしれません)。
J Trana

ドキュメントによると、(配列に裏打ちされたImmutableList<T>)に対するImmutableArray<T>(AVLツリーに裏打ちされた)の利点は次のとおりです。不変リストを使用する理由:1)データの更新が一般的であるか、要素の数が少なくないことが期待されています。2)コレクションを更新することは、コンテンツを繰り返すことよりもパフォーマンスが重要です。
Theodor Zoulias

これは、大きなAVLツリーから要素を追加または削除するときに、ほとんどのノードを共有していくつかの新しいノードを作成するだけで、元のツリーを破壊せずに新しいツリーを取得できるためです。(永続的なデータ構造-木
Theodor Zoulias

回答:


9

利用可能な組み込みのコレクションが機能の完全なセット(メソッドのSortedDictionary欠如など)を提供しておらずBinarySearch、サードパーティのソリューション(C5ライブラリなど)の検索を余儀なくされているのは、いらいらします。

の代わりに、ImmutableSortedDictionaryおそらくを使用ImmutableSortedSetして、キーに値を埋め込み、適切な比較子を使用することができます。少なくともこのクラスのAPIにはプロパティMinとが含まれていますMax


2
補足として、別の不変クラスであるImmutableList<T>、ツリーとして内部的に実装されています。そのため、の10倍の速度が遅く、12倍のメモリが割り当てられList<T>ます。ImmutableArray<T>代わりに使用してください。
Theodor Zoulias

1
へへ、私はすでにC5を使用していますが、(スナップショット以外の)不変コレクションに何が利用可能であるかを調べています。ありがとう!私は誰か他の誰かが何らかの形または形でこれを解決したことを望みますが、私は覚えておきますImmutableSortedSet
J Trana

@TheodorZoulias TryGetValueメソッドがlog(N)で動作しているときに、BorarySearchメソッドをSortedDictionaryに持つポイントは何ですか? こちらをご覧ください
Giorgi Chkhikvadze

2
@GiorgiChkhikvadze BinarySearchは、完全に一致するものが見つからない場合に備えて、検索している項目より大きい次の要素を提供します。
Theodor Zoulias

1
@GiorgiChkhikvadzeおそらくここでの最大の違いは、戻り値がコレクション内の単一の値ではなく、効率的にコレクションにインデックスを付ける方法であることです。メソッドBinarySearchは、値を効率的に見つけるだけでなく、Theodorが指摘したようにミスの場合でもインデックスを見つけるため、特殊です。これにより、配列などへの高速アクセスが可能になります。ただし、ツリーの場合、整数インデックスは構造にアクセスする効率的な方法ではない可能性があります。C ++は、イテレータオブジェクトを使用してこれを解決します(独自の複雑さはあります)。
J Trana
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.