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

アルゴリズムで有利に使用できるようにデータを保存する方法に関する質問。

3
順序付けで他の2つの要素の「間に」要素を挿入できる効率的な順序付けを維持していますか?
次のような要素の束に注文があると想像してください: 矢印は意味します。また、推移的です:。X←YX←YX \leftarrow YX&lt;YX&lt;YX < Y(X&lt;Y)∧(Y&lt;Z)⟹(X&lt;Z)(X&lt;Y)∧(Y&lt;Z)⟹(X&lt;Z)\left(X < Y\right) \wedge \left(Y < Z\right) \implies \left(X < Z\right) ようなクエリに効率的に応答するには、何らかのラベル付けまたはデータ構造が必要です。たとえば、左から右へのノードに番号を付けることができ、従って、単にクエリに答えるために比較整数行うことができます:{}?A \ stackrel {&lt;} D \ 1 &lt;4を意味\ Tを暗示。次のようになります。A&lt;?DA&lt;?DA \stackrel {?}{<} DA&lt;?D⟹1&lt;4⟹TA&lt;?D⟹1&lt;4⟹TA \stackrel {?}{<} D \implies 1 < 4 \implies T 番号は順序であり、文字は単なる名前です。 しかし、次のように、順序付けで他の2つの要素の「間に」要素を挿入する必要がある場合はどうでしょう。 どのようにしてそのような順序を維持できますか?単純な番号付けでは、使用する整数の間に「2,3」がないという問題に遭遇2,32,32,3します。

1
ary配列のO(1)時間範囲クエリのビット複雑度
次の問題を検討してください。 してみましょうkkk一定です。我々は、与えられた進アレイのとのが。ましょ。A d 1 × … × d k 0 1 N = ∏ k i = 1 d ikkkAd1×…×dkAd1×…×dkA_{d_1\times\ldots\times d_k}000111N=∏ki=1diN=∏i=1kdiN = \prod_{i=1}^k d_i 次のタイプのクエリ操作を実行するためにを前処理ことにより、データ構造を作成したいとします。AAA aryボックスの座標を考えると、ボックスにはがありますか? D 1kkkDDD111 aryボックスの座標を指定して、ボックス内のの位置を返します(存在する場合)。D 1kkkDDD111 操作は一定時間で実行する必要がありますO(1)O(1)O(1)。時間の複雑さは、RAMマシンで測定されます。データ構造の前処理の時間とスペースは、私たちにとって重要ではありません。 問題は、上記の操作を可能にするデータ構造を格納するために必要なスペース(ビットの複雑さ)の量です。 これらのクエリに対して配列を再構築できるため、自明な下限はNNNビットです(したがって、データ構造には少なくとも同じ量の情報が含まれている必要があります)。 自明な上限は、すべてのクエリに対する回答を格納することです。これには、ビットが必要です。ただし、これははるかに効率的に実行できると思われます。∏ki=1(di2)=Θ(N2)∏i=1k(di2)=Θ(N2)\prod_{i=1}^k {d_i \choose 2} = \Theta(N^2) たとえば、である特殊なケースを考えます。この場合、最初の問題を解決するために簡潔なRMQデータ構造を使用できます。データ構造の格納にはビットかかります。k=1k=1k=12N+o(N)2N+o(N)2N+o(N) このタスクの効率的なデータ構造は何ですか? スペースの複雑さ(ビット数)は、これらの操作(または最初の操作のみ)をサポートするためにどれだけ低くできますか? アップデート(1/15): 特殊なケースでは使用して、ビットは、実際によりよい(十分であるここで、数であるの)は、問題を先行問題に削減し、先行問題から完全に索引付け可能な辞書(FID)への削減を使用することによって。Grossi、Orlandi、Raman、およびRao(2009)による「より速く、より少ない無駄:完全に索引付け可能な辞書の冗長性を下げる」を参照してください。k=1k=1k=1N+o(N)N+o(N)N +o(N)log(Nt)+O(t)log⁡(Nt)+O(t)\log {N\choose t}+O(t)ttt111AAA 更新(6/27): 問題をRMQに減らします。YuanとAtallahによる次元のRMQ を使用して、が固定されている場合に必要なスペース量の上限を取得し。kkkO(nlogn)O(nlog⁡n)O(n\log …

1
一般的な(四面体ではない)細胞複合体のデータ構造
2Dポリゴンメッシュの場合、QuadEdgeおよびHalfEdgeのデータ構造表現は、すべてのトポロジー情報と発生率情報の効率的なクエリを格納および有効化するのに十分です。3D多面体メッシュのコンパクトで効率的なデータ構造はありますか?最近では、たとえばSOTなどの四面体メッシュのコンパクトな表現に関する作業がいくつか行われています。これらが構造化されていない非四面体メッシュに一般化されるかどうかを知るには、これらについて十分に知りません。 ハーフエッジは、関連するハーフエッジを持つハーフフェースに一般化される可能性があると想像できますが、それは格納する大量のデータのようであり、よりコンパクトな表現があるかもしれません。私は本当にファセット情報(どのファセットが境界上にあるか、どのファセットが特定のセルに属しているかなど)を取得することだけに関心があることを付け加えておきます。エッジ発生率の情報はそれほど役に立ちません。


1
ヒープソートの最悪のケースを見つける
ACM ICPC 2004–2005 Northeastern European contestで問題Hに取り組んでいます。 問題は基本的に、ヒープを構築するためのアルゴリズム(シフトダウン)で最大数の交換を生成する最悪のケースを見つけることです。 入力:入力ファイルにはが含まれています()。nnn1≤n≤50,0001≤n≤50,0001 \le n \le 50{,}000 出力:ヒープになるように、からまでの異なる整数を含む配列を出力します。これをソートされた配列に変換すると、シフト操作の交換の合計数が最大になります。nnn111nnn 入力例:6 対応する出力:6 5 3 2 4 1 そして基本的な出力: [2, 1] [3, 2, 1] [4, 3, 1, 2] [5, 4, 3, 2, 1] [6, 5, 3, 4, 1, 2]

1
ミニマックスツリーの最小値は何に使用されますか?
敵対的な検索問題のためにミニマックスツリーを検討してください。たとえば、次の図では(アルファベータ剪定): 木をマークするとき [min,max][min,max][\min,\max]値がボトムアップの場合、最初にノード333をトラバースし、B. \ max = 3を割り当てますB.max=3B.max=3B.\max = 3。次に、121212と888をこの順序でトラバースします。これにより、B.max=3B.max=3B.max = 3ます。 しかし、なぜB.min=3B.min=3B.\min = 3でしょうか。その値の用途は何ですか?

1
インクリメンタルな強連結コンポーネント
変化する有向グラフについて、強く接続されたコンポーネントに関する情報を維持したいと思います。グラフ操作はインクリメンタルです。頂点の追加とエッジの追加のみです。これらの操作で最もよく知られている償却済みの複雑さを実現するデータ構造はどれですか。 グラフが無向の場合、答えはunion-find構造になります。また、無向グラフは有向グラフの特殊なケースと見なすことができるので、(少しでも)超定数の下限が引き継がれます。 線形の上限の場合、強連結成分は、データをまったくリサイクルせずに、エッジを追加するたびに最初から計算できます。もっと上手にできる方法があるのか​​な。 これが必要な状況では、どういうわけか、重要なSCCはルールではなく例外であることを期待しています。そして、サイクルの不在の中で、私は合計で線形時間を達成することができます(つまり、操作ごとの一定時間の償却)[編集:]どういう意味かを明確にしましょう。もちろん、不在のサイクルでは、SCCを追跡する必要はまったくありません。償却された一定の時間は、SCCを心配する以外に、私の設定で行うことです。 したがって、一般的には、上記の上限よりは良くないが、グラフがDAGのままである限り、操作ごとに一定の償却時間を使用するデータ構造にも関心があります。

1
可変2D配列のプレフィックス合計
M[n][n]整数の2D配列があるとしましょう(実際、バイナリは問題ありませんが、問題ではないかと思います)。次の形式のクエリの繰り返しに興味があります。座標ペア与えられた場合、は何 もちろん、これらの値はすべて合計時間で計算でき、その後、クエリはます。ただし、私の配列は変更可能であり、値を変更するたびに、明らかな解決策として更新が必要です。k,lk,lk,lΣi = 0k − 1Σj = 0l − 1M[ i ] [ j ] ?∑i=0k−1∑j=0l−1M[i][j]? \sum_{i = 0}^{k-1} \sum_{j = 0}^{l-1} M[i][j]? O(ん2)O(n2)\mathcal O(n^2)O(1)O(1)\mathcal O(1)O(ん2)O(n2)\mathcal O(n^2) 上に四分木を作成できますM。前処理にかかる、これは私たちが行うことができ、クエリで、およびアップデートで。O(ん2ログ(n ))O(n2log⁡(n))\mathcal O(n^2\log(n))O(nログ(n ))O(nlog⁡(n))\mathcal O(n\log(n))O(log(n))O(log⁡(n))\mathcal O(\log(n)) 私の質問は: 更新をあまり犠牲にすることなく、クエリを大幅に改善できますか? 特に、更新操作とクエリ操作の両方を準線形にしたり、特に両方をしたりすることに興味があります。O(んε)O(nϵ)\mathcal O(n^\epsilon) 編集:詳細については、この制限なしでも問題は興味深いと思いますが、大まかにクエリを実行し、更新することを期待しています。理想的な目標は、実行時間全体を約です。したがって、クエリがをするのに、更新がをする状況も興味深いでしょう。O(ん3)O(n3)\mathcal O(n^3)O(ん2)O(n2)\mathcal O(n^2)O(ん3 + ϵ)O(n3+ϵ)\mathcal O(n^{3+\epsilon})O(nログ(n ))O(nlog⁡(n))\mathcal O(n \log(n))O(ログ(n ))O(log⁡(n))\mathcal O(\log(n))

3
二分探索木の「ランク」とは何ですか、またどのように役立ちますか?
ランク付けされた二分探索木とは何か、なぜランク付けが重要なのかについて、ちょっと心に納得できません。誰かが私のためにいくつかのことを明確にしてくれることを期待しています。 調べた内容: 私が読んだことから、ランク付けされた二分探索木は、各ノードに変数「ランク」が付加されているツリーです。 ここでの質問では、誰かが二分探索木のノードのランクを決定するために次のことができると述べています: ランクをゼロから始めます。バイナリ検索がルートから下に進んでいくときに、検索がスキップするすべての左側のサブツリーのサイズを合計します。また、検索されたアイテムよりも小さいパスに沿ったノードも含めます。これらは、検索パス上の正しい子の親にすぎません。 質問: ランクは、ツリー内の特定のノードに到達するために必要なノードの数(ルートの場合は1つ)を反映する単なる数値のようです。そうですか?それだけではノードのランクがノードの深さと同じになるだけのように思われるので、それは私には正しくないと思われました。 また、「重量」と「ランク」の違いは何ですか?特定のバイナリ検索ツリーのノードに重みが付けられている場合、それはユーザー/開発者によってランダムな値が割り当てられているだけですか? 最後に、ランクを付ける意味は何ですか?私の最初の考えは、優先順位を示すために使用できるということです。しかし、その場合、開発者はなぜウェイトを使用しないのですか? その他:ここ のサイトも確認しました。ランクの計算方法を説明していますが、まだ概念が理解できていません。 助けてくれてありがとう。

3
対数時間で共通の最小値を見つける
空でない交差があることがわかっているサイズ 2つのインスタンスが与えられ、交差の最小要素が時間で見つかるようなセットを格納するデータ構造を探しています。これは、最悪の場合または償却後の複雑さのどちらでも達成できますか?データ構造の他の要件:削除、初期化。O (n )O(n)O(n)O (ログn )O(log⁡n)O(\log n)O (ログn )O(log⁡n)O(\log n)O (n ログn )O(nlog⁡n)O(n \log n) 要件を明確にするために、このようなデータ構造の適用例を次に示します。入力は、すべて番号nを含むのn個のサブセットで構成されます。出力はn行n列の行列で、そのエントリはセットiとjの共通部分の最小要素です。基本的なアプローチで、この問題を時間で解決できます。上記の条件を満たすデータ構造では、時間で解くことができ。{ 1 、。。。、n }{1,...,n}\{1, ..., n\}私、ji,ji, jO (ん3)O(n3)O(n^3)O (ん2ログn )O(n2log⁡n)O(n^2 \log n)

1
メンバーシップのクエリのすべてのサブセットをテストするためのデータ構造
次の操作を効率的にサポートするデータ構造はありますか? セットを追加 セットのサブセットが追加されたかどうかを照会します。 これは、すべてのクエリ中にすべての追加セットをテストすることにより、線形オーバーヘッドで実装できます。より効率的に実装できますか?偽陽性/陰性の小さな確率は許容されます(ブルームフィルタースタイルなど)。

2
私たちはより良いことができますか
この質問に対する答えは「いいえ」であると、私は(愚かにも判明しました)確信しています。なぜ私は尋ねるのですか? それは、EPFLの並列プログラミングコースのAleksandar Prokopec博士が、さまざまな特性を主張するデータ構造を導入しているためです。これらの特性は保持している場合、そうです、私により良いでバランスの取れたバイナリツリーを構築することが可能でなければならないこと時間。O ( nログn )O(んログ⁡ん)O(n\log n) 私はこれを信じていないので、私の考えのどこに欠陥があるのだろうと思います。 データ構造は、conc-treeリストです。標準形式では、通常のバイナリツリーのように見えconcat、ノードの左右のサブツリーの高さが2以上異なることがないことを保証する操作が付属しています。予想通りconcat、複雑さはです。O (ログn )O(ログ⁡ん)O(\log n) しかし、リストと呼ばれるコンクツリーリストのビルダーバリアントがありAppendます。このバリアントは、複数のサブツリーで一時的な高さの違いを可能にします。このバリアントでは、償却済み時間の追加が要求されます。O (1 )O(1)O(1) そのため、要素を追加すると複雑さが必要になるようです。んんnO (n )O(ん)O(n) ただし、このバリアントの特徴は、が2の累乗であるときは常に、完全にバランスのとれた二分木(これまでに挿入されたすべての要素を含む)になることです。したがって、一時的な不均衡は許容されますが、ツリーは2挿入のすべてのパワーで均衡になります。んんn このバリアントでは、ノードと呼ばれる新しいクラスのノードAppendが導入され、サブツリーの高さが1つ以上異なることが許可されているノードです。ただし、挿入ごとに、このような一時ノードはすべて削除されます。2k2k2^k Wikipediaのページのページは、(基本的なデータ構造の記述と見かなり簡潔なアルゴリズムを説明しappend、特定のメソッドを)。 したがって、が2の累乗の場合、要素を挿入するためのコストはあり、バランスのとれたバイナリツリーを構築しました。またはそうです。んんnO (n )O(ん)O(n) で別の質問私は、特定の値のためのアルゴリズムのためのステップ数を述べることができる場合、私は効果的に」尋ねのために例えば、、整数である、私は複雑さを述べるできるようにするには、この十分ですすべての値?」んんnn =2kん=2kn = 2^kkkkんんn Yuval Filmusの答えから、答えは「いいえ」であることがわかりますが、「多くの場合、はで単調であると予想されます。その場合、控除は成立します。」TTTんんn したがって、この場合、要素の挿入に複雑さあり、要素ごとに平衡バイナリツリーがある場合、このコンクツリーバリアントアプローチで平衡バイナリツリーを構築するコストは。んんnO (n)O(ん)O(n)2k2k2^kO (n )O(ん)O(n) ここで何が問題になっていますか?正直に言うと、このバリアントに対して要求された償却済み追加時間がわかりません。多くの場合、挿入にはコストがかかりますが、一時ノードで何が起こっているかを見ると、全体的な挿入コストは償却されたように見え。O (1 )O(1)O(1)O (1 )O(1)O(1)AppendO (ログん)O(ログ⁡ん)O(\log n) これが当てはまる場合、バランスの取れたバイナリツリーを構築すると、驚くほどのコストがかかります。O (nログn )O(んログ⁡ん)O(n\log n) 長い質問で申し訳ありませんが、問題のアルゴリズムについて詳しく説明していません。代わりに、ウィキペディアを見回してください。

2
ソートされた配列に対するヒープの利点は何ですか?
私はヒープにかなり慣れていないので、ソートされた配列がデフォルトで最小/最大プロパティを提供しているように見えるときに、最小ヒープと最大ヒープがツリーとして表される理由に頭を抱えようとしています。 そしてフォローアップ:クイックソートのようなアルゴリズムがソートを非常にうまく処理する場合、ヒープへの挿入の複雑さを処理する利点は何ですか? コンテキスト:私はPythonでCLRS / MIT 6.006を使用していて、葉の値の整数表現しか見ていません。これは、各リーフに簡単にソートできない構造体が含まれているCなどの言語でより適切ですか?


2
なぜ最小優先度キュー(ヒープベース)で、「セットキー」だけでなく「減少キー」と呼ばれるのですか?
min-priorityキューで減少キーを呼び出すとき、基本的にキーを設定しているので、誤って高いキーを置くことができますよね?では、なぜ「set-key」または「update-key」と呼ばれないのでしょうか。なぜ(ウィキペディアや他のソースによると)最小優先度キューに「減少キー」があり、最大優先度キューに「増加キー」があるのですか?「set-key」の両方がないのはなぜですか。それを減らすか増やす場合は、ヒーププロパティを不変に保つために何をすべきですか。 つまり、最小ヒープで減少キーを呼び出して、より大きな値を指定するとどうなるでしょうか。例外をスローしますか?「set-key」と呼んで、あらゆる種類の値を処理しないのはなぜですか。

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