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

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

6
要素の繰り返しなしでペアのセットから組み合わせを生成する
ペアのセットがあります。各ペアの形式は(x、y)で、x、yは範囲の整数に属します[0,n)。 したがって、nが4の場合、次のペアがあります。 (0,1) (0,2) (0,3) (1,2) (1,3) (2,3) 私はすでにペアを持っています。次に、n/2整数が繰り返されないようにペアを使用して組み合わせを作成する必要があります(つまり、各整数は最終的な組み合わせで少なくとも1回出現します)。理解を深めるための正しい組み合わせと間違った組み合わせの例を次に示します 1. (0,1)(1,2) [Invalid as 3 does not occur anywhere] 2. (0,2)(1,3) [Correct] 3. (1,3)(0,2) [Same as 2] ペアができたら、可能性のあるすべての組み合わせを生成する方法を誰かが提案できますか?

1
平衡二分木の2つの定義
バランスの取れたバイナリツリーの2つの定義を見てきましたが、それらは私には異なっています。 左のサブツリーの内部ノードの数と右のサブツリーの内部ノードの数が最大で1だけ異なるとノードが保持する場合、二分木はバランスが取れています。 任意の2つの葉の深さの差が最大で1である場合、二分木はバランスが取れています。 defを満たすすべてのツリーを実行します。1もdefを満たします。2?他の方法はどうですか?

2
償却時間での検索、挿入、削除を伴うデータ構造?
償却時間で次の操作をサポートする順序付きリストを維持するためのデータ構造はありますか?O(1)O(1)O(1) GetElement(k):リストの番目の要素を返します。kkk InsertAfter(x、y):新しい要素yをリストのxの直後に挿入します。 Delete(x):リストからxを削除します。 最後の2つの操作では、xがデータ構造への直接のポインターとして与えられていると仮定できます。InsertElementは、yに対応するポインターを返します。InsertAfter(NULL、y)は、リストの先頭にyを挿入します。 たとえば、空のデータ構造から始めて、次の操作は順序付きリストを次のように更新します。 InsertAfter(NULL、a) [a]⟹⟹\implies InsertAfter(NULL、b) [b、a]⟹⟹\implies InsertAfter(b、c) [b、c、a]⟹⟹\implies InsertAfter(a、d) [b、c、a、d]⟹⟹\implies Delete(c) [b、a、d]⟹⟹\implies これらの5つの更新後、GetElement(2)はdを返し、GetElement(3)はエラーを返します。

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) …

2
近似ルックアップをサポートする効率的なマップデータ構造
キーの効率的な近似ルックアップ(たとえば、文字列のレーベンシュタイン距離)をサポートし、入力キーに最も近い一致を返すデータ構造を探しています。私がこれまでに見つけた最適なデータ構造はBurkhard-Kellerツリーですが、この目的のために他の/より良いデータ構造があるかどうか疑問に思っていました。 編集:特定のケースの詳細: 文字列は通常、互いに大きなレーベンシュタインの違いを持っ​​ています。 文字列の最大長は約20〜30文字で、平均は10〜12文字に近い。 挿入よりも効率的なルックアップに関心があります。これは、クエリを効率的に行いたい静的データのセットを構築するためです。

1
スプレイツリーローテーションアルゴリズムが親ノードと祖父母ノードの両方を考慮するのはなぜですか?
スプレーツリーデータ構造の回転が、評価ノードの親だけでなく、祖父母(zig-zagおよびzig-zig操作)も考慮している理由はよくわかりません。以下が機能しないのはなぜですか: たとえば、ツリーに新しいノードを挿入するときに、左または右のサブツリーに挿入するかどうかを確認します。左に挿入する場合、結果を右に回転させ、右のサブツリーに対して結果を右に回転させます。再帰的にこのようになります Tree insert(Tree root, Key k){ if(k < root.key){ root.setLeft(insert(root.getLeft(), key); return rotateRight(root); } //vice versa for right subtree } それは、「スプレイ」手順全体を回避するはずです、あなたは思いませんか?

3
動的グラフの最短経路を取得する
現在、有向グラフの最短経路を研究しています。ダイクストラやベルマンフォードのよ​​うに、ネットワーク内の最短経路を見つけるための多くの効率的なアルゴリズムがあります。しかし、グラフが動的な場合はどうでしょうか?動的とは、プログラムの実行中に頂点を挿入または削除できることを意味します。新しいグラフで最短経路アルゴリズムを再度実行する必要なく、エッジeを挿入した後、頂点から他のすべての頂点uへの最短経路を更新するための効率的なアルゴリズムを見つけようとしています。これどうやってするの?前もって感謝します。vvvあなたはuueee 注:変更は、アルゴリズムの最初の反復後に行うことができます 注[2]: 2つのノード、はソース、tはターゲットです。これらのノード間の最短パスを見つける必要があります。グラフが更新されたら、π (s 、t )を更新するだけです。これはsとtの間の最短経路です。ssstttπ(s 、t )π(s,t)\pi(s,t)sssttt 注[3]:エッジ挿入の場合にのみ興味があります。 正式な定義:グラフ与えられた場合。定義更新操作を)1と、エッジの挿入Eに対してE)は、エッジのアミノ酸欠失または2 EからEを。目的は、更新操作後のすべてのペアの最短パスのコストを効率的に見つけることです。効率的には、少なくとも更新操作の後に、Bellman-FordアルゴリズムなどのAll-Pairs-Shortest-Pathアルゴリズムを実行するよりも優れています。G = (V、E)G=(V,E)G = (V,E)eeeEEEeeeEEE 編集:以下に問題の簡略版があります: 重み付きグラフが与えられ、単方向のエッジと2つの重要な頂点sおよびtで構成されます。候補の双方向エッジのセットCも提供されます。私はエッジを構築しなければならない(U 、V )∈ Cはからの距離を最小にするために、SをT。G (V、E)G(V,E)G(V,E)ssstttCCC(U 、V )∈ C(u,v)∈C(u,v) \in Csssttt

1
Pastryのルーティングテーブルの作成方法
この質問は、Computer Science Stack Exchangeで回答できるため、Software Engineering Stack Exchangeから移行されました。 7年前に移行され ました。 Pastry Distributed Hash Tableを実装しようとしていますが、いくつかのことが理解を逃れています。私は誰かが明らかにできることを望んでいた。 免責事項:私はコンピューターサイエンスの学生ではありません。私は人生で正確に2つのコンピューターサイエンスコースを受講しましたが、どちらもリモートで複雑なものを扱っていません。私はソフトウェアで長年働いてきたので、アイデアに頭を包むことができれば、実装タスクに任せていると感じます。だから、明らかな何かを見逃しているだけかもしれません。 著者が発表した論文[1]を読んで、ある程度の進歩を遂げましたが、ルーティングテーブルの動作に関するこの1つの特定のポイントに固執し続けています。 論文は、 ノードのルーティングテーブル、それぞれエントリの 行に編成されます。ルーティングテーブルの行のエントリは、nodeIdが最初のn桁で現在のノードのnodeIdを共有するが、番目の桁が可能な値のいずれかを持つノードを参照します現在のノードのID の番目の数字以外。⌈ ログ2 B N ⌉ 2 B - 1 2 B - 1件の、N 、N + 1 2 B - 1 、N + 1をRRR⌈ ログ2bN⌉⌈log2b⁡N⌉\lceil \log_{2^b} N\rceil2b− 12b−12^b - 12b− 12b−12^b - 1nnnn …

1
ロープ用にヴァンエムデボアスの木に相当するものはありますか?
私が知っている誰かが近い将来にテキストエディタを実装することを計画しているので、テキストエディタにとってどのようなデータ構造が高速かを考えるようになりました。最も使用される構造は、明らかにロープまたはギャップバッファです。 Van Emde Boasツリーは、最速の優先度キューの周りにあります。もしあなたがそこに入れることができるアイテムの数と大きな初期化コストの上限を気にしないなら。私の質問は、van Emde Boasツリーと同じくらい速いが、テキストエディター操作をサポートするデータ構造が存在するかどうかです。 データ構造でサポートする必要があるのは最大文字です(場合、最大4GBのASCII文字をサポートします)。私たちは許可されている時間新しいデータ構造を初期化します。次の操作をサポートしたいと思います。ログM = 32 √mmmlogm=32log⁡m=32\log m = 32m−−√m\sqrt{m} 位置に文字を挿入し(これにより、後続のすべての文字の位置を1ずつ増やし)。O (log log m )iiiO(loglogm)O(log⁡log⁡m)O(\log \log m) 位置の文字を削除し中。O (log log m )iiiO(loglogm)O(log⁡log⁡m)O(\log \log m) 位置にある文字を返します。中。O (log log m )iiiO(loglogm)O(log⁡log⁡m)O(\log \log m) したがって、insert(0、 'a')に続いてinsert(0、 'b')を実行すると、「ba」になります。 さらに良いのはこれです: いくつかのインデックスへの「ポインタ」を返します中。O (log log m )iiiO(loglogm)O(log⁡log⁡m)O(\log \log m) 'pointer'を指定すると、この位置にある文字を返します。O(1)O(1)O(1) 'pointer'を指定すると、この位置の文字を削除します。O(1)O(1)O(1) 「ポインタ」を指定すると、この位置に文字を追加し、次の位置へのポインタを返します。O(1)O(1)O(1) (オプション) 'pointer'を指定すると、次/前の文字への …

4
関数型プログラミングで永続データ構造を使用するのはなぜですか?
関数型プログラミングでは、永続的なデータ構造と不変オブジェクトが使用されます。私の質問は、なぜこのようなデータ構造をここに持つことが重要なのですか?データ構造が永続的でない場合、どうなるかを低レベルで理解したいですか?プログラムはより頻繁にクラッシュしますか?

2
離散ベイジアンネットワークを効率的に格納するデータ構造の組み合わせは何ですか?
ベイジアンネットワークの背後にある理論を理解し、実際に構築するのに何が必要か疑問に思っています。この例では、100個の離散確率変数のベイジアン(有向)ネットワークがあるとします。各変数は、最大10個の値のいずれかを取ることができます。 すべてのノードをDAGに保存し、各ノードについて条件付き確率テーブル(CPT)を保存しますか?一部のCPTが変更されたときに(DAGで使用されるものとは別に)値の効率的な計算を保証するために使用する必要がある他のデータ構造はありますか?

1
AVLツリーはウェイトバランスされていませんか?
前の質問では、重量バランスの取れた木の定義と赤黒木に関する質問がありました。 この質問は、AVLツリーの場合と同じ質問をすることです。 問題は、他の質問と同様にバランスのとれた木の定義を考えると、μμ\mu いくつかありますすべての大きな十分なAVL木があるように、 -balancedは?μ > 0μ>0\mu \gt 0μμ\mu AVLツリーの定義は1つだけで、あいまいさはないと思います。

8
すべてのデータ型は、ポインターを持つノードに要約されますか?
配列またはベクトルは単なる値のシーケンスです。リンクリストを使用して確実に実装できます。これは、次のノードへのポインタを持つ単なるノードの集まりです。 スタックとキューは、Intro CSコースで一般的に教えられる2つの抽象的なデータタイプです。クラスのどこかで、学生はリンクされたリストを基礎となるデータ構造として使用してスタックとキューを実装する必要があります。つまり、同じ「ノードのコレクション」の考え方に戻ります。 優先キューは、ヒープを使用して作成できます。ヒープは、ルートに最小値を持つツリーと考えることができます。BST、AVL、ヒープを含むあらゆる種類のツリーは、エッジで接続されたノードのコレクションと考えることができます。これらのノードは、1つのノードが別のノードを指すようにリンクされています。 すべてのデータ概念は、他の適切なノードへのポインターを持つノードのみに常に要約できるようです。そうですか?これが単純な場合、教科書は、データが単なるポインターを持つノードの集まりであると説明していないのはなぜですか?ノードからバイナリコードへの移行方法

1
ロックのない、一定の更新時間の同時ツリーデータ構造?
私は最近少しの文献を読んでいて、かなり興味深いデータ構造を見つけました。 更新時間を最悪の場合の更新時間まで下げるさまざまな方法を調査しました[1-7]。O(1)O(1)\mathcal{O}(1) 最近、効率的な同時アクセスをサポートするために、ロックフリーのデータ構造の調査を開始しました。 これらの最悪の場合の更新時間技術は、ロックフリーデータ構造の実装に使用されていますか?O(1)O(1)\mathcal{O}(1) 私が尋ねるのは; 私には、それらはこの「理論的強化」の明らかな実際的な拡張のように思えます。 タージャン、ロバート・エンドレ。「O(1)ローテーションでのバランスの取れた検索ツリーの更新。」情報処理レター16、no。5(1983):253 – 257。 Driscoll、JR、N Sarnak、DD Sleator、およびRE Tarjan。「データ構造の永続化」。第18回コンピューティング理論に関する年次ACMシンポジウムの議事録、109–121。STOC '86。ニューヨーク、ニューヨーク、アメリカ:ACM、1986。 Levcopoulos、C。、およびMark H. Overmars。「O(1)最悪の場合の更新時間を備えたバランスの取れた検索ツリー。」Acta Inf。26、いいえ。3(1988年11月):269–277。 フライシャー、ルドルフ。O(1)ワーストケース更新時間を備えた単純なバランスの取れた検索ツリー ディーツ、ポールF、ラジーエフラマン。「一定の更新時間のフィンガー検索ツリー。」情報処理レター52、いいえ。3(1994):147 – 154。 Lagogiannis、George、Christos Makris、Yannis Panagis、Spyros Sioutas、Kostas Tsichlas。「最悪の場合の一定の更新時間を備えた新しい動的なバランスの取れた検索ツリー。」J. Autom。ラング。櫛。8、いいえ。4(2003年7月):607–632。 Brodal、GerthStølting、George Lagogiannis、Christos Makris、Athanasios Tsakalidis、Kostas Tsichlas。「ポインターマシンでの最適な指探索ツリー」。J。Comput。システム。科学 67、いいえ。2(2003年9月):381–418。

1
固定サイズの既存のデータ構造があり、新しい要素が挿入された場合、最も古い/最後の要素を押し出しますか?
新しい要素が挿入された場合に最も古い/最後の要素をプッシュするデータ構造を探しています。たとえばD、構造を表します。Dタイプの3つの要素が含まNumber Dのデフォルト値に初期化される1, 2とし3。 D = [ 1 、2 、3 ]D=[1、2、3]D = [1, 2, 3] 場合にNumber値が含まれていることが5中に挿入されD、3押し出さされ、一方1及び2右にシフトされます。 D = [ 5 、1 、2 ]D=[5、1、2]D = [5, 1, 2] 最初に頭に浮かぶのは配列ですが、定義にはプッシュ動作が含まれていません。

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