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

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

5
ハッシュテーブル操作O(1)とはどのようなデータですか?
答えから(いつ)ハッシュテーブルルックアップはO(1)ですか?、データが特定の統計条件を満たしている場合、ハッシュテーブルには少なくとも償却されたO(1)O(1)O(1)最悪の場合の振る舞いがあり、これらの条件を広くするのに役立つテクニックがあります。 しかし、プログラマーの観点から、私は自分のデータが何であるかを事前に知りません。それはしばしば外部ソースから来ます。そして、一度にすべてのデータを取得することはめったにありません。挿入と削除は、ルックアップの速度をそれほど下回らない速度で行われることが多いため、データを前処理してハッシュ関数を微調整します。 だから、一歩を踏み出す:データソースに関する知識があれば、ハッシュテーブルにO(1)O(1)O(1)操作の可能性があるかどうか、そしておそらくハッシュ関数で使用するテクニックを判断するにはどうすればよいですか?

3
nullノードを表すためにNILを使用する目的は何ですか?
私のAlgorithms and Data Structuresコースでは、教授、スライド、および本(Introduction to Algorithms、第3版)NILは、たとえば存在しないノード(ツリー内)の子を示すためにこの単語を使用しています。 かつて、講義中NILに、クラスメートが言ったのではなく、と言ったのですが、null教授は彼を修正しましたが、教授がこの言葉を強調する理由がわかりません。 人々NILがnull、またはnone、または他の単語の代わりに単語を使用する理由はありますか?ないNIL他の人が持っていないことをいくつかの特定の意味がありますか?歴史的な理由はありますか? また、ウェブのいくつかの場所で、たとえばのnull代わりに単語が使用されているのを見たことがあることに注意してくださいNIL。通常、この最後の単語が使用されます。

2
抽象データ構造と具象データ構造の違いは何ですか?
私は中Iソーまで、連想配列(すなわちマップ、または辞書)とハッシュテーブルは同じ概念だと思っていたウィキペディアこと バインディングの数が非常に少ないディクショナリの場合、バインディングのリンクリストであるアソシエーションリストを使用してディクショナリを実装することは理にかなっています。... 連想配列の最も頻繁に使用される汎用実装は、ハッシュテーブルを使用したものです。バインディングの配列と、考えられる各キーを配列インデックスにマッピングするハッシュ関数を使用します。... 辞書は、バイナリ検索ツリー、または基数ツリー、試行、Judy配列、van Emde Boasツリーなどの特定のタイプのキーに特化したデータ構造に格納することもできます。... だから、私の問題は、連想配列(マップや辞書など)が抽象データ型であり、ハッシュテーブルが具体的なデータ構造であり、異なる具体的なデータ構造を使用して実装できることを知らないことだと思う同じ抽象データ型。 私の質問は 抽象データ構造と具体的なデータ構造の違いと関係は何ですか? それぞれの例(抽象および具体的なデータ構造)は何ですか?より良い。 どのような抽象データ構造を実装するためにどの具体的なデータ構造を使用できるかというリストはありますか?持っているといいでしょう。

2
Google Code Jam万里の長城問題のより速い解決策はありますか
次のGoogle Code Jamラウンド1Cの質問を検討してください。 万里の長城は無限の線から始まり、すべての場所の高さはです。000 いくつかの部族NNN、N≤1000N≤1000N \le 1000は、開始日DDD、開始強度SSS、開始西座標WWW、開始東座標Eのパラメーターに従って、壁を壁に攻撃します。EEE。この最初の攻撃は、DDD日、範囲[W,E][W,E][W,E]、強度SSSます。[W、E]内に[W,E][W,E][W,E]高さ&lt;Sの万里の長城の部分がある場合&lt;S&lt;S< S、攻撃は成功し、その日の終わりに、[W,E][W,E][W,E]の高さ&lt;S&lt;S< Sは高さになるSSS(またはその日、他の攻撃が同じセグメントに強度ヒットした場合)S′&gt;SS′&gt;SS' > S 各部族は退却する前に最大攻撃を実行し、各攻撃はその前の攻撃から繰り返し決定されます。すべての部族は、いくつか持っている、、および攻撃の彼らの順序を決定します。お待ちしております攻撃の間に日を、彼らは攻撃範囲に移動します各攻撃(ネガティブ=西、正の単位を=東)、ただし、範囲のサイズは同じままであり、各攻撃の後、その強さも一定の値で増加/減少します。100010001000δDδD\delta_DδXδX\delta_XδSδS\delta_SδD≥1δD≥1\delta_D \ge 1δXδX\delta_X 問題の目標は、攻撃している部族の完全な説明が与えられれば、攻撃が成功する数を決定することです。 約20秒で動作するソリューションをコーディングできました。実装したソリューションにはO(AlogA+(A+X)logX)O(Alog⁡A+(A+X)log⁡X)O(A\log A + (A+X)\log X)時間かかります。ここで、A=A=A =攻撃の総数シミュレーション(最大100000010000001000000)、およびX=X=X =攻撃範囲の一意のエッジポイントの総数(最大200000020000002000000)。 高いレベルで、私のソリューション: すべての部族情報を読み込みます 攻撃範囲のすべての一意のXXX座標を計算しますO(A)O(A)O(A) 最小の高さの値を追跡するXXX範囲上の遅延更新されたバイナリツリーとして壁を表します。リーフは、間に何もない2つのXXX座標のスパンであり、すべての親ノードは、子によってカバーされる連続的な間隔を表します。- O(XlogX)O(Xlog⁡X)O(X \log X) すべての部族が実行するすべての攻撃を生成し、日ごとにソートしますO(AlogA)O(Alog⁡A)O(A \log A) 各攻撃について、成功するかどうかを確認します(logXlog⁡X\log Xクエリ時間)。日が変わったら、未処理のすべての成功した攻撃をループし、それに応じてウォールを更新します(logXlog⁡X\log X各攻撃の\ log X更新時間)。- O(AlogX)O(Alog⁡X)O(A\log X) 私の質問はこれです:よりも良い方法はありか?おそらく、部族の連続攻撃の線形性を利用する戦略的な方法はありますか?20秒は、意図したソリューションには長すぎると感じます(ただし、Javaはそのせいかもしれません)。O(AlogA+(A+X)logX)O(Alog⁡A+(A+X)log⁡X)O(A\log A + (A+X)\log X)

2
二分木の色を赤黒木にする
一般的なインタビューの質問は、特定のバイナリツリーが高さのバランスが取れているかどうかを判断するアルゴリズムを提供することです(AVLツリー定義)。 赤黒木で似たようなことができるのかと思っていました。 任意の未着色のバイナリツリー(NULLノード)が与えられた場合、ノードが赤黒ツリーのすべてのプロパティを満足するようにノードを赤/黒に色付けできるかどうかを判断できる「高速」アルゴリズムがあります。 (この質問のような定義)? 最初の考えは、NULLノードを削除して、結果のツリーが赤黒ツリーになり得るかどうかを再帰的に検証しようとすることでしたが、それはどこにも行かないようでした。 私は論文を(簡単に)ウェブ検索しましたが、この問題に対処していると思われるものを見つけることができませんでした。 単純なものが欠けている可能性があります。

3
バイナリ最小ヒープのキーの増加とキーの減少
バイナリヒープの多くの議論では、通常、min-heapでサポートされている操作として減少キーのみがリストされています。たとえば、CLR 6.1章およびこのウィキペディアのページ。通常、min-heapのキーが増加しないのはなぜですか?増加した要素(x)を最小の子と繰り返し交換することにより、O(height)で、子がxより大きくなるまでそれを行うことができると思います。 例えば IncreaseKey(int pos, int newValue) { heap[pos] = newValue; while(left(pos) &lt; heap.Length) { int smallest = left(pos); if(heap[right(pos)] &lt; heap[left(pos)]) smallest = right(pos); if(heap[pos] &lt; heap[smallest]) { swap(smallest, pos); pos= smallest; } else return; } } 上記は正しいですか?そうでない場合、なぜですか?はいの場合、min-heapのキーがリストされないのはなぜですか?

6
infimaで部分的に順序付けられた優先度の優先度キュー
複合型であり、部分的にのみ順序付けられている優先順位を持つオブジェクトがいくつかあります。この優先度の順にオブジェクトを選択する必要があります(つまり、毎回最小限のアイテムを生成します)。しかし、注文を勝手に完了するのではなく、キューが安定している場合は、最小要素が複数ある場合に最も古い要素を最初に返す必要があるという意味でキューの方が好ましいと思います。 半順序で機能するヒープデータ構造はありますか?または、それを使用するための通常の優先度キューの変更?私が必要とするアルゴリズムの一般的な選択は、単純なバイナリまたは4進数のヒープですが、それは半順序では機能しません。 優先度の値は次をサポートします。 操作usingを使用した順序付け≼≼\preccurlyeq。それがいる可能性がありますので、それは、半順序だ≼ bが偽とあるB ≼もfalseです。私は書く⋚ ̸ Bその場合に。a≼ba≼ba \preccurlyeq bb≼ab≼ab \preccurlyeq aa⋚̸ba⋚̸ba \not\lesseqgtr b inf(xi)inf(xi)\inf(x_i)yyyy≼xiy≼xiy \preccurlyeq x_innnO(n)O(n)O(n) 半順序の線形拡張を定義できます。アルゴリズムがそのように機能するため、優先キューに使用するのは簡単な方法です。ただし、順序はパフォーマンスに影響し、挿入の順序は最悪の場合を回避するのに最適であるように見えます。 さらに、これで使用したいアルゴリズムは、キュー内のすべての優先順位の下限を知る必要があります。 優先順位には実際の意味がありますが、変更される可能性があるため、他のプロパティに依存することは現実的ではありません。 注:バイナリヒープは半順序では機能しません。aaa、bbb、およびcのバイナリヒープを想定しますccc。ここでa≼ca≼ca \preccurlyeq cおよびa⋚̸ba⋚̸ba \not\lesseqgtr bおよびa⋚̸ca⋚̸ca \not\lesseqgtr cです。それらはこの順序で配置されているため、 a (0) / \ b (1) c (2) ここでdが挿入されます。次の空き位置は3で、bの左の子なbbbので、次のようになります a (0) / \ b (1) c (2) / d (3) 場合は(暗示た推移から、しかし、については何も言うことはありませんと)と、そしてと交換されませんそれはあまりありませんので、。しかし、実際には未満です、それと比較されていないため、現在、主要なヒープ不変式は保持されていません。topは最小限ではありません。d≼ad≼ad \preccurlyeq ad≼cd≼cd …

2
AO *アルゴリズムを実装する方法は?
検索アルゴリズムを実装するときに、異なるデータ構造が使用されることに気付きました。たとえば、キュ​​ーを使用して幅優先検索を実装し、スタックを使用して深さ優先検索を実装し、最小ヒープを使用してA *アルゴリズムを実装します。これらの場合、検索ツリーを明示的に構築する必要はありません。 しかし、AO *アルゴリズムの検索プロセスをシミュレートする単純なデータ構造を見つけることはできません。検索ツリーを明示的に構築することがAO *アルゴリズムを実装する唯一の方法であるかどうかを知りたいですか?誰でも私に効率的な実装を提供できますか?

2
バイナリヒープを証明する有し
私がいることを証明しようとしているバイナリヒープを持つのノードが正確に持って⌈ nはnnn葉は、ヒープは次のように構築されていることを考えます:⌈ n個2⌉⌈n2⌉\left\lceil \frac{n}{2} \right\rceil percolate upを介して新しいノードがそれぞれ挿入されます。これは、次に使用可能な子で新しいノードをそれぞれ作成する必要があることを意味します。これが意味することは、子供たちはレベルダウンで、左から右に満たされているということです。たとえば、次のヒープ: 0 / \ 1 2 う有し、このために構築されました:0、1、2(数値は、彼らが、そのノードに保持されている実際のデータの兆候を与えない、単に指標です。) これには2つの重要な意味があります。 レベルkが完全に満たされていなければ、レベルノードは存在できません。k + 1k+1k+1kkk 子は左から右に構築されるため、レベルノード間に「空のスペース」、または以下のような状況はありません。 k + 1k+1k+1 0 / \ 1 2 / \ \ 3 4 6 (これは私の定義では違法なヒープです。)したがって、このヒープを考える良い方法は、ヒープの配列実装です。 だから、私は誘導がおそらくこれを行うための良い方法になると思っていた...おそらくnのための奇妙なケースでさえ対処しなければならない何か。たとえば、この方法で構築されたヒープでさえ、偶数nには1つの子を持つ内部ノードがあり、奇数nにはそのようなノードがないという事実を使用した帰納法です。アイデア?

2
点のプロットが空間へのパーティションを定義するこのデータ構造/概念とは
実世界の問題を解決するためのアルゴリズムに遭遇し、宿題の問題のために非常によく似たものを作成したクラスを覚えています。 基本的にはポイントのプロットであり、線は2つのポイント間で等距離になるように描画されます。これは、ポイントの周囲の線がそのポイントに最も近いエリアの形状を形成する完全なパーティションを形成します。これは誰かに鐘を鳴らしますか?説明をグーグルで調べて結果を得るのは大変でした。そして、それを他にどのように説明するかわかりません。うまくいけば、画像が役立ちます。

6
1つの配列に2つのスタックを実装する方法は?
まず、これは宿題の問題ではないと言いたいです。私はアルゴリズムの紹介-優れたプログラマーになるための有名なCLRSテキストを読んでいます。私はこの本で与えられた問題と演習を自分で解決しようとしています。 私が解決しようとしているエクササイズ10.1-2をから第10章基本データ構造 CLRS第二版から。その状態は次のとおりです。 1つの配列A [1..n]に2つのスタックを実装する方法を説明します。両方のスタックの要素の合計数がnでない限り、どちらのスタックもオーバーフローしないようにします。PUSHおよびPOP操作はO(1)時間で実行する必要があります。 私がこれまでに考え出した解決策は次のとおりです。 配列A [1..n]がS1 [1..i]とS2 [i..n]の 2つのスタックを実装するようにします。 用PUSH-S1およびPUSH-S2操作、スタックが「満杯」である場合、その後に要素をプッシュスタート他のスタック(例えば、スタック場合S1は新しい要素を押し込むことしようとしているときに一杯になった後にその要素をプッシュスタックS2およびその逆)。 このアプローチの問題は、どの要素がどのスタックに属しているかを「記憶」する方法がないため、POP-S1またはPOP-S2を確実に使用できないことです。スタックの要素が(キー、値)のペアであり、キーがスタック番号である場合、要素をポップするには、最悪の場合、iまたは(ni)回-O(n )(ここで間違っている場合は、お気軽に修正してください)、これはO(1)ではありません。 私はかなり長い間質問に頭を打ち続けてきました。私は正しい軌道に乗っていますか?誰かがこの問題を解決するための私の可能なポインターを与えることができますか? 一般に、これらの問題についてどのように「考える」べきですか?または、本当に知的な人だけがこの種の問題を解決できますか?これらのような問題に取り組む/解決する(つまり、経験を積む)ことで、私はこれで良くなりますか? 悟りを待っています。

3
動的グラフ関連の問題に取り組む方法
私は一般的なstackoverflowでこの質問をし、ここに導かれました。 一般的な部分的または完全に動的なグラフの問題に対処する方法を説明できる人がいるとすばらしいでしょう。 例えば: 各インスタンスでエッジが削除されたときに、インスタンスの無向加重グラフで2つの頂点間の最短パスを検索します。(u,v)(u,v)(u,v)nnn 各インスタンスでエッジが削除される場合など、n個のインスタンスの無向グラフで接続されたコンポーネントの数を検索します。 最近、プログラミングコンテストでこのジャンルの問題に遭遇しました。Webを検索したところ、動的グラフに関する多くの研究論文が見つかりました[1,2]。私はそれらのいくつかを読みました、そして、私はまっすぐなものを見つけることができませんでした(クラスタリング、スパース化など)あいまいです。 これらの概念をよりよく理解するための指針を提供できる人がいることを本当に感謝しています。 D. Eppstein、Z。Galil、GF Italianoによる動的グラフアルゴリズム(1999) G. Nannicini、L。Libertiによる動的グラフ上の最短経路(2008)

2
クワッドツリーに大きな幾何学的オブジェクトを保存するのにどの方法が適していますか?
幾何学的オブジェクトを四分木(または八分木)に配置する場合、いくつかの方法で単一ノードよりも大きなオブジェクトを配置できます。 オブジェクトの参照を、それが含まれるすべての葉に配置する オブジェクトの参照を、それが完全に含まれる最も深いノードに配置する #1と#2の両方 例えば: この画像では、4つのリーフノードすべてに(方法#1)、ルートノードのみに(方法#2)、または両方に(方法#3)円を配置できます。 クワッドツリーを照会するために、どの方法がより一般的で、なぜですか?

6
間隔内の2つの数値の最大XORを見つける:二次式よりも良いことはできますか?
lllrrr L ≤ I 、最大(I ⊕ J )最大(私⊕j)\max{(i\oplus j)}L ≤ I 、J ≤ Rl≤私、j≤rl\le i,\,j\le r ナイーブアルゴリズムは、考えられるすべてのペアを単純にチェックします。たとえば、ルビーでは次のようになります。 def max_xor(l, r) max = 0 (l..r).each do |i| (i..r).each do |j| if (i ^ j &gt; max) max = i ^ j end end end max end 私感私たちはより良い次より行うことができます。この問題のためのより良いアルゴリズムはありますか?

4
2つの大きなセット間のセットの差の計算
整数と 2つの大きなセットがあります。各セットには約100万のエントリがあり、各エントリは最大10桁の正の整数です。 BAAABBB およびを計算する最適なアルゴリズムは何ですか?つまり、ないのエントリのリストを効率的に計算するにはどうすればよいですか?これらの操作を効率的にするために、これら2つのセットを表すのに最適なデータ構造は何でしょうか?B ∖ A A BA ∖ BA∖BA\setminus BB ∖ AB∖AB\setminus AAAABBB 私が思いつく最良の方法は、これらの2つのセットをソート済みリストとして保存し、のすべての要素をすべての要素と線形に比較することです。もっと良くできますか?BAAABBB

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