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

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

3
ハッシュテーブルの値はどのように物理的にメモリに格納されますか?
質問: 効率的に使用され、値を頻繁に再配置する必要がない場合に、ハッシュテーブルの値はどのようにメモリに格納されますか? 私の現在の理解(間違っている可能性があります): ハッシュテーブルに3つのオブジェクトが格納されているとしましょう。それらのハッシュ関数はこれらの値を生成します: 0 10 20 これらのオブジェクトのポインタは、次のメモリアドレスに格納されません。これらのオブジェクト間には大きなギャップがあるためです。 startOfHashTable + 0 startOfHashTable + 10 startOfHashTable + 20 ハッシュテーブル上のWikipediaの記事は、「インデックス」とは、のように計算されていることを述べています: hash = hashfunc(key) index = hash % array_size したがって、私の例では、インデックスは次のようになります。 0%3 = 0 10%3 = 1 20%3 = 2 これにより、前述の大きなギャップが解消されます。このモジュロスキームを使用しても、ハッシュテーブルにさらにオブジェクトを追加すると問題が発生します。ハッシュテーブルに4番目のオブジェクトを追加すると、インデックスを取得するために%4を適用する必要があります。これで、過去に行った%3はすべて無効になりませんか?以前の%3のすべてを%4の場所に再配置する必要がありますか?

1
XORカットセット構造、および組み合わせデザイン
グラフと頂点のサブセット与えられた場合、 =の頂点と頂点を接続するエッジのセットを定義します。G(V,E)G(V,E)G(V,E)T⊆VT⊆VT \subseteq Vcutset(T)cutset(T)\mathsf{cutset}(T)TTTV∖TV∖TV\setminus T 私たちの目標は、任意のセット与えられたときにでエッジをすばやく返すか、が空であると応答できるようにを前処理することです。構造はスペースの複雑さを持つ必要があります。つまり、すべてのエッジを保持することはできません。クエリの複雑さはます。GGGTTTcutset(T)cutset(T)\mathsf{cutset}(T)cutset(T)cutset(T)\mathsf{cutset}(T)O˜(|V|)O~(|V|)\widetilde{O}(|V|)O˜(|T|)O~(|T|)\widetilde{O}(|T|) Kapronらは、各カットセットのサイズが最大で1の場合に機能する、次の適切なソリューションを提案しています。 各エッジに一意の番号を付けます。各頂点について、 -隣接するすべてのエッジの数のバイナリXORを保持します。上のクエリ所与、計算 -の内部にあるT.すべてのエッジにおけるすべての頂点のバイナリXOR(すなわち、内部の両方のエンドポイント有する)を2回XOR演算され、それゆえに含まれていません。したがって、は実際にはのすべてのエッジのXORです。vvvxor(v)xor(v)\mathsf{xor}(v)TTTxor(T)xor(T)\mathsf{xor}(T)TTTTTTxor(T)xor(T)\mathsf{xor}(T)xor(T)xor(T)\mathsf{xor}(T)cutset(T)cutset(T)\mathsf{cutset}(T) 各カットセットのサイズが最大1の場合、2つのオプションがあります。は、が空であること、またははの単一エッジの数です。xor(T)=0xor(T)=0\mathsf{xor}(T)=0cutset(T)cutset(T)\mathsf{cutset}(T)xor(T)xor(T)\mathsf{xor}(T)cutset(T)cutset(T)\mathsf{cutset}(T) 次に、著者はに複数のエッジが含まれている場合を処理するために、複雑でランダム化された構造について説明します。cutset(T)cutset(T)\mathsf{cutset}(T) しかし結論として、彼らはこう言っています: ここで説明する手法は、カットのサイズが以下であることがわかっている場合、組み合わせを使用することにより、更新時間に追加の係数を使用して決定論的にできることを理解するのは難しくありません。デザイン」。O˜(k)O~(k)\widetilde{O}(k)kkk 残念ながら、私にとってこれは難しいようです...わかりません:すべてのカットセットのサイズが最大でであるときに、組み合わせ設計を使用して問題を解決するにはどうすればよいですか?kkk

2
3次元の最近傍の高速でスペース効率の良いデータ構造?
私は合理的にスペース効率が良い(つまり、最大で使用される)3Dの最近傍クエリに答えるためのデータ構造を探しています O (ん1 + ϵ)O(n1+ϵ)O(n^{1+\epsilon}) スペース)と高速(O (んε)O(nϵ)O(n^{\epsilon}) または O (l ogk(n ))O(logk(n))O(log^k(n)) 最悪の場合のクエリ時間)。 私がすでに知っていることの要約として: 1Dは簡単です(ポイントを並べ替えてバイナリ検索を使用するだけです)。 2Dは少しトリッキーですが、ポイント位置データ構造+ボロノイ図を使用すると、 O (n )O(n)O(n) スペースと O (l o g(n ))O(log(n))O(log(n)) クエリ時間。 3D以上では、一連の点のボロノイ図は O (んfl o o r (d/ 2))O(nfloor(d/2))O(n^{floor(d/2)})。 私はkdツリーまたはグリッドベースの方法に基づくおおよその手法を知っていますが、これらは点の均一な分布または最近傍への距離について何かを仮定することに依存しており、すべてのケースでそれほどうまく機能しません。私はこれらのランダム化または近似解には興味がありません-最悪の場合、どのデータセットでも機能するものが欲しいです。これを行うものはありますか、またはこのアイデアを水から吹き飛ばす下限がありますか?

3
バイナリツリーは、実際のアプリケーションでハッシュテーブルよりも優れているのはいつですか?
私は現在、データ構造と基本的なアルゴリズムを利用しています。その一部がバイナリツリーです。私はアルゴリズムを理解し、二分探索木などを実装する方法を理解しています。O(log n)時間でルックアップを実行できるのは非常に賢明です。 しかし、ハッシュテーブルが同じ/より良い仕事をしないバイナリツリーを使用する場合の例を見つけるのに苦労しています。私は周りを検索していて、それが3Dグラフィスに使用されていることを発見しました。表示するアイテムについての何かですが、これに関連して苦労しています。 ハッシュテーブルよりもバイナリツリーを使用した方がよい例を教えてもらえますか?

1
時間前処理による時間でのツリーの到達可能性クエリ
通常のグラフ理論的な意味で無向木が与えられます。頂点所与及びエッジに入射、Iは、フォームのクエリに答える必要があるリターンを任意の葉から到達可能であるを含む経路で、およびno他のエッジに入射します?より非公式には、制限は、エッジが指定された場合、その方向にのみ進むことができるということです。TTTvvv(v,u)(v,u)(v,u)vvvTTTvvv(u,v)(u,v)(u,v)vvv DFSを実行して、見つかったリーフを返すだけです。これには時間かかると思いますはの直径です。ただし、クエリは時間で回答したいと思います。さらに、線形前処理時間のみを許可したいと思います。これを実現するための私のアイデアは、DFSを使用し、葉にラベルを付け、検索が逆戻りしたときにエッジにラベルを付けることでした。このアイデアは追加の努力でうまくいくかもしれませんが、詳細については本当にわかりません。O(d)O(d)O(d)dddTTTO(1)O(1)O(1) 「グラフ到達可能性」はいくつかの結果を出しましたが、おそらくより複雑な問題を扱っています。前処理時間を使用し、時間でクエリに応答する方法に満足しています。O(n+m)O(n+m)O(n+m)O(1)O(1)O(1)

2
ブルームフィルターと完全なハッシュ
A ブルームフィルタは、所与のセットのテストメンバーシップにハッシュ関数を使用して項目が指定された位置にないの存在するかどうかをチェックすることにより、。SSS ハッシュの衝突の影響を緩和するために、複数の関数が使用され、ユニバーサルハッシュを使用する場合の確率的限界が生成されます。 要素あたり10ビットを使用して、「妥当な」エラー率を実現できます。 セット完全なハッシュ関数を 直接構築でき、最後の要素がに存在しない場合、要素ごとに1ビットのみを使用して完全に回復できます。S+∞S+∞S + \inftySSS この推論が間違っている根本的な理由は何ですか?

4
最近アクセスした要素への高速アクセスと最悪の複雑さを持つバイナリツリー構造はありますか?
スプレーツリーのアイデアは、頻繁にアクセスされる要素を一番上に移動するので非常に優れています。これにより、多くのアプリケーションでかなりの速度を上げることができます。欠点は、最悪の場合、操作が複雑になる可能性があることです。(ただし、少なくとも操作を実行すると、償却済みの境界は。)O(n)O(n)O(n)O(nlogn)O(nlog⁡n)O(n\log n) nnn 両方を備えた自動調整検索ツリー構造はありますか?最近アクセスした要素を優先し、1回の操作で複雑さが最悪ですか?O(logn)O(log⁡n)O(\log n)

1
重みのバランスが悪くなることを回避できるバイナリ検索ツリーのデータ構造はありますか?
これは、「すべてのRed-Blackツリーのバランスが取れているわけではないのですか?」および「AVLツリーのウェイトバランスが取れていないのですか?」のフォローアップの質問です。\def\le{\leqslant}\def\ge{\geqslant} 定義:ルート付きツリーと頂点v \ in V(T)の場合、L_T(v)をvからの左サブツリー内のノード数、N_T(v)をルート付きサブツリー内のノード数とするで、V。Tは\ mu -balancedであり、0 \ le \ mu \ le \ frac {1} {2}であると言います。すべてのノードv \ in V(T)で不等式 \ mu \ le \ frac {L_T(v )+ 1} {N_T(v)+ 1} \ le 1-\ mu が成り立ち、\ muが最小の場合、この不等式の支配を受けます。TTTv∈V(T)v∈V(T)v \in V(T)LT(v)LT(v)L_T(v)vvvNT(v)NT(v)N_T(v)vvvTTTμμ\mu0⩽μ⩽120⩽μ⩽120 \le \mu \le \frac{1}{2}v∈V(T)v∈V(T)v \in V(T)μ⩽LT(v)+1NT(v)+1⩽1−μμ⩽LT(v)+1NT(v)+1⩽1−μ \mu \le \frac{L_T(v) + 1}{N_T(v) …

2
時間内にサフィックス配列を構築するアルゴリズム
最近、suffix配列を使用していて、理解しやすいsuffix配列を作成するための効率的なアルゴリズムを見つけることができません。多くのサイトでアルゴリズムがあることを見てきましたが、多くの重要な詳細が省略されているため、理解できません。Top Coderに例があります。O(nlog2n)O(nlog2⁡n)O(n \log^2 n) 誰かが私に理解しやすいサフィックス配列構築のための効率的なアルゴリズムを紹介してくれませんか?

1
ばらばらのセットのデータ構造の実用的なアプリケーション
エッジがグラフに動的に追加されるとき、素集合のデータ構造が無向グラフの接続されたコンポーネントを追跡するために使用されることを知っています。また、それがクラスカルの最小全域木アルゴリズムで使用されていることも知っています。このデータ構造の他の可能なアプリケーションは何ですか?

1
ノードの完全なバイナリツリーの深さはどれくらいですか?
この質問では、完全なバイナリツリーの次の定義を使用します†: 最後のレベルを除くすべてのレベルが完全に満たされ、最後のレベルのすべてのノードが左側にある場合、レベルのバイナリツリーは完全です。TTTNNN 以下はAlgorithmsからの抜粋です。 これ()は、ノードを持つ完全なバイナリツリーの深さでもあります。(より正確には、です。)logNlog⁡N\log NNNN⌊logN⌋⌊log⁡N⌋⌊\log N⌋ 上記の抜粋が真実なのはなぜですか? †もともとここで定義

1
「分散ハッシュテーブル」という用語の由来
私は現在、コンピューターサイエンスの学位論文のために、分散ハッシュテーブルの領域に関するトピックを研究しています。当然のことながら、私は質問に来ました。分散ハッシュテーブルという用語の由来です。(私はそれをハッシュテーブルの配布から単に導出することはロケット科学ではないことを知っていますが、誰かがどこかでそれを考え出したに違いありません)。 私が読んだほとんどの論文は、一貫したハッシュとそれを利用した最初のアルゴリズムの1つ(Chordなど)に関するオリジナルの論文を参照していました。私は80年代に分散データベースに関する多くの研究があったことを知っているので、この用語、またはおそらくその背後にある考えは、15年以上古いものである必要があると思います。 この質問の背後にある動機は、以前の日付と、おそらく同様のアイデアの別の用語を知っていると、私の研究のために収集できる有用な情報の範囲が広がる可能性があるということです。たとえば、他の人が私がしたいことと同じように何をしたか、どこで失敗したか。など 構造化オーバーレイネットワークを検索キーワードとして使用して、このトピックについてさらに詳しく調べようとしましたが、結果の定義/論文も非常に若いため、結局、研究トピックはそれほど古くないかもしれません。 分散ハッシュテーブルや構造化オーバーレイネットワークのトピックに関する以前の研究(90年代以前かもしれません)を知っている人はいますか?私がもっと歴史的な論文につながるようなキーワードを聞いてよかったです。

2
行列乗算プログラムの入れ子ループの不変式
Hoareロジックを使用して2つの行列を乗算するためのプログラムの正確性を証明することについて、卒業論文を作成しています。これを行うには、このプログラムの入れ子ループの不変式を生成する必要があります。 for i = 1:n for j = 1:n for k = 1:n C(i,j) = A(i,k)*B(k,j) + C(i,j); end end end 私は最初に内部ループの不変式を見つけようとしましたが、今までは本当のものを見つけることができません。上記のプログラムの不変式を見つけるのを手伝ってくれる人はいますか?
7 algorithms  loop-invariants  correctness-proof  formal-languages  regular-languages  pumping-lemma  logic  logic  programming-languages  lambda-calculus  term-rewriting  operational-semantics  complexity-theory  time-complexity  computability  proof-techniques  reductions  digital-preservation  distributed-systems  storage  algorithms  dynamic-programming  check-my-algorithm  reference-request  cryptography  quantum-computing  formal-languages  regular-languages  context-free  formal-grammars  algorithms  graphs  network-flow  algorithms  data-structures  randomized-algorithms  lists  computability  proof-techniques  undecidability  terminology  distributed-systems  parallel-computing  artificial-intelligence  heuristics  search-problem  algorithms  computational-geometry  algorithm-analysis  asymptotics  recurrence-relation  mathematical-analysis  master-theorem  algorithms  algorithm-analysis  runtime-analysis  computability  reductions  turing-machines  formal-languages  context-free 

1
一般的なソフトウェアで使用されるデータ構造に関する情報はどこにありますか?
私がデータ構造について教えているコースの一部として、学生に一般的なソフトウェア/サービスでのデータ構造の使用を調査して提示してもらいたいです。ただし、基本的なグーグル検索では、この情報がすぐに利用できないことがわかります。 誰かが私に学生と共有する可能性のある適切なリソースを彼らの研究の出発点として私に示すことができますか? 編集 受け取った回答から判断すると、元の質問は十分に明確ではないため、詳細を追加します。 たとえば、service-xがdata-structure-aを使用して、property-bのために機能性yを実行するというタイプのリソースを探しています。これは理想的なケースです。同様の情報を提供する他のリソースも歓迎します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.