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

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

2
O(1)プッシュ/ポップ時間を使用して、3つのスタックを1つのアレイに実装できますか?
2つのスタックは、1つの固定サイズの配列を使用して効率的に実装できます。スタック#1は左端から始まり、右に向かって成長し、スタック#2は右端から始まり、左に向かって成長します。3つのスタックで同じことは可能ですか? より具体的には、次の条件を前提として、3つのスタックを実装することは可能ですか? N個のオブジェクトを保持できる固定サイズの配列があります。 3つのスタックサイズの合計が<Nである限り、push()は失敗しません。 push()とpop()の両方の操作にO(1)時間かかるはずです。 配列に加えて、O(1)の追加スペースのみを使用できます。 これらの要件を満たさないソリューションの例を次に示します。 配列を3つの固定部分に分割し、各部分をスタックに使用する(違反2)。 上記と同様ですが、スタック間の境界が移動可能です(違反3)。 単純なリンクリストベースの実装(違反4)。 それらがすべての条件(1)〜(4)を正確に満たしていない場合でも、自明ではないアルゴリズムまたは不可能性の証明を受け入れます。たとえば、プッシュ/ポップがO(1)の償却時間をとるアルゴリズム、または追加メモリはO(N)よりも小さい(例:O(log N))。または、たとえば、プッシュ/ポップごとに配列の5未満の要素にアクセスすることは不可能であることを示す不可能性の証明。

2
準線形クエリ時間を使用して、合計が
これが最近傍問題です。 実数(非常に大きいn!)にターゲットの実数pを加え、SUMがpに最も近いa iとa jを見つけます。当社は、合理的な前処理/インデックス許可1、... 、nは(最大Oを(N ログN ))が、(特定のクエリ時にP例えば、()、結果は非常に速く返されるべきO (ログn個)時間)。a1,…,ana1,…,ana_1, \ldots, a_nnnnpppaiaia_iajaja_jpppa1,…,ana1,…,ana_1, \ldots, a_nO(nlogn)O(nlog⁡n)O(n \log n)pppO(logn)O(log⁡n)O(\log n) (より単純な例:pに最も近いSINGLE だけが必要な場合は、1、… 、a nオフライン、O (n log n )をソートしてから、クエリ時にバイナリ検索を実行しますO (log n ))。aiaia_ipppa1,…,ana1,…,ana_1, \ldots, a_nO(nlogn)O(nlog⁡n)O(n \log n)O(logn)O(log⁡n)O(\log n) 機能しないソリューション: 1)1、… 、a nをオフラインでソート、次にクエリ時に両端から開始して2つのポインターを内側に移動します(http://bit.ly/1eKHHDy)。O (n )クエリ時間のため、良くありません。a1,…,ana1,…,ana_1, \ldots, a_nO(n)O(n)O(n) 2)1、… 、a nをオフラインでソートしクエリ時に、各a iを取得して、 pに近いものに合計するのに役立つ「バディ」をバイナリ検索します。O (n log n )クエリ時間のため、良くありません。a1,…,ana1,…,ana_1, \ldots, a_naiaia_ipppO(nlogn)O(nlog⁡n)O(n …

1
Heapsort:Heaps =〜Quicksort:BSTs =〜Mergesort:___?
タイトルの簡潔さをお許しください。簡潔さの祭壇の明快さを犠牲にしたかもしれません。 配列の要素をバイナリ検索ツリーに挿入し、それらを読み戻すには、その配列に対してQuicksortを実行する場合と同じ比較が(挿入時に)必要であることがわかります。Quicksortが使用するピボットのシーケンスは、バイナリ検索ツリーへの挿入のシーケンスです。 Heapsortは文字通りそのような一連の挿入を行ってから要素を読み戻すため、これはHeapsortとheapsにも当然当てはまります。 たとえば、マージソートの場合、これに類似するものはありますか?ここにはより深いつながりがありますか、それともデータ構造と並べ替えアルゴリズムの間の興味深い一致ですか?

2
と準線形空間におけるほぼ普遍的な文字列ハッシュ
ここでは文字列のハッシュ関数の2人の家族がいる:x⃗ =⟨x0x1x2…xm⟩x→=⟨x0x1x2…xm⟩\vec{x} = \langle x_0 x_1 x_2 \dots x_m \rangle pppxi∈Zpxi∈Zpx_i \in \mathbb{Z_p}h1a(x⃗ )=∑aiximodpha1(x→)=∑aiximodph^1_{a}(\vec{x}) = \sum a^i x_i \bmod pa∈Zpa∈Zpa \in \mathbb{Z}_p∀x≠y,Pa(h1a(x)=h1a(y))≤m/p∀x≠y,Pa(ha1(x)=ha1(y))≤m/p\forall x \neq y, P_a(h^1_a(x) = h^1_a(y)) \leq m/p 用、のための。LemireとKaserは、「非常に普遍的な文字列ハッシュは速い」で、このファミリが2独立であることを示しました。これは、ことを意味しxi∈Z2bxi∈Z2bx_i \in \mathbb{Z}_{2^b}h2a⃗ =⟨a0a1a2…am+1⟩(x⃗ )=(a0+∑ai+1ximod22b)÷2bha→=⟨a0a1a2…am+1⟩2(x→)=(a0+∑ai+1ximod22b)÷2bh^2_{\vec{a} = \langle a_0 a_1 a_2 \dots a_{m+1}\rangle}(\vec{x}) = (a_0 + \sum a_{i+1} x_i \bmod 2^{2b}) …

2
サブセットルックアップアルゴリズム
{ 1、。のサブセットのリストがあるとします。。。、n }。必要に応じて、このリストの前処理を行うことができます。この前処理の後、私は別のセットを提示していますA ⊆ { 1 、。。。、n }。私は、任意のセットを識別したいB ∈ XをとB ⊆ A。XX\cal X{1,...,n}{1,...,n}\{1, ..., n\}A⊆{1,...,n}A⊆{1,...,n}A \subseteq \{1, ..., n \}B∈XB∈XB \in \mathcal XB⊆AB⊆AB \subseteq A (前処理なし)明白なアルゴリズムは、時間のかかる -あなただけでテストA各に対するB ∈ X別途。これより良いものはありますか?O(n|X|)O(n|X|)O(n |\cal X|)AAAB∈XB∈XB \in \mathcal X それが助け場合は、いずれかのために、それを取ることができる、マッチの総数B ∈ Xがのようなものに囲まれているO (1 )。AAAB∈XB∈XB \in \mathcal XO(1)O(1)O(1)

2
木のコレクションを検索するための効率的なアルゴリズム
大きな木のデータセットがあり、ツリーレット(接続されたサブグラフ)を指定して検索したいのですが。クエリは、データセット内のツリーレットのすべての出現を返す必要があります。 そうするための効率的なアルゴリズムはありますか? 接尾辞配列のようなものを考えていましたが、ツリーの単純な文字列としてのエンコード(ノードの固定のトラバース順序による)は機能しません。検索ツリーレットは任意の形状にすることができるためです。 更新: 私が期待する典型的なインスタンスに関するいくつかの詳細: データセットは、それぞれが約20〜30のノードで構成される、少なくとも数万の木で構成されます。ツリーはバイナリではありませんが、ノードあたりの一般的な子の数は少なくなります(通常は4または5以下ですが、場合によっては約30に達することもあります)。ラベルの数は数万になります。 NLPアプリケーションではこれが必要です。各ツリーは文の依存解析であり、各ノードは単語の出現を表し、各ノードは辞書の単語にラベルを付けます(装飾が施されています)。

2
クイックリスト操作と注文クエリのためのデータ構造はありますか?
セットからの要素のリストのセットがあります。各要素は単一のリストに表示されます。次の更新を実行できるデータ構造を探しています。N = { 1 、2 、3 、。。。、n } N LLLLN= { 1 、2 、3 、。。。、n }N={1,2,3,...,n}N = \{ 1, 2, 3, ..., n \}NNNLLL c o n c a t (x 、y)concat(x,y)concat(x, y):を含むリストをを含むリストの最後に連結しますxyyyバツxx s p l i t (x )split(x)split(x):含むリスト分割直後xバツxxバツxx また、次のクエリを実行する必要もあります。 follows(x,y)follows(x,y)follows(x, y):とが同じリストにあり、が後に場合に返し(ただし、必ずしも隣接している必要はありません)x y y x xtruetruetruexxxyyyyyyxxxバツxx fi r s …

1
ワイルドカード文字列がセット内の別のワイルドカード文字列と完全に一致するかどうかの判断
ここに私をしばらく悩ませてきた問題があります。さんが言ってみましょう文字列は、1と0のシーケンスであり、そしてワイルドカード文字列は 1のシーケンスであり、0、および?の。すべての文字列とワイルドカード文字列は同じ長さです。これらは標準のUNIXワイルドカードです。10 ?? 1は10011、10111などと一致します。その位置で1または0に一致します。場合はおよびWは、ワイルドカード文字列である、我々は書きV ≤ Wにマッチしたすべての文字列ならばvはまたで一致しているワットを。vvvwwwv≤wv≤wv \leq wvvvwww 問題:集合与えられたワイルドカード文字列の、およびクエリV(ワイルドカード文字列)は、存在しないwが∈ SようにV ≤ ワット?そうでない場合、vをSに効率的に追加できますか?SSSvvvw∈Sw∈Sw \in Sv≤wv≤wv \leq wvvvSSS ここに明らかなソリューション(kは文字列のサイズ、mはRAMのワードサイズ(通常32または64)):リストの各要素を調べ、条件をテストします(2または3回の操作で実行できます)ビットいじりを使用して)。また、テストであれば、V≥wは任意の項目について成り立つワットながら、僕らだスキャン。vがテストに失敗した場合は、vをセットに追加し、マークしたwを削除します。O(kmn)O(kmn)O(\frac{k}{m}n)kkkmmmv≥wv≥wv \geq wwwwvvvvvvwww しかし、それは十分に速くありません。ソリューション、または完全な世界では、基数ツリー(O (k ))に似た複雑さがあったら、それは本当にすばらしいでしょう。クエリはほぼ正確であることがもOKです:場合、であるV ≤ wが、その後、yesまたはno返しません。しかし、条件が成立しない場合は、間違いなくノーを返します。O(logn)O(log⁡n)O(\log n)O(k)O(k)O(k)v≤wv≤wv \leq w これは最悪の場合の複雑さには役立ちませんが、内のすべての要素はワイルドカード文字列で区切られていると想定できます。つまり、いくつか存在するVなど、すべてのそれのw ∈ S、V ≥ wは。SSSvvvw∈Sw∈Sw \in Sv≥wv≥wv \geq w 私が試したアイデア ワイルドカード文字列は結合セミラティスを形成します。ワイルドカード文字列を保持するn-aryツリーを持つことができます。葉はワイルドカード文字列であり、枝はすべての子の結合を表します。クエリと結合が比較できない場合、そのブランチのすべての子と比較するために時間を無駄にする必要はありません。さらに、更新を行い、その更新が結合よりも大きい場合は、ブランチ全体を削除するだけで済みます。残念ながら、これは最悪の場合でも依然としてであり、要素を追加するためにツリーをスキャンするときに、常に「最適な」結合を見つけることができるとは限りません。O(n)O(n)O(n) 基数トライを形成できます。Sはいくつかのワイルドカード文字列で区切られていることがわかります。?0?0であると仮定します。次に、トライのすべてのブランチは、文字列の1番目と3番目のビットにある必要があります。クエリで分岐している現在のビットが1の場合、?そして1つの枝; 0の場合、?そして0の枝; ?の場合、チェックするのは?ブランチ。潜在的に複数のブランチをとる必要があるため、これはあまりよくありません(同じ理由でトライを更新するのは困難です)。マッチングは非常に高速な操作であるため、ツリー内で多くのトラバースを実行する単純な戦略と比較すると、害があります(ポインターの束を追跡することは、いくつかのORやANDを実行するよりもはるかにコストがかかります)。SSSSSS 関連作業 ネットワーキングコミュニティでは、この問題は「パケット分類」として現れます。ここでは、既知のアルゴリズムとデータ構造の良い調査を示します。残念ながら、ほとんどの場合、ワイルドカード文字列はプレフィックスにのみ一致すると想定されており、クエリはそのような文字列のタプルです。もちろん、常に次の基準を満たすように一般的なワイルドカード文字列を変換できます:1?00?1 ?? は(1、?、0、0、?、1、?、?)です。ただし、これは効率的ではありません。他の前提として、これらのタプルは「色」に関連付けられており、クエリで色が返される必要があります(一致した色だけではありません)。これは、タプルを順序付けする必要があるため(または(0、?)と(?、1)のどちらが(0、1)に一致するかが不明確)、問題がはるかに困難になります。 アルゴリズムコミュニティでは、「気にしない」と一致する部分文字列の検索に関連する多くの結果を見つけました。これはかなり難しい問題であり、実際にはどのテクニックも利用できません。 結論として 助けてくれてありがとう!

2
マップのツリーに最適なデータ構造は何ですか。
私はデータ構造を探しています。これは基本的にマップのツリーです。各ノードのマップには、親ノードのマップ内のエレメントだけでなく、いくつかの新しいエレメントが含まれています。ここでのマップとは、STLのマップやPythonのdictのような、キーと値を含むプログラミングマップを意味します。 たとえば、ルートノードがあるとします。 root = {'car':1, 'boat':2} と2つの子、それぞれが親マップに要素を追加 child1 = {'car':1, 'boat':2, 'jet':35} child2 = {'car':1, 'boat':2, 'scooter':-5} これを可能な限りスペース効率の良いものにしたいのです。つまり、結果のマップの完全なコピーを各ノードに保存したくありませんが、理想的にはルックアップはO(log N)であり、Nはツリー全体ではなく、ノードの要素。 私はおそらくこれに使用できるスマートなハッシュ関数があると考えていましたが、何も思いつきませんでした。 単純なアプローチでは、新しく追加されたエントリを各ノードのマップに格納し、何も見つからない場合はツリーを上に移動します。木の深さに依存するので、私はこれが好きではありません。

1
必読の探索樹紙とは?
サーチツリーの分野で研究を行っている研究者の方々にお願いしたい。検索木に関する論文を書きたい場合に読んでおくべき重要な論文や最新の論文のリストを書いていただけませんか。 私は個人的に以下の論文のリストを持っています(それは不均一で、かなり古く、さまざまなトピックに影響を与えます。また、フィンガーサーチツリーに関する膨大な量の論文もありますが、それらへの参照は書きませんでした)。ご協力ありがとう御座います。 Daniel Dominic SleatorおよびRobert Endre Tarjan。1985.自己調整二分探索木。J. ACM 32、3(1985年7月)、652-686。DOI = http://dx.doi.org/10.1145/3828.3835 Daniel D. SleatorおよびRobert Endre Tarjan。1983.動的ツリーのデータ構造。J. Comput。システム。サイエンス。26、3(1983年6月)、362-391。DOI = http://dx.doi.org/10.1016/0022-0000(83)90006-5 スコット・ハドルストンとカート・メルホーン。1982.ソートされたリストを表すための新しいデータ構造。Acta Inf。17、2(1982年6月)、157-184。DOI = http://dx.doi.org/10.1007/BF00288968 エリックD.デメイン、ディオンハーモン、ジョンイアコノ、ダニエルケイン、ミハイパトラチュク。2009.二分探索木の幾何学。離散アルゴリズムに関する第20回ACM-SIAMシンポジウムの議事録(SODA '09)。Society for Industrial and Applied Mathematics、フィラデルフィア、PA、USA、496-505。 サミュエルW.ベント、ダニエルD.スリーター、ロバートE.タージャン。バイアス検索ツリー。SIAM Journal on Computing 1985 14:3、545-568 Parinya Chalermsook、Mayank Goswami、LászlóKozma、Kurt Mehlhorn、Thhatchaphol Saranurak:自己調整型バイナリ検索ツリー:何が原因ですか?ESA 2015:300〜312 私は探索木の高速連結の分野で研究を行ったので、 ハイム・カプランとロバート・E・タージャン。1996.分類可能なソート可能なリストの純粋に機能的な表現。コンピューティング理論に関する第28年次ACMシンポジウムの議事録(STOC '96)。ACM、ニューヨーク、ニューヨーク、米国、202-211。DOI = http://dx.doi.org/10.1145/237814.237865 純粋に機能的な最悪のケースの一定時間はソートされたリストを可能にします。コンピュータサイエンスの講義ノート。GerthStøltingBrodal、Christos Makris、Kostas Tsichlas。アルゴリズム– …

1
効率的なマージをサポートするソートされた辞書構造?
多くのバランスの取れたツリー構造(赤/黒ツリー、スプレイツリーなど)およびその他のいくつかのソートされた辞書構造(スキプリスト)は、最初の構造のすべてのキーが2番目の構造のすべてのキーよりも小さい2つの辞書を取り込む結合操作をサポートしています。次に、2つの辞書を組み合わせて、時間で単一のソートされた辞書にします。ここで、nはキーの総数です。ただし、これは、それらのツリーに格納されているキーの範囲に重複がない場合にのみ機能します。O (ログn )O(log⁡n)O(\log n)んnn 同様に、多くの優先度キュー(二項ヒープ、フィボナッチヒープなど)は、時間のマージをサポートしています。これらのマージは、どのキーが格納されているかに関係なく機能しますが、データ構造が優先キューであるとすると、結果の構造のランダムな要素を検索することはできません。O (ログn )O(log⁡n)O(\log n) そこ辞書構造をソートし、その時間内の任意の辞書の支持体のマージである、一方の時間で同時に通常のソートされた辞書の動作をサポートする(挿入、欠失、ルックアップ、後継/先行クエリなど)O (対数N )、またはそのような構造が存在できないという下限の証明?O (ログn )O(log⁡n)O(\log n)O (ログn )O(log⁡n)O(\log n)

3
並行データ構造を設計する方法は?
以前にProgrammers.SEでこの質問をしましたが、成功しませんでした。 並行データ構造を設計する方法について書かれた学習リソースを探しています。最終的な製品(完全なコードリスト)よりも、設計プロセス(たとえば、適切な不変条件の特定)に関心があります。 具体的な例として、Chris Okasakiの著書「Purely Functional Data Structures」は本当に参考になりました。これは単なる参考資料ではなく、データ構造とアルゴリズムの設計について読者をガイドするためです。多くの場合、この本は、最初によりナイーブなバージョンを提供し、次に、必要な時間の複雑さ(最悪の場合または償却)が達成されるまでそれを洗練することによって、トリッキーまたは非自明なデザインを動機付けます。これは私が探しているようなものです。 そう: 並行データ構造を設計するためにどのような手法またはヒューリスティックが存在しますか? これらのテクニックとヒューリスティックを説明する本、論文、ブログ投稿、チュートリアルなどはありますか?

1
効率的な集合交差について知られていること
(あなたが整数の集合の数持っていると言う()、およびあなたがそれらのいくつかの交点を計算したい∩ S 1、S 3、S 7は、クエリかもしれませんが、あなたがしたいです多くのそのようなクエリ、またはおそらくすべての可能なクエリをサポートするため)S1,S2...SnS1,S2...SnS_1, S_2 ... S_n∩S1,S3,S7∩S1,S3,S7\cap S_1, S_3, S_7 これを線形時間で行う明白な方法があります。準線形時間を可能にするデータ構造はありますか?(もちろん、それは一般的には不可能です:回答自体は線形サイズを持っているかもしれません。しかし、アルゴリズムは、回答サイズで線形であることや、サブ線形時間で実行され、交差点) 一般的に、問題の状態はどうですか?どのようなアプローチが知られていますか、そして難しいと知られているものは何ですか?

1
ユニバーサルインデックスは存在しますか?
非常に多数のの行を含み、各行に多数ののフィールドが含まれ、各フィールドに大きな固定ビット数が含まれるデータテーブルがある場合、「インデックス」構造を構築する方法はいくつかあります。次の操作は、テーブルとインデックスに対して時間で実行できます(および基準にして)。k O (k log N )N kNNNkkkO (k ログN)O(kログ⁡N)O(k\log N)NNNkkk 新しい要素をテーブルに挿入します。 テーブルから指定された要素を削除します。 フィールドの値のセットが与えられた場合、テーブルがフィールド1が最初、フィールド2が2のように辞書式順序にソートされたときに、指定されたフィールド値より大きいフィールド値を持つテーブル内の最初のレコードを取得します。 この構造を一般化して、操作3が完了すると、kフィールドの順序を指定して、テーブル内のレコードの順序を決定できます。k !k!k!kkk 明らかに、これはk!インデックス、フィールドの順序ごとに1つ。次に、操作には時間がかかります。O(k!klogN)O(k!kログ⁡N)O(k!k\log N) 演算が(比べて)はるかに速く、好ましくはO (k log k log N )時間であるアルゴリズムが必要です。kkkO(klogklogN)O(kログ⁡kログ⁡N)O(k\log k \log N) そのようなアルゴリズム/データ構造は存在しますか?もし存在していれば、誰かが今までにそれを公開して実装していたようですが、存在する兆候は見当たりません。逆に、おそらくそのようなアルゴリズムが存在しないことが証明できるでしょう。しかし、そのような証拠が存在するという兆候は見つかりませんでした。

1
初期化されていないメモリと最小限のスペースにビットベクトルを格納する
初期化されていないメモリを使用して、ビットベクトルを格納するためのよく知られたトリックサイズのビットベクトルに割り当てることができたビットのすべてに設定されている0割り当てることによって(2 N + 1 )⌈ LG N ⌉メモリのビットと初期化のみ⌈ LGをN ⌉それらの。この表現は、一定時間でのビットの設定と設定解除をサポートします。nnn000(2n+1)⌈lgn⌉(2n+1)⌈lg⁡n⌉(2 n + 1)\lceil \lg n \rceil⌈lgn⌉⌈lg⁡n⌉\lceil \lg n \rceil これは、「Alfred Aho、John Hopcroft、およびJeffrey Ullmanの1974年の本、The Computer and of Analysis of Computer Algorithms。。。。Chapter 2、演習2.12」、「Jon Bentleyの1986年の本、Programming Pearls。。。.Column 1、演習8、演習にさかのぼります。第2版​​の9」、および「プレストンブリッグスとリンダトルクゾンの1993年のペーパー、「スパースセットの効率的な表現」」。 Dodisらの「スペースを失うことなく、ベースを変更する」までわずかにスペース要件をもたらしこのアルゴリズムはの事前計算が必要ですが、ビットΘ (LG nは)と定数Θ (lg n )各ビット。⌈(2n+1)lgn⌉+1⌈(2n+1)lg⁡n⌉+1\lceil (2 n + 1) \lg n \rceil + 1Θ(lgn)Θ(lg⁡n)\Theta(\lg n)Θ(lgn)Θ(lg⁡n)\Theta(\lg …

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