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

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

1
実際のユニバーサルハッシュ
HHHh :U→ { 0 、… 、M− 1 }h:うん→{0、…、M−1}h: U \rightarrow \{0,\ldots,M-1\}∀ X 、Y∈ U、x ≠ y⇒ PrをH ∈ H[ h (x )= h (y)] ≤ 1M∀バツ、y∈うん、バツ≠y⇒Prh∈H[h(バツ)=h(y)]≤1M\forall x,y \in U, x \neq y \Rightarrow \Pr_{h \in H}[h(x) = h(y)] \leq \frac{1}{M} ユニバーサルハッシュの概念は、学部のデータ構造コースの標準的な部分になりました。産業用アプリケーションでのユニバーサルハッシュの重要性について学生を動機付けることができればうれしいです。だから私の質問は: ハッシュ関数のユニバーサルファミリーの構築は実際には重要ですか?答えが「はい」の場合、これまでに見た興味深い産業用アプリケーションをいくつか教えてください。

3
Insert、Delete、MostFrequentをサポートする効率的なデータ構造
セットあり、各メンバーがデータとキーのペアであると仮定します。次の操作をサポートするデータ構造が必要です。DDDDDDD にを挿入し、D(d,k)(d,k)(d,k)DDD メンバー削除します(を見つけるために検索する必要はありません。たとえば、はメンバーを指します)。e e DeeeeeeeeeDDD MostFrequentは、が最も頻度の高いキーの1つであるようなメンバーを返します(最も頻度の高いキーは一意である必要はありません)。E 。k e y De∈De∈De \in De.keye.keye.keyDDD このデータ構造の効率的な実装は何でしょうか? 私の解決策は、キーとその周波数によって優先順位付けされた周波数のヒープと、ハッシュ関数が同じキーを持つメンバーをハッシュテーブルの同じスロットにマップするハッシュテーブルです(各部分から他へのポインターを使用)。 これにより、最初の2つの操作にが、3番目の操作(最悪の場合の実行時間)にられます。Θ (1 )Θ(lgn)Θ(lg⁡n)\Theta(\lg n)Θ(1)Θ(1)\Theta(1) より効率的な解決策があるのだろうか?(または同じ効率のよりシンプルなソリューション?)


1
実際のキャッシュ忘却のパフォーマンスの評価に関する研究
キャッシュを無視するアルゴリズムとデータ構造は、Frigo et alによって導入されたかなり新しいものです。中のCache-忘れアルゴリズム、1999。同じ年のプロコップの論文も初期のアイデアを紹介しています。 Frigoらによる論文。理論と、キャッシュを無視するアルゴリズムとデータ構造の可能性を示すいくつかの実験結果を提示します。キャッシュを意識しないデータ構造の多くは、静的検索ツリーに基づいています。これらのツリーを保存およびナビゲートする方法は、おそらく最も顕著なものとして、Bender et al。また、Brodal et al。Demaineが概要を説明します。 実際にキャッシュの動作を調査する実験的な作業は、少なくともLadnerらによって行われました。でプログラム計装、2002を使用してキャッシュを意識し、キャッシュ紛失静的検索木のA比較。ラドナー等。古典的なアルゴリズム、キャッシュ忘却型アルゴリズム、キャッシュ対応アルゴリズムを使用して、バイナリ検索問題を解決するアルゴリズムのキャッシュ動作をベンチマークしました。各アルゴリズムは、暗黙的および明示的なナビゲーション方法の両方でベンチマークされました。これに加えて、2003年のRønnの論文では、同じアルゴリズムを非常に詳細に分析し、Ladner et al。と同じアルゴリズムのさらに徹底したテストも実行しました。 私の質問は それ以来、実際にキャッシュを使用しないアルゴリズムのキャッシュ動作のベンチマークに関する新しい研究はありますか?特に静的検索ツリーのパフォーマンスに興味がありますが、他のキャッシュを意識しないアルゴリズムとデータ構造にも満足しています。

2
バイナリツリーの証明には、最大で葉があります
ノードを持つ二分木が最大で葉を持っていることを証明しようとしています。誘導でこれを行うにはどうすればよいですか?nnn⌈ n個2⌉⌈n2⌉\left\lceil \frac{n}{2} \right\rceil ヒープに関する最初の質問でフォローしていた人々のために、それはここに移動されました。


1
ツリーのデータ構造に似た半格子のデータ構造はありますか?
ツリーを部分的に順序付けられたセットと見なすと、それは結合半数化の特殊なケースになります。半結合を結合するために、2つの要素の(一意の)最小上限(ほぼ)を効率的に計算できるようにします。ツリーの場合、これを可能にするデータ構造は、対応するノードの各要素に対して、親へのポインターとルートへの距離メジャーを格納することです。(実際には、通常「ルートまでの距離測定」に使用されるトポロジカルソートに基づくラベリングは、事実上必要なのは、効率的に評価できる互換性のある半順序だけです)。 各有限半結合は、最小の上限がセットの和集合によって与えられるような順序での包含を持つ有限セットのサブセットのセットとして表すことができます。したがって、各要素を有限数のタグで表し、対応するタグの和集合で最小の上限を計算することが、1つの可能なデータ構造になります。(補数を見ると、対応するタグの共通部分として最小上限を定義することも可能です。)より一般的なデータ構造は、マトリックスを使用して「a <= b」または「join(a、b)」のすべての結果。 ただし、このようなデータ構造を使用してツリーを表すことは、奇妙なことです。2つの要素の(一意の)最小上限の(多かれ少なかれ)効率的な計算を依然として可能にする、結合半格子のツリー構造のデータ構造はもっとありますか?(おそらく、ノードの追加情報がツリーのルートまでの距離測定に似た何らかの種類の有向非周期グラフですか?)


2
インメモリインデックスに適したスナップショットテーブルデータ構造
私は、非常に具体的なユースケース向けにインメモリオブジェクトデータベースを設計しています。単一のライターですが、効率的な同時読み取りをサポートする必要があります。読み取りは分離する必要があります。クエリ言語はありません。データベースは次のもののみをサポートします。 属性/属性のセットによってオブジェクト/ -sを取得します(式のサポートがあるかもしれません、例えばx.count < 5) オブジェクトの属性を取得 クエリは、上記の任意の数の操作で構成される必須のスクリプトです。データサイズは<<メモリであるため、ほとんどの属性のすべてのオブジェクトとインデックスは、スワップすることなく快適に収まるはずです。 必要なのは、オブジェクトの属性インデックスのデータ構造です。これは、書き込み時のO(n)であり、書き込みの同時実行性をサポートしませんが、理想的にはO(1)スナップショット(書き込み時のコピー)およびO(logN)アクセスをサポートする必要があります。理想的には、バージョン間で最大限の構造共有を行うことで、読み取りの同時実行性を高めることができます。 私はCTries、コンカレントBST、コンカレントスプレイツリーを見ていましたが、ここで本当に正しい方向を見ているかどうかはわかりません。上記の構造は、私が気にしない挿入の複雑さに多くの注意を払っています。 質問:すぐに使用できるユースケースに適した既知のデータ構造はありますか? 編集:もう少し考えた後、永続的なBST / Splayツリーが機能するようです。ライターは「マスター」コピーを更新し、クエリは実行の開始時にツリーを取得し、完了後に破棄します。しかし、より良い解決策があるかどうかはまだ興味があります。

4
カッコウハッシュが動的な完全ハッシュよりも優れている点は何ですか?
動的な完全ハッシュテーブルとカッコウハッシュテーブルは、最悪の場合のO(1)ルックアップと予想されるO(1)時間の挿入と削除をサポートする2つの異なるデータ構造です。どちらもO(n)補助スペースと、操作のためにハッシュ関数のファミリーへのアクセスが必要です。 これらのデータ構造はどちらもそれ自体で美しく、素晴らしいと思いますが、これらのデータ構造が他のデータ構造よりもいつどのように望ましいかはわかりません。 これらのデータ構造の1つが他のデータ構造よりも明確な利点を持っている特定のコンテキストはありますか?それとも、ほとんど交換可能ですか?

2
BSTでの検索時に可能な検索パスの数
次の質問がありますが、答えはありません。私の方法が正しいかどうか私は感謝します: Q.バイナリサーチツリーでキー値60を検索すると、キー値10、20、40、50、70、80、90を含むノードが、必ずしも指定された順序で移動されるわけではありません。これらのキー値が、値60を含むルートノードからの検索パスで発生する可能性のある順序はいくつありますか? (A)35(B)64(C)128(D)5040 質問から、与えられたすべてのノードをトラバーサルに含める必要があり、最終的にキー60に到達する必要があることを理解しています。たとえば、そのような組み合わせの1つは次のようになります。 10、20、40、50、90、80、70、60。 上記のすべてのノードをトラバースする必要があるため、10または90から開始する必要があります。20から開始すると、10に到達しません(60> 20であり、20の右サブツリーをトラバースするため)。 同様に、80から始めることはできません。90に到達できないためです。80> 60なので、80の左のサブツリーをトラバースし、90に到達しません。 残りのノードは20、40、50、70、80、90です。次のノードは20または90のいずれかです。前述の同じ理由で他のノードを取得することはできません。 同様に考えると、各レベルで2つの選択肢があります。ノードは7つあるため、最初の6つには2つの選択肢があり、最後の1つには選択肢がありません。だから完全にあります 2∗2∗2∗2∗2∗2∗12∗2∗2∗2∗2∗2∗12*2*2*2*2*2*1順列= = 6426262^6646464 これは正解ですか? そうでない場合、より良いアプローチは何ですか? 一般化したいと思います。場合ノードが次に与えられる合計の可能な検索パスは次のようになり2 n − 1nnn2n−12n−12^{n-1}

2
O(k)メモリO(n)時間のみを使用して、指定されたシーケンスからk番目に小さい要素を見つける
一連のnnn数値を1つずつ読み取るとします。O (k )セルメモリを使用して線形時間(O (n ))でkkk番目に小さい要素を見つける方法。私たちは最初に保存すべきだと思うk個のシーケンスの条件をして取得するときのk + 1番目の用語を、私たちは必ずそれができないことを期削除のk番目に小さい要素[保存" のk + 1番目の用語を。したがって、各ステップでこの使用できない用語を示すインジケーターが必要であり、このインジケーターは各ステップですばやく更新される必要があります。「マックス」から始めましたO(k)O(k)O(k)O(n)O(n)O(n)kkkk+1k+1k+1kkkk+1k+1k+1; しかし、迅速に更新することはできません。つまり、maxを考慮した場合、最初の削除ではmaxを逃し、線形ではないO(k)O(k)O(k)とその原因(n−k)×O(k)(n−k)×O(k)(n-k)\times O(k)時間でmaxを検索する必要があります。おそらく、シーケンスの最初のkkk項をよりインテリジェントに保存する必要があります。 この問題を解決するにはどうすればよいですか?

2
配列に似た不変の(永続的な)データ構造の実装で、高速なインデックス付け、追加、追加、繰り返し
配列に似た永続的なデータ構造(ただし不変)を探しています。これにより、高速なインデックス作成、追加、先頭付加、反復(適切な局所性)操作が可能になります。 Clojureは永続的なVectorを提供しますが、これは高速追加専用です。ScalaのVectorは効果的に一定時間の追加と付加を行いますが、Clojureベクトルと同じデータ構造(ビットマップベクトルトライ)に基づいているため、実装方法を取得できません。いくつかのトリックがないと、高速なプリペンドはできません。 すぐに使用できる実装ではなく、そのようなデータ構造を自分で実装する方法の説明に興味があります。

1
間隔のマップのデータ構造
ましょ整数であり、およびlet全ての整数の集合を表します。ましょう整数の意味間隔。nnnZZ\mathbb{Z}[a,b][a,b][a,b]{a,a+1,a+2,…,b}{a,a+1,a+2,…,b}\{a,a+1,a+2,\dots,b\} マップを表すデータ構造を探しています。データ構造で次の操作をサポートする必要があります。f:[1,n]→Zf:[1,n]→Zf:[1,n] \to \mathbb{Z} get(i)get(i)\text{get}(i)は返します。f(i)f(i)f(i) set([a,b],y)set([a,b],y)\text{set}([a,b],y)更新する必要がので、すなわち、更新新しいマップにこのような forおよび for。ffff(a)=f(a+1)=⋯=f(b)=yf(a)=f(a+1)=⋯=f(b)=yf(a)=f(a+1)=\cdots=f(b)=yffff′f′f'f′(i)=yf′(i)=yf'(i) = yi∈[a,b]i∈[a,b]i \in [a,b]f′(i)=f(i)f′(i)=f(i)f'(i) = f(i)i∉[a,b]i∉[a,b]i \notin [a,b] stab(i)stab(i)\text{stab}(i)は、とが一定になるような最大間隔を返す必要があります(つまり、)。[a,b][a,b][a,b]i∈[a,b]i∈[a,b]i \in [a,b]fff[a,b][a,b][a,b]f(a)=f(a+1)=⋯=f(b)f(a)=f(a+1)=⋯=f(b)f(a)=f(a+1)=\cdots=f(b) add([a,b],δ)add([a,b],δ)\text{add}([a,b],\delta)更新する必要が新しいマップにようにためのと for。、F ' 、F '(I )= F (I )+ δ I ∈ [ 、B ] F '(I )= F (I )I ∉ 〔、B ]ffff′f′f'f′(i)=f(i)+δf′(i)=f(i)+δf'(i) = f(i) + \deltai∈[a,b]i∈[a,b]i \in [a,b]f′(i)=f(i)f′(i)=f(i)f'(i) = …

3
さまざまなトピックに関するアルゴリズムの本
この投稿を改善したいですか?引用や回答が正しい理由の説明など、この質問に対する詳細な回答を提供します。十分な詳細がない回答は、編集または削除できます。 私は私たちの小さな会社(約15人)のためのアルゴリズムに関する本のライブラリを構築する任務を負っています。予算は5kを超えていますが、確かに10k未満なので、かなりの数の本を購入できます。ここにいるすべての人は、CSまたは密接に関連する分野で少なくとも学士号を取得しているため、Cormenのような基本的な教科書を入手しますが、より高度なトピックに関する優れた本に興味があります。(ちなみに、Knuthの4巻を入手します。) トピックのリストは次のとおりです。 並べ替えアルゴリズム グラフアルゴリズム 文字列アルゴリズム ランダム化されたアルゴリズム 分散アルゴリズム 組み合わせアルゴリズム 等 本質的に私は、アルゴリズムとデータ構造に関連するCS内の主要なトピックに関する本の良い推薦を探しています。特に、良い学校の学士号の一部として、アルゴリズムとデータ構造のクラスで通常カバーされているものを超えるもの。一般的に有用な資料を探しているので、質問はかなりあいまいです。私たちが開発するソフトウェアは、主に大量のデータを処理するシステムレベルのものです。 理想はまた、ほとんどの人が聞いたことがないかもしれないかなり最近のクールなデータ構造とアルゴリズムをカバーするものを見つけることです。 編集:ここに私が入手する必要があると思う予備的な本があります: コーメン他によるアルゴリズムの紹介。 クラインバーグ、タルドスによるアルゴリズム設計 Art of Computer Programming Vol 1-4、Knuth著 Vaziraniによる近似アルゴリズム ウィリアムソン、Shmoysによる近似アルゴリズムの設計 Motwani、Raghavanによるランダム化アルゴリズム Sipserによる計算理論の紹介 アローラ、バラクによる計算の複雑さ ギャリーとジョンソンによるコンピュータと扱いにくさ Schrijverによる組み合わせ最適化 言語設計、コンパイラ、および形式的手法の技法とアルゴリズムを扱う、同僚が欲しかった他のいくつかの本は次のとおりです。 Pierceによる型とプログラミング言語 加藤園バイエルによるモデル検査の原則 コンパイラ:Aho、Lam、Sethi、Ullmanによる原則、テクニック、ツール コンパイラー設計ハンドブック:最適化と機械コードの生成、Srikant、Shankarによる第2版 ガーベッジコレクションハンドブック:ジョーンズ、ホスキング、モスによる自動メモリ管理のアート

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