タグ付けされた質問 「dictionaries」

4
赤黒の木はなぜそんなに人気があるのですか?
私が見るところはどこでも、データ構造は赤黒木を使用して実装されているようです(std::setC ++、SortedDictionaryC#などで) アルゴリズムクラスで(a、b)、赤黒、AVLの各ツリーをカバーしたので、次のようになりました(教授に尋ねたり、数冊の本を読んだり、グーグルで調べたりすることからも)。 AVLツリーの平均深度は赤黒ツリーよりも小さいため、AVLツリーの値の検索は一貫して高速です。 赤黒木は、AVL木よりもバランスをとるための構造的な変化が少ないため、挿入/削除の速度が向上する可能性があります。これは、ランタイムと実装に大きく依存するため、これはツリーの構造変更のコストに依存するため、潜在的に言っています(ツリーが不変の場合、関数型言語でも完全に異なる可能性があります) AVLと赤黒木を比較する多くのオンラインベンチマークがありますが、私が驚いたのは、私の教授が基本的に次のいずれかを行うと言ったということです。 パフォーマンスについてそれほど気にかけない場合もあります。その場合、ほとんどの場合、AVLと赤黒の10〜20%の違いはまったく問題になりません。 または、パフォーマンスに本当に関心があります。この場合、AVLツリーと赤黒ツリーの両方を捨てて、Bツリーを使用します。Bツリーは、より良く機能するように調整できます(または(a、b)ツリー、私は)これらすべてを1つのバスケットに入れます。) その理由は、Bツリーがメモリにデータをよりコンパクトに格納するため(1つのノードに多くの値が含まれる)、キャッシュミスがはるかに少なくなるためです。また、ユースケースに基づいて実装を微調整し、Bツリーの順序をCPUキャッシュサイズなどに依存させることもできます。 問題は、実際の最新のハードウェアでの検索ツリーのさまざまな実装の実際の使用状況を分析するソースがほとんど見つからないことです。私はアルゴリズムに関する多くの本を調べましたが、異なるツリーバリアントを一緒に比較するものは見つかりませんでした。実際のプログラムで。) そうは言っても、上記で述べたことに基づいて、Bツリーがそれらを上回るはずであるときに、どこでも赤黒ツリーが使用されている特定の理由がありますか?(私が見つけることができる唯一のベンチマークとして、http://lh3lh3.users.sourceforge.net/udb.shtmlも示していますが、それは特定の実装の問題である可能性があります)。それとも、実装がかなり簡単であるために、誰もが赤黒ツリーを使用する理由、またはそれを別の言葉で言うと、実装が難しいのはなぜですか? また、関数型言語の領域に移動すると、これはどのように変わりますか?ClojureとScalaはどちらもHash配列にマップされた tryを使用しているようで、Clojureは32の分岐係数を使用しています。

5
アンチブルームフィルターはありますか?
A ブルームフィルタは、効率的にさまざまな値がすでに処理中に遭遇したかどうかを追跡することが可能となります。データアイテムが多数ある場合、ブルームフィルターを使用すると、ハッシュテーブルのメモリを大幅に節約できます。ハッシュテーブルと共有するブルームフィルターの主な機能は、アイテムが新しいものではない場合は常に「not new」と表示することですが、アイテムに「not new」のフラグが立てられる確率はゼロではありません「新しい場合でも。 逆の動作をする「アンチブルームフィルター」はありますか? 言い換えれば、アイテムが新しい場合は「新しい」と言う効率的なデータ構造がありますが、新しいものではないアイテムについては「新しい」と言うこともありますか? 以前に表示されたすべてのアイテムを(たとえば、並べ替えられたリンクリストに)保持することは最初の要件を満たしますが、大量のメモリを使用する場合があります。緩和された2番目の要件を考えると、それも不要であることを願っています。 より正式な治療、書き込み好む人のためにb(x)=1b(バツ)=1b(x) = 1ブルームフィルタを考えればxバツx新しいもので、b(x)=0b(バツ)=0b(x) = 0それ以外の場合は、書き込みn(x)=1n(バツ)=1n(x) = 1ならばxバツx本当に新しいとされn(x)=0n(バツ)=0n(x) = 0それ以外の場合。 次に、Pr[b(x)=0|n(x)=0]=1Pr[b(バツ)=0|n(バツ)=0]=1Pr[b(x) = 0 | n(x) = 0] = 1 ; Pr[b(x)=0|n(x)=1]=αPr[b(バツ)=0|n(バツ)=1]=αPr[b(x) = 0 | n(x) = 1] = \alpha ; Pr[b(x)=1|n(x)=0]=0Pr[b(バツ)=1|n(バツ)=0]=0Pr[b(x) = 1 | n(x) = 0] = 0; Pr[b(x)=1|n(x)=1]=1−αPr[b(バツ)=1|n(バツ)=1]=1−αPr[b(x) = 1 | n(x) …

5
ハッシュテーブル操作O(1)とはどのようなデータですか?
答えから(いつ)ハッシュテーブルルックアップはO(1)ですか?、データが特定の統計条件を満たしている場合、ハッシュテーブルには少なくとも償却されたO(1)O(1)O(1)最悪の場合の振る舞いがあり、これらの条件を広くするのに役立つテクニックがあります。 しかし、プログラマーの観点から、私は自分のデータが何であるかを事前に知りません。それはしばしば外部ソースから来ます。そして、一度にすべてのデータを取得することはめったにありません。挿入と削除は、ルックアップの速度をそれほど下回らない速度で行われることが多いため、データを前処理してハッシュ関数を微調整します。 だから、一歩を踏み出す:データソースに関する知識があれば、ハッシュテーブルにO(1)O(1)O(1)操作の可能性があるかどうか、そしておそらくハッシュ関数で使用するテクニックを判断するにはどうすればよいですか?

3
配列なしのメモ化
Cormen et al。の「アルゴリズムの概要」のセクション15.3 動的プログラミングの要素では、メモ化について次のように説明しています。 メモ化された再帰アルゴリズムは、各サブ問題の解決策のエントリをテーブルに保持します。各テーブルエントリには、エントリがまだ入力されていないことを示す特別な値が最初に含まれています。再帰アルゴリズムが展開するときにサブ問題に最初に遭遇すると、その解が計算されてテーブルに保存されます。このサブ問題に遭遇するたびに、テーブルに保存されている値を検索して返します。 さらに、脚注として追加します。 このアプローチでは、考えられるすべてのサブ問題パラメーターのセットがわかっていること、およびテーブルの位置とサブ問題の間の関係が確立されていることを前提としています。別のより一般的なアプローチは、サブ問題パラメーターをキーとしてハッシュを使用してメモすることです。 メモした値を(多次元)配列ではなく辞書に保存する必要がある(または簡単にする)よく知られているDPの問題はありますか? 背景:これが何らかの用途であれば、この質問の理由は、動的プログラミングを見たばかりの人に(自己均衡型)バイナリ検索ツリーの概念を動機付けようとしているからです。

2
少ないメモリフットプリントでセット実装を探す
セットデータタイプの実装を探しています。つまり、 サイズuのユニバースU = \ {0、1、2、3、\ dots、u – 1 \}からの動的サブセットSSS(サイズnnn)を維持します。U={0,1,2,3,…,u–1}U={0,1,2,3,…,u–1}U = \{0, 1, 2, 3, \dots , u – 1\}uuu 操作insert(x)(要素xをSに追加SSS)およびfind(x)(要素xがSのメンバーかどうかをチェックSSS) 他の操作は気にしません。オリエンテーションについては、私が使用しているアプリケーションでu≈1010u≈1010u \approx 10^{10}ます。 時間O(1)O(1)O(1)で両方の操作を提供する実装を知っているので、主にデータ構造のサイズを心配します。何十億ものエントリを期待していますが、できるだけスワッピングを避けたいです。 必要に応じて、ランタイムを犠牲にしてもかまいません。O(\ log n)の償却実行時間O(logn)O(log⁡n)O(\log n)は、私が認めることができるものです。予想されるランタイムまたは\ omega(\ log n)のランタイムω(logn)ω(log⁡n)\omega(\log n)は許可されません。 私の考えの1つは、SSSを範囲の和集合として表すことができれば[xmin, xmax]、パフォーマンスがいくらか低下する代わりに、ストレージサイズを節約できるということです。また、など、他のいくつかのデータパターンも可能[0, 2, 4, 6]です。 そのようなことを行うことができるデータ構造を私に教えてもらえますか?

2
ハッシュテーブルO(1)はハッシュ速度をどのように考慮していますか?
ハッシュテーブルは、特定の容量で言う単純な連鎖と倍加を使用してを償却すると言われています。Θ(1)Θ(1)\Theta(1) ただし、これは要素の長さが一定であることを前提としています。要素のハッシュを計算するには、要素を、時間がかかります。ここで、は長さです。lΘ(l)Θ(l)\Theta(l)lll ただし、要素を区別するには、少なくともビットの長さの要素が必要です。そうでなければ、鳩の巣の原理によって、それらは区別されません。要素のビットを通過するハッシュ関数は時間かかります。LG N LG N Θ (LG N )nnnlgnlg⁡n\lg nlgnlg⁡n\lg nΘ(lgn)Θ(lg⁡n)\Theta(\lg n) 代わりに、入力のすべての部分を使用する合理的なハッシュ関数を考慮したハッシュテーブルの速度は、実際にはであると言えるでしょうか。では、なぜ実際にハッシュテーブルが文字列や大きな整数などの可変長要素を格納するのに効率的であるのでしょうか。Θ(lgn)Θ(lg⁡n)\Theta(\lg n)


2
ブルームフィルターと完全なハッシュ
A ブルームフィルタは、所与のセットのテストメンバーシップにハッシュ関数を使用して項目が指定された位置にないの存在するかどうかをチェックすることにより、。SSS ハッシュの衝突の影響を緩和するために、複数の関数が使用され、ユニバーサルハッシュを使用する場合の確率的限界が生成されます。 要素あたり10ビットを使用して、「妥当な」エラー率を実現できます。 セット完全なハッシュ関数を 直接構築でき、最後の要素がに存在しない場合、要素ごとに1ビットのみを使用して完全に回復できます。S+∞S+∞S + \inftySSS この推論が間違っている根本的な理由は何ですか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.