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

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

3
スライディングウィンドウの中央値を計算するための非自明なアルゴリズム
実行中の中央値を計算する必要があります: 入力: nnn、kkk、vector (x1,x2,…,xn)(x1,x2,…,xn)(x_1, x_2, \dotsc, x_n)。 出力: vector (y1,y2,…,yn−k+1)(y1,y2,…,yn−k+1)(y_1, y_2, \dotsc, y_{n-k+1})、ここでyiyiy_iはの中央値です(xi,xi+1,…,xi+k−1)(xi,xi+1,…,xi+k−1)(x_i, x_{i+1}, \dotsc, x_{i+k-1})。 (近似による不正行為はありません。正確な解を求めます。要素xixix_iは大きな整数です。) サイズ探索木を維持する簡単なアルゴリズムがありkkkます。合計実行時間はO(nlogk)O(nlog⁡k)O(n \log k)です。(ここで「検索ツリー」とは、対数時間での挿入、削除、および中央値クエリをサポートする効率的なデータ構造を指します。) しかし、これは私には少し愚かなようです。中央値だけでなく、サイズkのすべてのウィンドウ内のすべての順序統計を効果的に学習します。さらに、特にkが大きい場合、これは実際にはあまり魅力的ではありません(大きな検索ツリーが遅くなる傾向があり、メモリ消費のオーバーヘッドが自明ではなく、キャッシュ効率が悪いことが多いなど)。kkkkkk 大幅に改善できることはありますか? 下限はありますか(たとえば、単純なアルゴリズムは比較モデルに漸近的に最適ですか)。 編集:デビッドエップスタインは、比較モデルのための素敵な下限を与えました!それにもかかわらず、些細なアルゴリズムよりも少し賢いことをすることは可能だろうか? たとえば、これらの線に沿って何かを行うことができます。入力ベクトルをサイズ部分に分割します。各部分をソートします(各要素の元の位置を追跡します)。そして、区分的にソートされたベクトルを使用して、補助データ構造なしで実行中の中央値を効率的に見つけますか?もちろん、これはまだO (n log kkkkですが、実際には、配列のソートは検索ツリーを維持するよりもはるかに高速になる傾向があります。O(nlogk)O(nlog⁡k)O(n \log k) 編集2: Saeedは、検索ツリー操作よりもソートの方が速いと思う理由をいくつか見たいと思っていました。以下は、、n = 10 8の非常に簡単なベンチマークです。k=107k=107k = 10^7n=108n=108n = 10^8 ≈8s:それぞれk個の要素を持つベクトルをソートn/kn/kn/kkkk ≈10s:要素を持つベクトルの並べ替えnnn ≈80s:サイズkのハッシュテーブルでの挿入と削除nnnkkk ≈390s:サイズkのバランスの取れた検索ツリーでの挿入と削除nnnkkk ハッシュテーブルは比較のためだけにあります。このアプリケーションでは直接使用しません。 要約すると、ソートとバランスの取れた検索ツリー操作のパフォーマンスにはほぼ50倍の差があります。そして、を増やすと事態はさらに悪化します。kkk (技術的詳細:データ=ランダムな32ビット整数。コンピューター=典型的な最新のラップトップ。テストコードはC ++で記述され、標準ライブラリルーチン(std :: sort)とデータ構造(std :: …

4
高度なデータ構造のハンドブック
Cormen、Leiserson、Rivest、Steinの「Introduction to Algorithms」などの標準的な教科書に記載されているものを超える、高度なデータ構造に関する本を探しています。 Erik DemaineやMIT のAndréSchulzのAdvanced Data Structuresコースなどの高度なデータ構造に関する大学院レベルのコースを教えるために使用できる本。データ構造の百科事典ハンドブックはさらに良いでしょう。


1
分割可能なスタック
次の2つの操作の対象となる一連のアイテムを維持できるデータ構造について、何が知られていますか? Push(x):シーケンスの最後にxを追加し、シーケンス内の位置の識別子を返します Extract(S):順序付けられていない識別子のセットを指定し、それらの位置のアイテムをシーケンスから削除し、削除されたアイテムのリストをシーケンス順に返します 必要に応じて、これを2つのスタックに分割する分割操作を備えたスタックまたはキューと考えることができます。抽出操作を使用してポップまたはデキュー操作を実装でき、抽出されたアイテムのシーケンスも配置できます別のスタックまたはキューに再び戻ります。 既に知っていること:シーケンスを二重リンクリストとして維持できます。各識別子はリンクリストノードへのポインタであり、各ノードには2つの無関係な要素の位置をすばやく比較できる位置番号も格納されます。シーケンス内。データ構造が進行するにつれて位置番号を更新することは難しくありません。すべて最大値正の整数になります。ここで、nはリスト内の現在のアイテム数です。このデータ構造では、抽出操作の唯一の難しい部分は、抽出されたアイテムを位置番号でソートすることです。抽出k個のアイテムがかかりO (kは√O (n )O(n)O(n)nnnkkkたとえば、FOCS 2002のHanとThorupの整数ソートアルゴリズムを使用してランダム化された時間を予想し、プッシュ操作には一定の時間がかかります。O (k logログk−−−−−−−√)O(klog⁡log⁡k)O(k\sqrt{\log\log k}) 私が知らないこと:時間で抽出を処理し、一定時間でプッシュすることは可能ですか?この問題に関する文献はありますか?整数ソートと同じくらい難しいですか?O (k )O(k)O(k) 動機:これは、グラフ描画にも応用できるCoffman-Grahamスケジューリングアルゴリズムでアイテムを注文するために必要な基本ステップです。Coffman-Grahamの難しい部分は、辞書式トポロジカル順序です。これは、異なる次数ごとに、残りの頂点によって誘導されたサブグラフ内のその次数を持つ頂点のシーケンスを維持することによって実行できます。次に、ゼロ次の頂点のシーケンスから最初の頂点繰り返し削除し、トポロジカル順序に追加します。以前に属していた次数からvの近傍を抽出し、次に小さい次数のシーケンスにプッシュします。したがって、O (k )vvvvvvO (k )O(k)O(k) このデータ構造の抽出操作の時間は、Coffman-Grahamアルゴリズムの線形時間実装につながります。 もともとこれを尋ねて以来、1976年にSethiがCoffman–Grahamアルゴリズムを線形時間で実装できる論文を見つけ、それをWikipediaのCoffman–Grahamアルゴリズムに関する記事に含めました。しかし、答えが何であるかはまだ知りたいです。

2
ガベージコレクションされたプログラミング言語で指定された最悪のデータ構造の実行時間を分析するとき、GCのコストを無視できますか?
私は自分の質問への答えが「はい」であると仮定してきたことに気付いたが、正当な理由はない。おそらく、ワーストケースのスローダウンのみを導入するガベージコレクターがあると思います。引用できる決定的なリファレンスはありますか?私の場合、純粋に機能的なデータ構造に取り組んでおり、これらの詳細が重要な場合は標準MLを使用します。O(1)O(1)O(1) そしておそらく、この質問は、たとえばJavaで指定されたデータ構造に適用されると、さらに関連性が高くなるでしょうか?Javaを使用するアルゴリズム/データ構造の教科書に関連する議論があるかもしれません。(SedgewickにはJavaバージョンがあることは知っていますが、Cバージョンにしかアクセスできません。)

6
圧縮センシングのアナログ
圧縮センシング、目標は、入力信号が圧縮(「スケッチ」)から効率的に回収することができるように、疎表現を有することが知られている巨大な入力信号の線形圧縮方式を見つけることです。より正式には、標準セットアップでは、信号ベクトルがあり、そのであり、圧縮表現はに等しく、AはR行n列の実数です。R \ ll nが必要な行列。圧縮センシングの魔法は、任意のkの高速(線形時間に近い)正確な回復を可能にするようにAを明示的に構築できることです。x∈Rnx∈Rnx \in \mathbb{R}^nA X A R N R « N A K∥x∥0&lt;k‖x‖0&lt;k\|x\|_0 < kAxAxAxAAARRRnnnR≪nR≪nR \ll nAAAkkk-sparse xxxとRRRのような小さなとしてO(kno(1))O(kno(1))O(k n^{o(1)})。最もよく知られているパラメーターはないかもしれませんが、これは一般的な考え方です。 私の質問は、他の設定でも同様の現象がありますか?つまり、入力信号は、必ずしもスパース性とは限らない複雑さの尺度に従って、「低複雑度ファミリ」から来る可能性があるということです。次に、必ずしも線形マップではない、効率的で正しい圧縮および解凍アルゴリズムが必要です。そのような結果は別の文脈で知られていますか?圧縮センシングのより「一般的な」理論についてはどう思いますか? (もちろん、圧縮センシングのアプリケーションでは、線形性とスパース性が重要な問題です。ここで尋ねる質問は、より「哲学的」です。)

1
(整数上で)線形乗算、加算、および比較にどれだけ近づけることができますか?
Accoring KWリーガンの記事「接続スター」:、彼はまだ加算、乗算、および比較です操作は線形時間で計算可能であるような整数の表現を見つけるためのオープンな問題であることを最後に言及します 整数の表現が存在するので、加算、乗算、比較はすべて線形時間で実行可能ですか?基本的に、線形時間の離散的に順序付けられたリングはありますか? (1)比較せずに、線形の時間の乗算と加算にどれだけ近づきますか ここでは、問題のサイズが異なる可能性があるため、整数サイズを変更できるデータ構造/アルゴリズムが必要になる場合があると想定しています。 (2)完全な問題については、整数の乗算、加算、比較の最適なスキームが見つかると想定できます。これら3つの操作の中で最も遅い(最悪の場合)線形時間にどれだけ近づけることができますか?そして、そのメモでは、他の操作はどれくらい速いでしょうか? 公式問題声明 EmilJeřábekが言及しているように、些細なケースを除外し、この質問の最悪のケースの動作に集中したいと思います。 したがって、非負の整数およびで、および、加算、乗算、および比較が可能なデータ構造/アルゴリズムを見つけることができますか\間と中の時間と空間?∀ Y 0 ≤ X &lt; N 0 ≤ Y &lt; N 、X 、Y O (N ログ(N ))O (ログ2 (nは))∀x∀x\forall x∀y∀y\forall y0≤x&lt;n0≤x&lt;n0 \le x < n0 ≤ Y&lt; n0≤y&lt;n0 \le y < nバツバツxyyyO (n ログ(n ))O(nログ⁡(n))O(n \log{(n)})O (ログ2(n ))O(ログ2⁡(n))O(\log^2{(n)})


1
セットファミリのセットインクルージョンポーズをどのくらい速く計算できますか?
ユニバースサブセットのセットファミリーが与えられます。ましょうし、答えがあると私たちが望む。FF\mathcal{F}UUUS1,S2∈FS1,S2∈FS_1,S_2 \in \mathcal FS1⊆S2S1⊆S2S_1 \subseteq S_2 私はこれに素早く答えることができるデータ構造を探しています。私のアプリケーションはグラフ理論からのもので、頂点とその近傍を削除すると孤立した頂点が残るかどうかを確認し、各頂点についてはそれが残すすべての孤立した頂点をリストします。 完全なポセットを作成するか、最終的にテーブルを作成して、どのセットが互いのサブセットであるかを正確に伝えます。|F|2|F|2|\mathcal{F}|^2 ましょ、および、と仮定するm=∑S∈F|S|m=∑S∈F|S|m = \sum_{S\in \mathcal{F}} |S|u=|U|u=|U|u = |U|n=|F|n=|F|n = |\mathcal{F}|u,n≤mu,n≤mu,n \leq m 我々が生成することができるに封じ込めマトリックス(二部グラフ)時間、次いで、全てのテーブルを作成することができにおける比較各セットのために、時間をすべての他のセットのすべての要素を介して、ループのないサブセットとしてセットをマークそれらは要素がでない場合。合計時間。n×un×un \times uO(un)O(un)O(un)n2n2n^2O(nm)O(nm)O(nm)S∈FS∈FS \in \mathcal{F}SSSSSSO(nm)O(nm)O(nm) 何かもっと速くできますか?特に、時間は可能ですか?O((n+u)2)O((n+u)2)O((n+u)^2) 関連記事をいくつか見つけました。 アルゴリズム を与えるサブセット部分順序(1995)を計算するための単純なサブ2次アルゴリズム。O(m2/log(m))O(m2/log(m))O(m^2 / log(m)) サブセット半順序:コンピューティングと組み合わせ論はやや上記だけでなく、上記の紙がで問題を解決することを主張向上時間、共通の要素を共有するセットの最大数であるが、私はこの結果を理解することができませんでしたが。O(md)O(md)O(md)ddd BetweenとO(nm)O(nm)O(nm)O(nα)O(nα)O(n^{\alpha})の記事で、著者は、行列乗算を使用して頂点の閉じた近傍を削除した後、接続されたコンポーネントをグラフで見つける方法を示しています。これを使用して、ランタイムがであるシングルトンであるすべてのコンポーネントを見つけることで、セットの包含ポーズを計算できます。O((n+u)2.79)O((n+u)2.79)O((n+u)^{2.79}) また、このフォーラムのディスカッションは関連しています: セットの包含をチェックする最も速い方法は何ですか? これは下限を意味します。O(n2−ϵ)O(n2−ϵ)O(n^{2-\epsilon})

4
データ構造同型
免責事項:私はCS理論家ではありません。 抽象代数から来て、私は同型に等しいものを扱うことに慣れていますが、この概念をデータ構造に変換するのに問題があります。最初に、まっすぐに設定された理論的な全単射射影で十分だと思っていましたが、私は非常に急速に壁にぶつかりました。 より制限的な(しかしより便利な)定義はありますか?(そうでない場合、なぜですか?)「構築されたデータ構造」のカテゴリの標準的な定義はありますか?

5
複数のパスでst-connectivityのスペース使用量を削減しますか?
グラフ仮定と頂点のストリームとして提示されているエッジが、複数のパスがストリーム上許されます。n mGGGnnnmmm Monika Rauch Henzinger、Prabhakar Raghavan、およびSridar Rajagopalanは、データにパスが許可されている場合、 2つの与えられた頂点間にパスがあるかどうかを判断するためにスペースが必要であることを観察しました。(テクニカルレポートバージョンも参照してください。)ただし、実際にこの限界を達成するためのアルゴリズムは提供されていません。最適なアルゴリズムは、現実的なコンピューティングモデルで実際に空間を取ると仮定します。これは、一定サイズのポインターを使用してメモリのインデックスを作成できない場合、異なる頂点を区別する必要があるためです。G k O ((nΩ (n / k)Ω(n/k)\Omega(n/k)GGGkkknO ((nログn )/ k )O((nlogn)/k)O((n\, \log\, n)/k)nnn どのようにして、グラフの接続性を決定することができ使用して渡しO ((nはkkkスペース?O ((nログn )/ k )O((nlogn)/k)O((n\, \log\, n)/k) 1つのパスのみが許可されている場合、入力データは頂点のセットのパーティションとして保存でき、2つの異なるセットの頂点間にエッジが見られる場合はセットをマージできます。これには明らかにスペース。私の質問は k &gt; 1についてです。必要なスペースを減らすために、どうすればより多くのパスを使用できますか?O(nログn )O(nlogn)O(n\, \log\, n)k &gt; 1k&gt;1k > 1 (自明性を避けるために、は定数でアプリオリに制限できないパラメーターであり、スペースの制限はnとkの両方の関数を含む式です。)kkknnnkkk 更新:場合でも、n / 2頂点のみを保存する方法があると本当に便利です。または、kに関係なく、定数cに対して実際にはより強い下限c nがありますか?k = 2k=2k=2n / 2n/2n/2c ncncnccckkk

2
最短経路のデータ構造
ましょうGGG有する重み付けされていない無向グラフである頂点とエッジ。を前処理し、サイズデータ構造を作成して、時間O(n)で「と間の距離」という形式のクエリに答えることは可能ですか?M G M ⋅ P O L Y L O G(N )UがVnnnmmmGGGM ⋅ P O リットルのY L O G(N )m⋅polylog(n)m \cdot \mathrm{polylog}(n)あなたはあなたはuvvv この問題は未解決にするには基本的すぎるようです。

2
最小内積クエリのデータ構造
検討Rを NRn\mathbb{R}^n標準内積を備えとベクトルが:。次の形式のクエリを許可するデータ構造を構築したい:given output。些細なO(nm)クエリ時間を超えることは可能ですか?たとえば、n = 2の場合、O(\ log ^ 2 m)をすぐに取得できます。⟨⋅,⋅⟩\langle \cdot, \cdot \ranglemmv1,v2,…,vmv_1, v_2, \ldots, v_mx∈Rnx \in \mathbb{R}^n分I ⟨ X 、V 、I ⟩ O (N M )、N = 2 O (ログ2メートル)mini⟨x,vi⟩\min_i \langle x, v_i \rangleO(nm)O(nm)n=2n = 2O(log2m)O(\log^2 m) 私が思いつくことができる唯一のものは次のとおりです。ジョンソン・リンデンシュトラウスの補題の直接の結果であり、すべてのε &gt; 0ε&gt;0\varepsilon > 0および\ mathbb {R} ^ n上の分布DD\mathcal{D}に対して、線形マッピングf \ colon \ mathbb …

2
成長する無向グラフのバランスの取れたスパニングツリーを維持する
グラフに新しいノード/エッジを追加する際に、グラフの比較的バランスの取れたスパニングツリーを維持する方法を探しています。 単一のノード、「ルート」として開始する無向グラフがあります。 各ステップで、新しいノードとグラフに接続するエッジ、または2つの古いノードを接続する新しいエッジのいずれかをグラフに追加します。グラフを成長させると、スパニングツリーが維持されます。ほとんどの場合、これは、新しいノードとエッジを追加するときに、新しいノードを接続先の古いノードの子に設定することを意味します。 新しいノードを追加する順序を制御することはできません。そのため、上記のツリー構築アルゴリズムは明らかに、不均衡なスパニングツリーにつながる可能性があります。 再ツリー化で行われる作業量を最小限に抑えながら、スパニングツリーを「比較的バランスの取れた」状態に保つオンラインヒューリスティックを知っている人はいますか?ツリー構造を完全に制御できます。私が制御できないのは、グラフの接続性、または新しいノードが追加される順序です。 「balanced」、「spanning」、「tree」などの用語に対するGoogleの標準的な応答は、どちらも当てはまらないバイナリツリーとBツリーのように見えることに注意してください。グラフノードには任意の数の隣接ノードを含めることができるため、ツリーノードには2つのバイナリツリーのような2つではなく、任意の数の子を含めることができます。Bツリーは、隣接リストを変更することでバランスを維持しますが、グラフの接続を変更することはできません。

5
計算可能な数が有理数か整数かをテストすることはできますか?
計算可能な数が有理数か整数かをアルゴリズムでテストすることはできますか?言い換えれば、それは道具計算数字は機能を提供するために、そのライブラリは可能でしょうisIntegerかisRational? 私はそれが不可能であると推測し、これは何らかの形で2つの数値が等しいかどうかをテストすることができないという事実に関連していると推測していますが、それを証明する方法はわかりません。 編集:計算数はxxxの関数で与えられるfx(ϵ)fx(ϵ)f_x(\epsilon)の合理的な近似値を返すことができxxx高精度でϵϵ\epsilon:|x−fx(ϵ)|≤ϵ|x−fx(ϵ)|≤ϵ|x - f_x(\epsilon)| \leq \epsilonいずれについても、ϵ&gt;0ϵ&gt;0\epsilon > 0。このような関数を考えると、それがあれば、テストすることが可能であるx∈Qx∈Qx \in \mathrm{Q}またはx∈Zx∈Zx \in \mathrm{Z}?
18 computability  computing-over-reals  lambda-calculus  graph-theory  co.combinatorics  cc.complexity-theory  reference-request  graph-theory  proofs  np-complete  cc.complexity-theory  machine-learning  boolean-functions  combinatory-logic  boolean-formulas  reference-request  approximation-algorithms  optimization  cc.complexity-theory  co.combinatorics  permutations  cc.complexity-theory  cc.complexity-theory  ai.artificial-intel  p-vs-np  relativization  co.combinatorics  permutations  ds.algorithms  algebra  automata-theory  dfa  lo.logic  temporal-logic  linear-temporal-logic  circuit-complexity  lower-bounds  permanent  arithmetic-circuits  determinant  dc.parallel-comp  asymptotics  ds.algorithms  graph-theory  planar-graphs  physics  max-flow  max-flow-min-cut  fl.formal-languages  automata-theory  finite-model-theory  dfa  language-design  soft-question  machine-learning  linear-algebra  db.databases  arithmetic-circuits  ds.algorithms  machine-learning  ds.data-structures  tree  soft-question  security  project-topic  approximation-algorithms  linear-programming  primal-dual  reference-request  graph-theory  graph-algorithms  cr.crypto-security  quantum-computing  gr.group-theory  graph-theory  time-complexity  lower-bounds  matrices  sorting  asymptotics  approximation-algorithms  linear-algebra  matrices  max-cut  graph-theory  graph-algorithms  time-complexity  circuit-complexity  regular-language  graph-algorithms  approximation-algorithms  set-cover  clique  graph-theory  graph-algorithms  approximation-algorithms  clustering  partition-problem  time-complexity  turing-machines  term-rewriting-systems  cc.complexity-theory  time-complexity  nondeterminism 

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