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

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

1
ランダム化された溶融可能なヒープ-期待される高さ
ランダム化された融合可能なヒープには操作「meld」があり、それを使用して、挿入を含む他のすべての操作を定義します。 問題は、ノードを持つツリーの予想される高さは何ですか?nnn Gambin and Malinkowskiの定理1、ランダム化された融合可能な優先キュー(Proceedings of SOFSEM 1998、Lecture Notes in Computer Science vol。1521、pp。344–349、1998; PDF)は、この質問に対する答えを証明とともに示しています。しかし、なぜ書き込めるかはわかりません: E[hQ]=12((1+E[hQL])+(1+E[hQR])).E[hQ]=12((1+E[hQL])+(1+E[hQR])).\mathbb{E} [ h_Q] = \frac{1}{2} ((1 + \mathbb{E}[h_{Q_L}]) + (1 + \mathbb{E}[h_{Q_R}]))\,. 私にとって木の高さは hQ=1+max{hQL,hQR},hQ=1+max{hQL,hQR},h_Q = 1 + \max\, \{ h_{Q_L}, h_{Q_R}\}\,, これは次のように拡張できます。 E[hQ]=1+E[max{hQL,hQR}]=1+∑kP[max{hQL,hQR}=k].E[hQ]=1+E[max{hQL,hQR}]=1+∑kP[max{hQL,hQR}=k].\mathbb{E} [ h_Q] = 1 + \mathbb{E}[\max \,\{ h_{Q_L}, h_{Q_R}\}] = 1 + \sum …

1
動的グラフの関連コンポーネント情報を維持するための最も効率的なアルゴリズムとデータ構造は何ですか?
無向有限スパースグラフがあり、次のクエリを効率的に実行できる必要があるとします。 私sCo n n e c te d(N1、N2)私sCoんんected(N1、N2)IsConnected(N_1, N_2) -戻るとの間の経路がある場合と、そうでなければN 1 N 2 FTTTN1N1N_1N2N2N_2FFF Co n n e c t e dNo de s (N)CoんんectedNodes(N)ConnectedNodes(N)から到達可能なノードのセットを返しますNNN これは、グラフの接続されたコンポーネントを事前に計算することで簡単に実行できます。どちらのクエリも時間で実行できます。O (1 )O(1)O(1) エッジを任意に追加できるようにする必要がある場合A ddEdge (N1、N2)あddEdge(N1、N2)AddEdge(N_1, N_2) -次に、コンポーネントを分離セットデータ構造に格納できます。エッジが追加されるたびに、異なるコンポーネントの2つのノードを接続する場合、それらのコンポーネントをマージします。これが追加されますO (1 )O(1)O(1)のコストA ddEdgeあddEdgeAddEdgeとO (私nverseAckermann(|Nodes|))O(InverseAckermann(|Nodes|))O(InverseAckermann(|Nodes|))へのコストIsConnectedIsConnectedIsConnectedとCo n n e ctedNode sCoんんectedNodesConnectedNodes(同様かもしれませんO (1 )O(1)O(1))。 エッジを任意に削除できるようにする必要がある場合、この状況を処理するのに最適なデータ構造は何ですか?知っていますか?要約すると、次の操作を効率的にサポートする必要があります。 私s Co n n e …

3
関数型プログラミングには不変性が本当に存在しますか?
私は日常生活でプログラマーとして働いており、流行の言語(Python、Java、Cなど)をすべて使用していますが、関数型プログラミングが何であるかについては、まだはっきりとはわかりません。私が読んだことから、関数型言語の1つの特性は、データ構造が不変であることです。私にとってこれだけでも多くの疑問を投げかけます。しかし、最初に、不変性について私が理解していることについて少し書きます。私が間違っている場合は、自由に修正してください。 不変性についての私の理解: プログラムが起動すると、固定データを含む固定データ構造が含まれます これらの構造に新しいデータを追加することはできません コードに変数はありません すでにデータまたは現在計算されているデータから単に「コピー」することができます 上記すべてのため、不変性はプログラムに非常に大きなスペースの複雑さを追加 私の質問: データ構造がそのまま(不変)のままであると想定されている場合、リストに新しいアイテムを追加するにはどうすればよいですか? 新しいデータを取得できないプログラムがあることのポイントは何ですか?プログラムにデータを送りたいセンサーがコンピューターに接続されているとしましょう。これは、受信データをどこにも保存できないことを意味しますか? その場合、関数型プログラミングは機械学習にどのように役立ちますか?機械学習は、プログラムの「知覚」を更新するという仮定から構築されるため、新しいデータを保存します。

3
グラフ内のパスのコンパクトな表現
グラフの単純なパスのサブセットがあります。パスの長さはによって制限されます。ddd 選択したパス以外のパスが表示されないようにパスを表すことができる最もコンパクトな方法(メモリに関して)は何ですか? このパスのサブセットを何度も繰り返すアルゴリズムでこの表現を使用したいこと、そしてかなり高速にしたいことに注意してください。たとえば、標準の圧縮アルゴリズムは使用できません。 私の頭に浮かんだ表現の1つは、それらを1組の木として表現することでした。それを最適なツリー数に下げるのはNP困難だと思いますか?他にどんな表現が良いでしょうか?

2
少ないメモリフットプリントでセット実装を探す
セットデータタイプの実装を探しています。つまり、 サイズuのユニバースU = \ {0、1、2、3、\ dots、u – 1 \}からの動的サブセットSSS(サイズnnn)を維持します。U={0,1,2,3,…,u–1}U={0,1,2,3,…,u–1}U = \{0, 1, 2, 3, \dots , u – 1\}uuu 操作insert(x)(要素xをSに追加SSS)およびfind(x)(要素xがSのメンバーかどうかをチェックSSS) 他の操作は気にしません。オリエンテーションについては、私が使用しているアプリケーションでu≈1010u≈1010u \approx 10^{10}ます。 時間O(1)O(1)O(1)で両方の操作を提供する実装を知っているので、主にデータ構造のサイズを心配します。何十億ものエントリを期待していますが、できるだけスワッピングを避けたいです。 必要に応じて、ランタイムを犠牲にしてもかまいません。O(\ log n)の償却実行時間O(logn)O(log⁡n)O(\log n)は、私が認めることができるものです。予想されるランタイムまたは\ omega(\ log n)のランタイムω(logn)ω(log⁡n)\omega(\log n)は許可されません。 私の考えの1つは、SSSを範囲の和集合として表すことができれば[xmin, xmax]、パフォーマンスがいくらか低下する代わりに、ストレージサイズを節約できるということです。また、など、他のいくつかのデータパターンも可能[0, 2, 4, 6]です。 そのようなことを行うことができるデータ構造を私に教えてもらえますか?

1
回転数が奇数のスプレーツリー
アイテムをスプレイツリーに挿入すると、回転はジグザ​​グまたはジグジグパターンに基づいてペアで実行されます。実行するローテーションの数が奇数の場合、リーフから開始する追加のローテーションを実行するか、追加のローテーションを保存してルートで実行することができます。それは重要ですか? たとえば、添付された画像では、4をBSTに挿入し、それをルートに「展開」します。図の上部で、最初にリーフノードにジグザグペアを配置し、下部からジグザグスプレーを実行して、ルートに最後の右回転を残します。図の下部では、最初に葉から奇数回転を行い、次にルートまでジグザグに広げます。 どちらが正しい?または、両方とも通常のスプレイツリーパフォーマンスにつながりますか?

2
確率的検索データ構造は役に立ちますか?
SkipListは、バランス調整されたツリーと同じ境界を提供し、再調整が不要であるという利点があります。SkipListはランダムコインフリップを使用して構築されるため、SkipListの構造が十分に「バランス」されている限り、これらの境界は保持されます。特に、一定のc > 0に対して1 / n cの確率で、要素を挿入した後にバランスの取れた構造が失われる可能性があります。O (ログn )O(log⁡n)O(\log n)1 / nc1/nc1/n^cc > 0c>0c>0 永久に実行される可能性のあるWebアプリケーションのストレージバックエンドとしてスキップリストを使用するとします。したがって、いくつかの多項式の操作の後、SkipListのバランスのとれた構造は失われる可能性が非常に高くなります。 私の推論は正しいですか?そのような確率的検索/ストレージデータ構造には実用的なアプリケーションがありますか?そうであれば、上記の問題をどのように回避しますか? 編集:私は、(クラシックな)ランダム化されたSkipListに比べて実装がはるかに複雑な、SkipListの確定的なバリアントがあることを認識しています。

1
重複を効率的に、少ないメモリオーバーヘッドで削除する
結果セットのみを格納する必要があるように、重複の整数のリストを効率的にフィルター処理したいと思います。 これを確認できる1つの方法: 整数の範囲、大きい(たとえば)S={1,…,N}S={1,…,N}S = \{1, \dots{}, N\}NNN2402402^{40} 関数があり、衝突が多いと思われます(画像はに均一に分布しています)。f:S→Sf:S→Sf : S \to SSSS 次に、を格納する必要があり。つまり、f[S]f[S]f[S]{f(x)|x∈S}{f(x)|x∈S}\{f(x) | x \in S\} かなり正確な(確率的)推定値がありであるため、事前にデータ構造を割り当てることができます()。| f [ S ] | ≈ 2 30|f[S]||f[S]||f[S]||f[S]|≈230|f[S]|≈230|f[S]| \approx 2^{30} 私はいくつかのアイデアを持っていますが、何が最善のアプローチになるかわかりません: 入力セットがメモリに収まらないため、ビットセットは問題外です。 ハッシュテーブルですが、(1)メモリオーバーヘッドが必要です|f[S]||f[S]||f[S]|(2)作成時にテーブルを調査する必要があり、メモリのオーバーヘッドのために追加の時間が必要です。 「オンザフライ」ソート、できれば複雑度(非比較ソート)。それに関して、バケットソートとフラッシュソートの主な違いは何なのかわかりません。O(N)O(N)O(N) 二分探索木を持つ単純な配列ですが、これには時間必要です。O(Nlog|f[S]|)O(Nlog⁡|f[S]|)O(N \log |f[S]|) ブルームフィルターまたは同様のデータ構造を使用すると、問題の緩和(誤検知を伴う)に役立つ可能性があります。 stackoverflowの上のいくつかの質問は、物事のこの種に取り組むように見える(/programming/12240997/sorting-array-in-on-run-time、/programming/3951547/java -array-finding-duplicates)、しかし私の要件に一致するものはないようです。

2
複雑度
分割操作は、複雑度 AVLツリーに実装できますO(logn)O(log⁡n)O(\log n)か?このトピックに関する記事または特定の情報へのリンクに興味があります。 分割操作は、キーに基づいて、AVLツリーを2つの派生AVLツリーに分割します。派生したツリーの1つは、すべてのキーが元のキーよりも小さいすべての頂点を含み、2番目のツリーは残りの頂点を含みます。 これはO(log2n)O(log2⁡n)O(\log^2 n)時間で実行できることを知っています。複雑さ実装へのリンクはO(log2n)O(log2⁡n)O(\log^2 n)次のとおりです。https: //code.google.com/p/self-balancing-avl-tree/ また、2つのAVLツリーをマージして、O(logn)O(log⁡n)O(\log n)時間で、一方のツリーのキーがすべて他方のキーよりも小さくなるようにする方法も知っています。以下は、複雑度実装O(logn)O(log⁡n)O(\log n)です。 def Merge(l, r) { if (!l || !r) return l ? l : r; if (l->h <= r->h) r->l = Merge(l, r->l), Rebalance(r); else l->r = Merge(l->r, r), Rebalance(l); }

1
ヘッジユニオンは常に分割統治と同じくらい速いですか?
Adamsは、2つのセットの和集合を見つけるための分割統治アルゴリズムを説明します(重みが均衡化されたバイナリ検索ツリーとして表されます)。次に彼は、分割統治アルゴリズムを改良したと主張する当時の新しい「ヘッジ結合」アルゴリズムについて説明します。しかし、彼はそれがであるべき理由の証明や実際の説明さえ提供していません。O(m+n)O(m+n)O(m + n) Blelloch、Ferizovic、およびSunは、Adamsの分割統治アルゴリズムが実際に理論的に最適な達成することを示してい。ここで、です。ただし、これらはヘッジユニオンアルゴリズムには対応していません。Θ(mlog(n/m+1))Θ(mlog⁡(n/m+1))\Theta (m \log (n/m + 1))m≤nm≤nm \le n ヘッジユニオンは実際、分割統治と同じくらい効率的ですか?最も目立たない部分はインナートリムです。少なくとも表面的には、完全に分割された左側と右側のサブツリー間で作業が重複しているように見えます。おそらくこれは何らかの理由で問題ないかもしれませんが、理由はわかりません。 さらなる調査:Haskell Data.SetとData.Map、交差と差分のヘッジバリアント、および共用体を使用します。これらのアルゴリズムに関する公開された議論はまったく見つかりませんでした。同様の質問がこれらにも当てはまります。

1
挿入と削除が一方的である場合の効率的な検索のためのデータ構造
の要素を格納するためのデータ構造が必要 です。各要素は異なる時間関連付けられてい 。 は変動し、理論的な上限がありますが、これは通常使用されるものよりも桁違いに大きくなります。んんnt私t私t_iんんn 私のアプリケーションを通して、私はそれを保証することができます: 挿入された要素は、既存のすべての要素より常に新しいものです。つまり、時間関連付けられた要素が挿入された場合、ます。要素は1つずつ挿入されます。tˇtˇ\check{t}tˇ&gt; t私∀ I∈ 1 、... 、n個tˇ&gt;t私∀私∈1、…、ん\check{t}>t_i ∀ i ∈ {1,…,n} 最も古い要素のみが削除されます。つまり、要素が削除された場合、ます。削除は主に1つずつ行われますが、誤って格納された要素の割合が1未満である限り、要素の削除が遅れても直接的な害はありません。jjjtj&lt; t私 ∀ I∈{1、...、N}∖{J}tj&lt;t私 ∀私∈{1、…、ん}∖{j}t_j < t_i ~∀ i ∈ \lbrace 1,…,n \rbrace \setminus \lbrace j \rbrace 挿入と削除を除いて、私がする必要がある唯一のことは、、ある時間の2つの隣接する要素を見つけること。言い換えると、t_j &lt;\ tilde {t} &lt;t_kおよび∄l {\ {1、…、n \}:t_j &lt;t_l &lt;t_k となるような2つの要素jと kを見つける必要があります。t〜t〜\tilde{t}分私t私&lt; t〜&lt; 最大私t私分私t私&lt;t〜&lt;最高私t私\min\limits_i t_i < \tilde{t} < …


2
AVLの中央値。AVLを活用する方法?
これが私の質問の出典です。 自己均衡ツリー(AVL)を指定して、中央値を返すメソッドをコーディングします。 (中央値:データサンプルの上半分と下半分を区切る数値。例:系列が 2、7、4、9、1、5、8、3、6 中央値は5です。) 私は次の解決策を提供できます: 指定されたツリーをトラバースし、要素の数を返します。 木をトラバース n / 2 + 1(n奇数の場合)して、順番にツリーウォークを適用します。値n / 2 + 1番目の要素は、中央値です。 しかし、二分探索木でそれを行うことができますか?AVLに適したアルゴリズムはありますか?

2
ハッシュテーブルのサイズ変更時にサイズ変更のカスケードを回避するにはどうすればよいですか?
個別のチェーンや線形/二次プローブなどの従来の衝突解決方法では、キーのプローブシーケンスを任意に長くすることができます。テーブルの負荷係数を低く維持することで、キーの確率を短くして、高い確率で維持できます。したがって、再ハッシュ中の衝突は負荷率に影響を与えないため、問題にはなりません。 ただし、カッコウハッシュ(および最悪の場合のO(1)ルックアップ時間を提供する他の方法)では、キーのプローブシーケンスが長くなりすぎると、サイズ変更が発生する必要があります。しかし、リハッシュ中にキーがシャッフルされると、1つのキーに対して長すぎるプローブシーケンスが作成され、別のサイズ変更が必要になる場合があります。確率は小さいですが、特に優れたハッシュ関数を使用すると、確率は低くなります。 再ハッシュ中に完全なハッシュ関数を明示的に生成するのではなく、この方法でサイズ変更をカスケードできないようにする方法はありますか?おそらく特定の衝突解決スキームに固有ですか?これまでに出会った文献は、問題を完全に覆い隠しているようです。ハッシュテーブルを成長させるだけでなく、縮小することにも興味があることを覚えておいてください。

1
グラフのエッジを格納するためのデータ構造
私は現在修士論文に取り組んでおり、それはグラフのクラスタリングについてです。私は問題を解決するためにアリを使用するアイデアで働いています。私は現在実装に取り​​組んでおり、グラフのエッジをどの程度正確に表すのか正確に疑問に思っています。 各エッジには、フェロモン値やアリがそのエッジを訪れた回数などの特定の情報が追加されます。私は無向グラフを操作しますが、これはかなり巨大になる可能性があり(100万頂点を超える)、エッジを格納してルックアップするための最も効率的な方法は何かと思っていましたか?私は規則に固執し、頂点IDが低く、頂点ID が高いものに従ってエンドポイントを格納することを考えてい(とはデータ構造のエッジのエンドポイントです)。しかし、私はこの場合ルックアップをどのように実行するのでしょうか?v1v1v_1v2v2v_2v1v1v_1v2v2v_2 私が隣接行列からエッジ配列に思いついたマッピングがありますが、それは基礎となるグラフが完全なグラフである場合にのみ機能します。だから、私はルックアップを効率的にする必要があると同時に、グラフが巨大になるのでエッジのストレージスペースを爆破したくないので、どうすればよいかについていくつかの提案を得るためにここに来ました。

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