質問

どうしたらいいのかと悩んの考え方を使用するときのバイナリ検索木を使用する場合を生成する事ができます。

アダプタのご使用をおかったので少し実験にC5図書館 TreeDictionary (まとめていきたいと思い赤-黒ツリーバイナリ検索、C#辞書で調べました。辞書を常に短時間での高精度の解析により追加探業務も降水量の少ないメモリ空間です。例えば、16809 <int, float> 作品に使用された辞書342KiBこのツリーを使用723KiB.

そBSTのと考えられていたものであったりのメモリ効率ようですが、一つのノードのツリー要求されるのがバイトより入力辞書で調べました。を与えることで発生する?ある点がBSTのものを使うのがポイントのよう辞書?

また、どうなんだろうけど、日本人がある場合は早+メモリーの効率的なデータ構造の保存 <int, float> ペアのための辞書のタイプアクセスのいずれかに記載ます。

役に立ちましたか?

解決

そBSTのと考えられていたものであった するメモリ効率ようですが、 このノードのツリーが必要で データフォーマットよりエントリ 辞書です。を与えることで発生する?はありま ポイントがBSTのものを使うのがポイントのよう 辞書?

私は個人的にはなっていることなどを原則とします。それでも、原則としてではなく、カテゴリカルとエッチングの生地の宇宙。

一般的には、辞書は本当にただのファンシパレリのリストが表示されます。挿入する辞書のようなもの:

LinkedList<Tuple<TKey, TValue>> list =
    internalArray[internalArray % key.GetHashCode()];
if (list.Exists(x => x.Key == key))
    throw new Exception("Key already exists");
list.AddLast(Tuple.Create(key, value));

その ほぼ O(1)操作を実行します。辞書を利用O(internalArray.については長さ+n)メモリが数するものと期待される。

一般BSTsとして実施可能:

  • リンク先のリストを利用するにはO(n)スペースがとするものと期待される。
  • 配列, であるO(2h -n)スペースはhが高さのツリーのするものと期待される。
    • 以来、赤-黒木囲の高さO(1.44*n)の配列を実装してい限定メモリ使用量の約O(21.44n -n)

オッズは、C5TreeDictionaryが配列することで、責任者は無駄なスペース。

を与えることで発生する?ある点が BSTのものを使うのがポイントのよう辞書?

辞書いても望ましくない物件:

  • 残量が足りない可能性がありcontinugousブロックを保持するためのメモリーお辞書の場合でも、その必要なメモリは以下の利用可能なアプリです。

  • 評価は、ハッシュ関数が複数できる任意に長い長さです。文字列、例えば、リフレクタの検討 System.String.GetHashCode 方法などをお届けするハッシュ文字列でもO(n)時間では相応の時間が非常に長い文字列です。一方、比較文字列を格差のほとんどよりも早くハッシュ以降を要求する場合がございます。を見るだけで最初の数字.その全株式をできるツリーに挿入するよりも早く辞書に挿入した場合のハッシュコードの評価が長い。

    • Int32の GetHashCode 方法は、文字通りだけで return this, っきhardpressedを探す場合、ハッシュテーブルを生int鍵は以下のツリーに登録する

RB木一望ましい物件:

  • きと削除の最小値と最大値の要素をO(log n)時間、O(n)時間を辞書で調べました。

  • 場合はツリーとして実施されリンクリストではなく、"配列"のツリーが 通常 スペース効率的により辞書で調べました。

  • 同様に、そば簡単に書ける不変のバージョン樹木を支えるの挿入/検索/削除O(log n)時間。辞書になく適応で不変でコピーしておく必要があり、全体の内部配列毎に運営(うん してい それから配列に基づく実装の不変の指樹種の汎用辞書データ構造が、実施は非常に行することができます。

  • 行き来できますすべての要素をツリーにソートされた順序で一定の空間、O(n)時間に対する必要カンター-グループに属するカンハッシュテーブル配列に並び替えでのも同様の効果が出ます。

いの選択データ構造の変化により契約内容の変更をどの特性にあります。また順序付けの袋を保証するこのハッシュ関数を評価し、迅速に行きます。純辞書で調べました。が必要な場合は注バッグやゆっくり走るハッシュ関数とTreeDictionary.

他のヒント

これは、ツリーノードが辞書のエントリよりも多くのストレージを必要とするという意味を成しません。バイナリツリーノード値との両方の左と右のサブツリーを格納する必要があります。私はと仮定しています - - ジェネリックDictionary<TKey, TValue>はハッシュテーブルとして実装されるか、各バケット(値プラス1つのポインタ/参照)または再マッピングのいくつかの並べ替え(単に値)のためのリンクリストを使用しています。私は確かにリフレクターでのぞき見を持っている必要があるだろうが、この質問の目的のために、私はそれが重要だとは思わない。

疎ハッシュテーブル、ストレージ/メモリの点で効率が低いです。あなたはハッシュテーブル(辞書)を作成し、100万にその容量を初期化し、1万の要素とそれを埋める場合、私はそれが万個のノードとBSTよりも多くのメモリを食べるかなり確信しています。

ノード/キーの量は、唯一の何千ものであれば、それでも、私はこれのいずれかの心配はないでしょう。これは、物理RAMのギガバイトに比べて、キロバイト単位で測定することになるだろう。

<時間> 質問がある場合は、

「なぜあなたは、ハッシュテーブルの代わりに、バイナリツリーを使用するのでしょうか」ハッシュテーブルではないのに対し、その後、最良の答えは、IMOバイナリツリーが発注されていることです。あなただけの何かに正確に等しいキーのハッシュテーブルを検索することができます。ツリーで、あなたは、値の範囲、最も近い値、などあなたがインデックスまたは類似した何かを作成している場合、これはかなり重要な違いであるために検索することができます。

それはあなたが時期尚早な最適化をやっている私には思える。

私はあなたにお勧めしたいことは、あなたが実際に使用している構造分離株へのインタフェースを作成し、(最もよく働くように思われる)辞書を使用して、インターフェイスを実装することです。

メモリ/パフォーマンスが(おそらく20k-数字のためではないだろう)、そして、あなたは他のインターフェイスの実装を作成し、もう1つは自己ベストを働くチェックすることができ、問題になった場合。あなたは(あなたが使用しているどの実装を除く)コードの残りの部分ではほとんど何も変更する必要はありません。

ツリー用のインタフェースとハッシュテーブルは非常に類似していなければならない(私は推測しているあなたの辞書が1つをベースとするものです)。常にキー付き検索を中心ます。

私はいつも辞書一度物事を作成し、それに検索の多くを行うためのより良いと思ったいました。ツリーは良くなったものの、あなたは大幅にそれを修正した場合。私はからそのアイデアを拾ったところしかし、私は知りません。

(あなたはそれに小さな変更を加える場合は、ほとんどの木のを再利用することができますよう関数型言語は、多くの場合、彼らのコレクションのための基礎としての木を使用します)。

あなたは辞書はあなたが(あなたのケースで)キーと値のペアの検索を行うことができますしながら、BSTはあなたの注文の表現を与えるであろう、「りんごとりんご」を比較していません。

私は2間のメモリフットプリントに多くのサイズを期待していないが、辞書には、はるかに高速に検索あなたを与えるだろう。 (潜在的に)BSTであなたにアイテムを見つけるには、ツリー全体をトラバースする必要があります。しかしdictnary検索を行うためにあなたは、単に検索キーに基づいています。

あなたは、待ち時間のスパイクとハッシュ衝突攻撃からあなたのデータ構造を保護する必要がある場合は、

バランスの取れたBSTが好ましいます。

アレイ・バック構造体が成長するとき、前者が発生リサイズ取得し、後者は、限られた整数の範囲に無限空間から射影としてハッシュアルゴリズムの必然的な特性である。

.NETでのもう一つの問題はLOHがあり、かつ、十分に大きな辞書であなたがLOHの断片化に実行することです。この場合、あなたはより大きなアルゴリズムの複雑クラスの価格を払って、BSTを使用することができます。

要するに、BSTは、割り当てに裏打ちされて、あなたはハッシュテーブルを使用すると、O(N)を取得、最悪の場合の時間を最悪の場合のO(ログ(N))時間を取得ヒープます。

BSTはO(ログ(N))の平均時間、悪化しキャッシュの局所性とより多くのヒープ割り当ての価格で来るが、それは、待ち時間の保証を持っており、辞書攻撃やメモリの断片化から保護されています。

ワースBSTは、圧縮ガベージコレクタを使用していない、他のプラットフォーム上のメモリの断片化の対象であることを指摘した。

それが唯一の値とオフセット情報を格納するオフヒープリンクリストとしてデータを格納するため、

は、メモリサイズについては、.NET Dictionary`2クラスは、より多くのメモリ効率的です。 BSTは、オブジェクトヘッダ(各ノードがヒープ上のクラスのインスタンスであるように)、二つのポインタ、およびバランスのとれたツリーの一部増補ツリーデータを格納しなければなりません。例えば、赤黒木は、色(赤又は黒)として解釈ブール値を必要とします。私は間違っていない場合、これは、少なくとも6機の言葉です。だから、64ビットシステムで赤黒木の各ノードは、最小である:

ヘッダの3ワード= 24のバイト = 16バイトの子ポインタのための2つのワード 色の1つのワードは8バイト= 値のための少なくとも1ワード8+バイト = 24 + 16 + 8 + 8 = 56バイト(8バイトツリーは親ノードポインタを使用している場合)。

これと同時に、辞書エントリの最小サイズはわずか16バイトになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top