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

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

1
絞り込みタイプの推測
職場では、動的言語に関する型情報を推論する必要があります。次のように、ステートメントのシーケンスをネストされたlet式に書き換えます。 return x; Z => x var x; Z => let x = undefined in Z x = y; Z => let x = y in Z if x then T else F; Z => if x then { T; Z } else { F; Z } 一般的なタイプ情報から始めて、より具体的なタイプを推測しようとしているので、自然な選択は絞り込みタイプです。たとえば、条件演算子は、trueブランチとfalseブランチの型の和集合を返します。単純なケースでは、非常にうまく機能します。 ただし、次のタイプを推測しようとしたときに、思わぬ障害に遭遇しました。 function …
11 programming-languages  logic  type-theory  type-inference  machine-learning  data-mining  clustering  order-theory  reference-request  information-theory  entropy  algorithms  algorithm-analysis  space-complexity  lower-bounds  formal-languages  computability  formal-grammars  context-free  parsing  complexity-theory  time-complexity  terminology  turing-machines  nondeterminism  programming-languages  semantics  operational-semantics  complexity-theory  time-complexity  complexity-theory  reference-request  turing-machines  machine-models  simulation  graphs  probability-theory  data-structures  terminology  distributed-systems  hash-tables  history  terminology  programming-languages  meta-programming  terminology  formal-grammars  compilers  algorithms  search-algorithms  formal-languages  regular-languages  complexity-theory  satisfiability  sat-solvers  factoring  algorithms  randomized-algorithms  streaming-algorithm  in-place  algorithms  numerical-analysis  regular-languages  automata  finite-automata  regular-expressions  algorithms  data-structures  efficiency  coding-theory  algorithms  graph-theory  reference-request  education  books  formal-languages  context-free  proof-techniques  algorithms  graph-theory  greedy-algorithms  matroids  complexity-theory  graph-theory  np-complete  intuition  complexity-theory  np-complete  traveling-salesman  algorithms  graphs  probabilistic-algorithms  weighted-graphs  data-structures  time-complexity  priority-queues  computability  turing-machines  automata  pushdown-automata  algorithms  graphs  binary-trees  algorithms  algorithm-analysis  spanning-trees  terminology  asymptotics  landau-notation  algorithms  graph-theory  network-flow  terminology  computability  undecidability  rice-theorem  algorithms  data-structures  computational-geometry 

2
リストの代わりに検索ツリーを使用したハッシュ
私はハッシュと二分探索木資料と格闘しています。そして、同じハッシュ値を持つエントリを格納するためにリストを使用する代わりに、バイナリサーチツリーを使用することも可能だと私は読んだ。そして、私は操作の最悪の場合と平均の場合の実行時間を理解しようとします insert、 find そして delete 価値があります。平均的なケース。リストに関しては改善されますか?

1
キーの減少操作とキーの増加操作の両方を含む優先キュー
A Fibonnaciヒープは、次の操作をサポートします。 insert(key, data) :新しい要素をデータ構造に追加します find-min() :最小のキーを持つ要素へのポインタを返します delete-min() :最小のキーを持つ要素を削除します delete(node) :が指す要素を削除します node decrease-key(node) :が指す要素のキーを減らします node すべての非削除操作は(償却)時間であり、削除操作は償却時間です。O(1)O(1)O(1)O(logn)O(log⁡n)O(\log n) また、サポートプライオリティキューのいずれかの実装が存在するincrease-key(node)中で(償却)時間は?O(1)O(1)O(1)

1
セットのパーティションを表すコンパクトな方法は何ですか?
セットパーティションを表すための効率的なデータ構造が存在します。これらのデータ構造は、UnionやFindなどの操作には時間的に複雑ですが、スペース効率は特に高くありません。 セットのパーティションを表すスペース効率の良い方法は何ですか? 以下は、考えられる開始点の1つです。 N個の要素 を持つセットのパーティション数は、N番目のベル数であるB Nであることを知っています。したがって、N個の要素を持つセットのパーティションを表すための最適な空間の複雑さは、 log 2(B N)ビットです。そのような表現を見つけるために、(N要素のセットのパーティションのセット)と(1からB Nまでの整数のセット)の間の1対1のマッピングを探すことができます。NNNBNBNB_NNNNNNNログ2(BN)log2⁡(BN)\log_2(B_N)NNN111BNBNB_N 計算するのに効率的なそのようなマッピングはありますか?「効率的」とは、このコンパクトな表現を、またはlog 2(B N)の時間多項式で、操作が簡単な表現(リストのリストなど)との間で変換したいということです。NNNログ2(BN)log2⁡(BN)\log_2(B_N)

3
「マップ」とはどういう意味ですか?
私はさまざまなCS教育資料でこの用語に何度も遭遇しました。 L2 CS162(UCバークレー): メモリマップI / O L4 CS162(UCバークレー): メモリマップファイル L24 CS61(UCバークレー): 「メモリマップI / O」:CPUアドレス空間にマップされたデバイス制御/データレジスタ 「マッピング」をグーグルで行った後でも、記事Map_(higher-order_function)を入手しましたが、 あまりわかりませんでした。 さらに、ウィキペディアの記事をbitmap読んで、コンテキストの意味を理解しようとしました: ビット配列は、あるドメイン(ほとんどの場合、整数の範囲)からセット{0、1}の値へのマッピングです わかりませんが、上記のコンテキストでは、データ変換について聞こえます。 CSブックを読んだ後、この段落だけが見つかりましたが、「マッピング」の意味がわかりませんでした。 メモリマッピングLinuxは(他の形式のUnixと共に)、仮想メモリ領域の内容をディスク上のオブジェクトに関連付けることにより、メモリマッピングと呼ばれるプロセスを初期化します。 検索結果としてMapReduceも取得しました。ここで、mapは「単純な操作がシーケンスのすべての要素に適用される可能性がある並列計算のイディオム」と説明されています。 私はまだこの用語について混乱しています。私が言及したコンテキストで「マップ」が何を意味するのかを誰かが説明できますか?

3
整数の範囲を効率的に格納するデータ構造はどれですか。
コレクションを0から65535の範囲の整数で保持する必要があるため、次のことをすばやく実行できます。 新しい整数を挿入する 連続する整数の範囲を挿入する 整数を削除する 整数以下のすべての整数を削除します 整数が存在するかどうかをテストします 私のデータには、コレクションに整数の実行が含まれることが多いという特性があります。たとえば、ある時点でのコレクションは次のようになります。 { 121, 122, 123, 124, 3201, 3202, 5897, 8912, 8913, 8914, 18823, 18824, 40891 } 最も単純なアプローチは、C ++ std :: setのようなバランスのとれたバイナリツリーを使用することですが、それを使用して、私はしばしば数値の実行があるという事実を利用していません。おそらく、範囲のコレクションを格納する方が良いでしょうか?しかし、これは、範囲内の整数が削除された場合、または2つの範囲間のスペースが埋められた場合に結合された場合、範囲を分割できる必要があることを意味します。 この問題に適している既存のデータ構造はありますか?

1
ポテンシャル関数バイナリヒープ抽出最大O(1)
最大ヒープが償却時間で完了するように、最大​​ヒープの潜在的な関数を理解する手助けが必要です。潜在的な方法をよく理解していないことを付け加えておきます。O (1 )O(1)O(1) 抽出のコストを削減するために、挿入関数はさらに「支払う」必要があることを知っています。これは、ヒープの高さに関するものでなければなり(if log (n )⌋がヒープの高さを与える場合挿入は2 log (n )または∑ n k = 1 2 log (k ))⌊ ログ(n )⌋⌊log⁡(n)⌋ \lfloor \log(n) \rfloor 2 ログ(n )2log⁡(n)2\log(n)Σんk = 12 ログ(k )∑k=1n2log⁡(k) \sum_{k=1}^n 2\log(k)

3
CLRSのd-aryヒープ問題
次の問題(質問1〜3)を解決しているときに混乱しました。 質問 D進ヒープは、バイナリヒープ似ているが、(一つの可能な例外を除いて)は、非リーフノードが有するD子供の代わりに、2人の子供。 配列のd- aryヒープをどのように表現しますか? n要素とd要素のd- aryヒープの高さは、nとdで何ですか? d -ary max-heap でのEXTRACT-MAXの効率的な実装を提供します。実行時間をdおよびnで分析します。 d -ary max-heap でのINSERTの効率的な実装を提供します。実行時間をdおよびnで分析します。 INCREASE-KEY(A、i、k)の効率的な実装を提供します。これは、k <A [i] = kの場合にエラーにフラグを立て、d進行列のヒープ構造を適切に更新します。実行時間をdおよびnで分析します。 私の解決策 配列A [ a1。。aん]あ[a1。。aん]A[a_1 .. a_n] ルートレベル1レベル2レベルk:a1:a2… a2 + d− 1:a2 + d… a2 + d+ d2− 1⋮:a2 + ∑i = 1k − 1d私… a2 + ∑i = 1kd私− 1ルート:a1レベル1:a2…a2+d−1レベル2:a2+d…a2+d+d2−1⋮レベルk:a2+Σ私=1k−1d私…a2+Σ私=1kd私−1\qquad …

3
範囲から描画されるエッジの重みに対するダイクストラのアルゴリズムを変更する
範囲からエッジの重みが描画された有向グラフがあるとします。ここで、は定数です。ダイクストラのアルゴリズムを使用して最短経路を見つけようとしている場合、アルゴリズム/データ構造を変更して、時間の複雑さを改善するにはどうすればよいですか?[1,…,K][1,…,K][1,\dots, K]KKKO(|V|+|E|)O(|V|+|E|)O(|V|+|E|)


1
範囲合計問題のセグメントツリー実装の時間の複雑さの証明
のサブ配列の合計を見つけるためにセグメントツリーを使用できることを理解しています。そして、ここのチュートリアルによれば、これはO(log n )時間で実行できます。あAAO(ログn )O(log⁡n)\mathcal{O}(\log n) ただし、クエリ時間が実際にことを証明することはできません。このリンク(および他の多くのリンク)は、各レベルで処理されるノードの最大数が4であることを証明できるため、O(4 log n )= O(log n )であると述べています。O(ログn )O(log⁡n)\mathcal{O}(\log n)444O(4ログn )= O(ログn )O(4log⁡n)=O(log⁡n)\mathcal{O}(4 \log n) = \mathcal{O}(\log n) しかし、おそらく矛盾によって、どうやってこれを証明するのでしょうか? もしそうなら、もし私たちがより高次元の配列の範囲の合計にセグメントツリーを使うとしたら、証明はどのように拡張されるでしょうか? たとえば、元の行列を4つの象限(線形配列の2分の1間隔と同様)に分割して、象限セグメントツリーを構築してサブ行列の合計を見つけることを考えることができますが、その証拠は私にはわかりません。

1
範囲更新+バイナリインデックスツリーを使用した範囲クエリ
範囲のクエリと範囲の更新の両方を処理するためにバイナリインデックス付きツリー(fenwickツリー)をどのように変更できるかを理解しようとしています。 次のソースを見つけました: http://kartikkukreja.wordpress.com/2013/12/02/range-updates-with-bit-fenwick-tree/ http://programmingcontests.quora.com/Tutorial-Range-Updates-in-Fenwick-Tree http ://apps.topcoder.com/forums/?module = Thread&threadID = 756271&start = 0&mc = 4#1579597 しかし、それらすべてを読んでも、2番目のバイナリインデックス付きツリーの目的や、それが何をするのか理解できませんでした。 誰かがバイナリインデックス付きツリーがこれらを処理するためにどのように変更されるかを私に説明してもらえますか?

3
バイナリツリーの最小の高さなぜですか?
私のJavaクラスでは、さまざまなタイプのコレクションの複雑さについて学習しています。 間もなく、私が読んでいる二分木について議論します。この本は、二分木の最小の高さはであると述べていますが、それ以上の説明はありません。log2(n+1)−1ログ2⁡(ん+1)−1\log_2(n+1) - 1 誰かが理由を説明できますか?

1
一連の線分が与えられたときに、二重に接続されたエッジリストを作成するにはどうすればよいですか
一連の線分によって定義される、平面に埋め込まれた特定の平面グラフ場合、各セグメントはその端点表されます。平面サブディビジョンのDCELデータ構造を構築し、アルゴリズムを記述し、それが正確であることを証明し、複雑さを示します。G(V,E)G(V,E)G(V,E)E={e1,...,em}E={e1,...,em}E= \left \{ e_1,...,e_m \right \} eieie_i{Li,Ri}{Li,Ri}\left \{ L_i,R_i \right \} DCELデータ構造のこの説明によれば、DCELの異なるオブジェクト(つまり、頂点、エッジ、面)の間には多くの接続があります。したがって、DCELの構築と保守は難しいようです。 DCELデータ構造を構築するために使用できる効率的なアルゴリズムを知っていますか?

1
コールスタックとして使用した場合、ガベージフリーのスパゲッティスタックはDAGを形成しますか?
私はプログラミング言語の実装手法を調べています。最近、スパゲッティスタックに出会いました。これは、継続スキームスタイルモデル(SchemeやSML / NJなどでの使用を想定)に適していると思われ ます。簡単にするために、この質問ではシングルスレッドプロセスのみを検討します。 ただし、Wikipediaの図 (他の場所にもあります)には少し混乱してい ます。特に、そのような状況がどのように起こり得るのか、私にはわかりません。灰色で表示されたブランチは到達不可能であり、ガベージコレクションの対象となることしか想像できません。一方、スパゲッティスタックを使用してCPSを実装する方法については漠然と理解しているため、その構造でループが発生する方法を想像することはできません。「親ポインタツリー」ではなく、実際には有向非循環グラフであり、スレッドと同じ数の非ガベージソースと、(潜在的な)「出口ポイント」と同じ数のシンクがあると結論付けなければなりません。 しかし、この実装についての私の理解はかなり曖昧なので、おそらく何かを見落としていると思います。ここで「スパゲッティコールスタック」について誰かに教えていただければ幸いです。つまり、CPSベースのプロセスを実装するためにSchemeやSML / NJで使用されるデータ構造を意味します。 次のスパゲッティコールスタックがあるとします。 [exit point] <-- ... <-- [frame A] <-- [frame B (active)] ^ `---- [frame C] 私が理解している限り、Bからのフロー制御は、親にジャンプしてスタックを巻き戻します(Aがアクティブになり、到達不能Bはガベージになります)、またはBまたは参照が保持する参照のみを使用して接続されたサブフレームでアクティブフレームを置き換える新しいフレームに。実行はフレームCにフローできません。これは、フレームCがゴミであることを意味します。 以前の状況ではなく、次のガベージフリーの状況が発生する可能性があると思います。 [exit point] <-- ... <-- [frame W] <-- [frame X] <-- [frame Z (active)] ^ | `---- [frame Y] <---´ たとえば、フレームZが、フレームXまたはフレームY(どちらもWに戻る)で継続する決定関数に属していると想像できます。これは、スパゲッティコールスタックが「親ポインターツリー」ではないことを意味します。 ただし、ループを構成できる状況は想像できません。たとえば、次の状況を考えます。 …

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