タグ付けされた質問 「ds.data-structures」

スペースの下限、オブジェクトの挿入と削除の時間の複雑さなど、データ構造のプロパティとアプリケーション。

2
ブルームフィルターの従来の分析は間違っていますか?
このホワイトペーパーでは、ブルームフィルターのエラー率の従来の分析は正しくないと主張し、実際のエラー率の長くて重要な分析を提供します。リンクされた論文は2010年に公開されましたが、ブルームフィルターの従来の分析は、さまざまなアルゴリズムとデータ構造のコースで教えられ続けています。 ブルームフィルターの従来の分析は実際に間違っていますか? ありがとう!

3
2つのバイナリ検索ツリーのマージ
任意のサイズと範囲の2つのバイナリ検索ツリーをマージするアルゴリズムを探しています。これを実装するための明確な方法は、範囲が他のツリーの任意の外部ノードに収まるサブツリー全体を見つけることです。しかし、このタイプのアルゴリズムのための時間を実行している最悪の場合は、の順になるようだと、それぞれの木の大きさです。O(n+m)nm ただし、これはで行うことができると言われていますO(h)。ここhで、高さの大きいツリーの高さです。そして、私はこれがどのように可能かについて完全に迷っています。最初に木を回転させて実験してみましたが、木を背骨に回転させることはすでにO(h)です。

3
簡潔なデータ構造調査?
今月のFischerの論文は、簡潔なデータ構造とそれらを使用するためのアルゴリズムの技術について、私がほとんど知らないことを思い出させてくれました。 簡潔なデータ構造がわからない場合: a(n)個の明確な構成と既知の「有用な」表現備えた組み合わせ構造が与えられます。約ビットの記憶域を取りながら、通常の表現できる限り高速に操作を実行できる「簡潔な」データ構造は ありますか?R (n )R(n)R(n)lg(a (n ))lg⁡(a(n))\lg(a(n))RRR 誰もが議論を楽しませたい場合に私が興味を持っているトップのもの サフィックス配列。それらはすべての順列のサブセットです。 順序付けられた木。これらは、すべてのバイナリ「括弧」文字列のサブセットです(一致する多様性)。 紙(1)のように、最も近いすべての小さい値。両方の次元で圧縮できるだけではありません。一方向の許容される「より小さい値」配列は、リスト小さなサブセットであるため、ビット未満を格納する必要があります。{ 0 、。。。、n − 1 }n{0、。。。、n−1}n\{0,...,n-1\}^nnはLG(n)nlg⁡(n)n \lg(n)

1
スプレイツリーの潜在的な機能:サイズのログを合計する理由
私はデータ構造に関するコースを教えており、来週初めにスプレーツリーを取り上げます。スプレーツリーに関する論文を何度も読んでおり、データ構造の背後にある分析と直感に精通しています。ただし、SleatorとTarjanが分析で使用する可能性のある機能について、確かな直観を見つけることはできません。 分析は、ツリー内の各要素に任意の重み割り当て、ノードのサイズs (x )をxをルートとするサブツリー内のノードの重みの合計に設定することにより機能します。次に、この値のログを取得してノードのランクr (x )を取得します。したがって、r (x )= log s (x )です。最後に、ツリーの潜在的な関数は、すべてのノードのランクの合計として定義されます。w私wiw_is (x )s(x)s(x)バツxxr (x )r(x)r(x)r (x )= ログs (x )r(x)=log⁡s(x)r(x) = \log s(x) この潜在的な機能が正しく機能し、分析を追跡できることは理解していますが、なぜこの潜在的な機能を選択するのかわかりません。サイズを合計すると、ツリーの重み付きパス長が得られるため、各ノードにサイズを割り当てるという考えは理にかなっています。しかし、なぜ彼らが重みのログを取得し、代わりにそれらを合計することにしたのかを理解することはできません-これに対応するツリーの自然なプロパティは表示されません。 スプレーツリーの潜在的な機能は、ツリーの自然な特性に対応していますか?「うまくいく」以外に、彼らがこの可能性を選択する特別な理由はありますか?(この一連のコースノートでは、「分析は黒魔術です。[N] oがどのように発見されたか」ということに言及しているため、特に興味があります。) ありがとう!

3
フィンガーツリー構造のブートストラップ
2-3本のフィンガーツリーをかなりの時間使用した後、ほとんどの操作でそのスピードに感銘を受けました。ただし、私が遭遇した1つの問題は、大きなフィンガーツリーの最初の作成に関連する大きなオーバーヘッドです。構築は一連の連結操作として定義されるため、不必要な多数のフィンガーツリー構造を構築することになります。 2本から3本の指の木は複雑であるため、それらをブートストラップするための直感的な方法は見当たらず、すべての検索が空になりました。質問は、2〜3本の指のツリーを最小限のオーバーヘッドでブートストラップする方法です。 明示的に:既知の長さnのシーケンスが与えられると、最小限の操作でSのフィンガーツリー表現を生成します。SSSnnnSSS 素朴な方法は、cons操作(文献では ' '演算子)を連続して呼び出すことです。しかしながら、これは、作成するn個のすべてのスライスを表す異なる指ツリー構造Sのための[ 1 .. I ]を。◃◃\triangleleftnnnSSS[1..i][1..i][1..i]

2
ほぼ同じサイズのtreapのようなデータ構造の高速結合
所与2本のAVL木T1T1T_1及びT2T2T_2及び値trtrt_rよう∀x∈T1,∀y∈T2,x&lt;tr&lt;y∀x∈T1,∀y∈T2,x&lt;tr&lt;y\forall x \in T_1, \forall y \in T_2, x < t_r < y、それが含む新しいAVLツリーを構築することが容易であるtrtrt_rと値T1T1T_1及びT2T2T_2時間でO(1+|h(T1)−h(T2)|)O(1+|h(T1)−h(T2)|)O(1+|h(T_1) - h(T_2)|)、ここでh (T)h(T)h(T)はツリー高さを示しますTTT(ツリーが高さを保存している限り)。 これは赤黒木でも可能です。他の多くの種類のバランスの取れた木も同様に想定しています。 これは、盗用または盗用のようなデータ構造で可能ですか?を省略するとどうなりtrtrt_rますか? O (min (h (T1)、h (T2)))O(分(h(T1)、h(T2)))O(\min(h(T_1),h(T_2)))

1
ブルームフィルターハッシュ:もっと多い?
ブルームフィルターの実装では、従来のアプローチでは複数の独立したハッシュ関数が必要です。 KirschとMitzenmacherは、実際には2つしか必要とせず、残りを線形結合として生成できることを示しました。 私の質問は、2つのハッシュ関数と2倍のエントロピーを持つハッシュ関数の違いは何ですか? これは、ハッシュ関数の出力で実際に何をするかを見ることに由来します。(たとえば)64ビットのハッシュ値を取得して、ビットベクトルのサイズにスケーリングします。64。これは明らかにエントロピーを失う変換です(まれに、ハッシュサイズとフィルター容量が完全に一致する場合を除きます)。フィルターのエントリが2 32未満であると仮定して、64ビットハッシュ値を2つの32ビットハッシュに分割し、それらの線形結合を取得するのを止めるものは何ですか?またはそれを使用してPRNGをシードしますか? 言い換えれば、標準の偽陽性率を確実に保持するために、ブルームフィルターに挿入する各要素について、実際にどれだけの情報を知る必要がありますか?またはより一般的には、要素をどれだけうまく区別できるか(それらを記述するために使用するビット数)とブルームフィルターのパフォーマンスとの関係は何ですか? 確かに、フィルタサイズがmの場合、ビット、または同等に2 (lg (− n ln p)− 2 lg (ln 2 ))ビットでn個の要素を偽陽性の確率で格納できるようですp ....2 lg(m )2lg⁡(m)2\lg(m)mmm2 (lg(− n lnp)−2lg(ln2 ))2(lg⁡(−nln⁡p)−2lg⁡(ln⁡2))2(\lg(-n\ln{p}) - 2\lg(\ln2))nnnppp

2
複雑性分析における平方根のアイデアの注目すべき例
がk = \ sqrt nで最小値を取得するという考え方を活用するアルゴリズムとデータ構造がいくつかあります。一般的な例は次のとおりです。max{k,n/k}max{k,n/k}\max \left\{k, n/k\right\}k=n−−√k=nk=\sqrt n O(\ sqrt n)の離散対数を計算するためのベイビーステップジャイアントステップアルゴリズムO(n−−√)O(n)O(\sqrt n)、 O (n−−√)O(n)O(\sqrt n)時間およびO (n )O(n)O(n)メモリでの静的2D直交範囲カウント、 O(\ sqrt [k] n)に EXTRACT-MINがありO (n−−√k)O(nk)O(\sqrt[k] n)、O ( 1 )O(1)O(1)にDECREASE-KEYがある優先度キュー 多項式時間でO (n−−√)O(n)O(\sqrt n)色で3色のグラフを着色する、 ほんの数例を挙げます。 このようなアルゴリズムは多くの場合最適ではありませんが、学生は理解しやすく、素朴な境界が最適でないことをすぐに示すことができます。また、平方根のアイデアのデータ構造は、キャッシュの扱いやすさのために、バイナリツリーベースのデータ構造よりも実用的である場合があります(キャッシュを無視する手法を考慮していません)。だからこそ、教えながらこのトピックにかなりの注意を払っています。 この種のより特徴的な例に興味があります。だから私は、分析が平方根のアイデアに依存する(できればエレガントな)アルゴリズム、データ構造、通信プロトコルなどを探しています。それらの漸近は最適である必要はありません。

1
リストに順番を維持
注文のメンテナンスの問題(または「リスト内の注文の維持」)は、操作をサポートすることです。 singleton:1つのアイテムでリストを作成し、そのポインターを返します insertAfter:アイテムへのポインターを指定すると、そのアイテムの後に新しいアイテムを挿入し、新しいアイテムへのポインターを返します delete:アイテムへのポインタを指定すると、リストから削除します minPointer:同じリスト内のアイテムへの2つのポインターを指定すると、リストの先頭に近い方を返します 私は、償却時間ですべての操作を実行するこの問題に対する3つの解決策を知っています。それらはすべて乗算を使用します。O (1 )O(1)O(1) Athanasios K. Tsakalidis:一般化リンクリストでの順序の維持 Dietz、P.、D. Sleator、リスト内の順序を維持するための2つのアルゴリズム Michael A. Bender、Richard Cole、Erik D. Demaine、Martin Farach-Colton、およびJack Zito、「リスト内の順序を維持するための2つの簡略化されたアルゴリズム」 A C 0にない算術演算を使用せずに、償却時間のリストで順序を維持できますか?O (1 )O(1)O(1)A C0AC0AC^0

2
部分的に順序付けられた一連の要素のどの永続データ構造ですか?
タイプaの要素セットを保存する必要があります。タイプaは部分的に順序付けられているため、と比較すると、より小さい、大きい、等しい、または比較できない値が返される可能性があります。a1a1a_1a2a2a_2 ハッシュテーブルの問題の1つは、2つの等しい要素を別々に表現できることです。また、私は、等しいと一致するハッシュ関数にアクセスできません。 2つの要素の比較には時間がかかるため、比較を最小限に抑えることは興味深いでしょう。必要に応じて、比較演算子への呼び出しをメモすることができます。アンチチェーンを保存するだけでよいことを理解しました(または、そうすることを想定しましょう)。より正確には、実行する必要がある操作は次のとおりです。 アンチチェーンから要素を削除します。 要素を追加してみてください。要素がメンバーよりも小さい場合は追加しないでください。そうでない場合は、要素を追加して、それより小さい要素をすべて削除してください。 すべての要素を2つの整数でバインドすることもできます。そのため、およびであることがわかっている場合、知るとすぐにます。もちろん、は意味わけではありません...整数の境界を見つけることは、完全な要素比較に比べて比較的安価な操作です。私1&lt; a &lt; i2私1&lt;a&lt;私2i_1 < a < i_2私3&lt; b &lt; i4私3&lt;b&lt;私4i_3 < b < i_4私2&lt; 私3私2&lt;私3i_2 < i_3a &lt; ba&lt;ba < b私2≮ 私3私2≮私3i_2 \not< i_3≮ Ba≮ba \not < b

1
エッジの追加ごとにO(N ^ 2)よりも優れたオンライン推移閉包
私は、エッジの追加ごとにO(N ^ 2)未満の時間複雑度を持つ有向非巡回グラフの推移的閉包を維持するためのオンラインアルゴリズムを探しています。私の現在のアルゴリズムは次のようなものです。 For every new edge u-&gt;v connect all nodes in Pred(u) \cup { u } with all nodes in Succ(v) \ \cup { v }. O(N ^ 2)エッジの場合、これは、たとえばFloyd-Warshallよりもはるかに悪いO(N ^ 4)の総時間複雑度に変換されます。

2
外部メモリの指数関数的高速化
バックグラウンド 外部メモリ(DAMモデル)は、実行するI / Oの数(本質的に、キャッシュミスの数)によってアルゴリズムのコストを定義します。これらの実行時間は、一般の用語で与えられる、メモリのサイズ、及びB、一度にメモリに転送することができる単語の数。BとMにそれぞれLとZが使用される場合があります。 MMMBBBLLLZZZBBBMMM 例えば、ソーティングはコストが必要およびナイーブ行列乗算は必要とΘ (nは3 / Bを√Θ(N/BlogM/BN/B)Θ(N/BlogM/B⁡N/B)\Theta(N/B\log_{M/B} N/B)。 Θ(n3/BM−−√)Θ(n3/BM)\Theta(n^3/B\sqrt{M}) このモデルは、またはMの知識を持たない「キャッシュ忘却型アルゴリズム」の分析に使用されます。通常、目標は、キャッシュを無視するアルゴリズムが外部メモリモデルで最適に実行されることです。これは、たとえば、順列問題(Bradal、Faderberg 2003に示されている)のように、常に可能とは限りません。ソートおよび行列乗算の説明を含む、キャッシュを使用しないアルゴリズムの詳細については、Erik Demaineによるこの記事を参照してください。BBBMMM を変更すると、ソートの対数高速化と行列乗算の多項式高速化が発生することがわかります。(この結果は1981年のKung Hongからのものであり、実際にはキャッシュの忘却と外部メモリモデルの形式化の両方に先立っています)。MMM 私の質問はこれです: スピードアップが指数関数的になる場合はありますか?実行時間はf (N 、B )/ 2 O (M )のようなものになります。この説明に適合するキャッシュを意識しないアルゴリズムまたはデータ構造に特に興味がありますが、キャッシュを認識するアルゴリズム/データ構造、または最もよく知られている下限にも満足しています。MMMf(N,B)/2O(M)f(N,B)/2O(M)f(N,B)/2^{O(M)} 一般に、ほとんどのモデルでは、Nが入力サイズであり、明らかにM &gt; wである場合、ワードサイズと想定されます。次に、2 Mの高速化により、Nの多項式高速化が行われます。これは、私が探している問題が存在する場合、それは多項式ではないと信じさせます。(そうでない場合は、キャッシュサイズを定数で変更して、一定数のI / Oを取得できますが、これはありそうにないことです)。w=Ω(logN)w=Ω(log⁡N)w = \Omega(\log N)NNNM&gt;wM&gt;wM > w2M2M2^MNNN

2
ジッパーとは何ですか?また、それはツリーのような構造とどのように関連していますか?
私はLYAHの章を読んでいましたが、それは私にはあまり意味がありませんでした。ジッパーはツリーのような構造を任意にトラバースできることを理解していますが、それについて明確にする必要があります。また、ジッパーは任意のデータ構造に一般化できますか?

1
簡潔なデータ構造アルゴリズムの概要が必要
(すでにメインサイトで尋ねられましたが、ここでもより良い報道を求めています、申し訳ありません) 私は簡潔なデータ構造について知っていたので、私はその分野での最新の開発の良い概観を切望しています。 私はグーグルで検索して、頭からのリクエストに関するグーグルの検索結果の上部に表示される多くの記事を読みました。私はここで重要な何かを見逃したとまだ疑っています。 私にとって特に興味深いトピックは次のとおりです。 親、左/右の子、サブツリー内の要素数を取得する効率的な操作を使用した、バイナリツリーの簡潔なエンコード。 ここでの主な質問は次のとおりです。私が知っているすべてのアプローチは、このノードの呼吸優先順で列挙されたツリーノードを仮定します私の仕事に適しているようです。深さ優先レイアウトで指定された巨大なバイナリツリーを処理し、深さ優先ノードインデックスは他のノードプロパティのキーであるため、ツリーレイアウトを変更するにはコストを最小限に抑える必要があります。したがって、BFツリーレイアウト以外を考慮した作品への参照を取得することに関心があります。 外部メモリ内の大きな可変長アイテム配列。配列は不変です。アイテムを追加/削除/編集する必要はありません。唯一の要件は、O(1)要素のアクセス時間と可能な限り低いオーバーヘッドであり、単純なオフセットとサイズのアプローチよりも優れています。ここに、タスクの一般的なデータについて収集した統計をいくつか示します。 典型的なアイテムの数-数億、最大数千ミリアード; アイテムの約30%の長さは1 ビット以下です。 40%-60%のアイテムの長さは8ビット未満です。 32〜255ビットの長さを持つアイテムの数パーセントのみ(255ビットが制限です) 平均アイテム長〜4ビット+/- 1ビット。 アイテムの長さのその他の分布は理論的には可能ですが、実際に興味深いケースはすべて上記に近い統計値を持っています。 複雑な記事へのリンク、不明瞭なチュートリアル、文書化されたC / C ++ライブラリなど-似たようなタスクで役立つもの、または経験に基づいた推測でそのように見えるもの-すべてが感謝されます。 更新:質問1に追加するのを忘れました:扱っているバイナリツリーは不変です。それらを変更する必要はありません。ノードから子または親に常に移動するさまざまな方法でそれらを移動するだけで、そのような操作の平均コストはO(1)でした。 また、典型的なツリーには数千ノードのノードがあり、RAMに完全に保存するべきではありません。

1
線形探査のための5つの独立したハッシュ関数の再利用
線形探査によって衝突を解決するハッシュテーブルでは、期待されるパフォーマンスを確保するために、ハッシュ関数が5つの独立したファミリからのものであることが必要かつ十分です。(充足性:「一定の独立性を持つ線形探査」、Paghほか、必要性:「線形探査と最小賢明な独立性に必要なk独立性について」、PătraşcuおよびThorup)O (1 )O(1)O(1) 最速の既知の5独立家族が集計を使用していることは私の理解です。そのようなファミリから関数を選択するのは高価になる可能性があるため、Crosby and Wallachの「Denial of Service by Algorithmic Complexity Attacks」で説明されているアルゴリズムの複雑さの攻撃を防ぎながら、その回数を最小限に抑えたいと思います。私はタイミング攻撃(つまり、ストップウォッチを持つ敵)についてあまり心配していません。同じ機能を再利用するとどのような結果になりますか: いっぱいになったハッシュテーブルを成長させるとき? 十分ではないハッシュテーブルを縮小する場合 「削除」ビットが多すぎるハッシュテーブルを再構築する場合 では共通していくつかのキーが含まれていてもよい異なるハッシュテーブル?kkk では共通には、キーを含まない別のハッシュテーブル?kkk

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.