タグ付けされた質問 「priority-queues」

9
抽出を持つ優先度キューが存在しますか?
プライオリティキューインターフェイスを実装するデータ構造は非常に多くあります。 挿入:構造に要素を挿入します Get-Min:構造内の最小要素を返します Extract-Min:構造内の最小要素を削除します このインターフェイスを実装する一般的なデータ構造は、(最小)ヒープです。 通常、これらの操作の(償却)実行時間は次のとおりです。 挿入:(時々O(log n ))O(1)O(1)\mathcal{O}(1)O(ログn )O(log⁡n)\mathcal{O}(\log n) Get-Min:O(1)O(1)\mathcal{O}(1) Extract-Min:O(ログn )O(log⁡n)\mathcal{O}(\log n) フィボナッチヒープは、例えば、これらの実行中の時間を実現します。さて、私の質問は次のとおりです。 次の(償却)実行時間のデータ構造はありますか? 挿入:O(ログn )O(log⁡n)\mathcal{O}(\log n) Get-Min:O(1)O(1)\mathcal{O}(1) 抽出分:O(1)O(1)\mathcal{O}(1) ソートされた入力が与えられたときに時間でそのような構造を構築できる場合、例えば、o (nO(n)O(n)\mathcal{O}(n)交差点は、「通常の」優先度キューを使用する場合よりも厳密に高速です。o (nログn)o(nlog⁡n)o\left(\frac{n}{\log n}\right)

3
バイナリ最小ヒープのキーの増加とキーの減少
バイナリヒープの多くの議論では、通常、min-heapでサポートされている操作として減少キーのみがリストされています。たとえば、CLR 6.1章およびこのウィキペディアのページ。通常、min-heapのキーが増加しないのはなぜですか?増加した要素(x)を最小の子と繰り返し交換することにより、O(height)で、子がxより大きくなるまでそれを行うことができると思います。 例えば IncreaseKey(int pos, int newValue) { heap[pos] = newValue; while(left(pos) < heap.Length) { int smallest = left(pos); if(heap[right(pos)] < heap[left(pos)]) smallest = right(pos); if(heap[pos] < 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
ヒープ
おそらく、この質問は以前に聞かれます。CLRS(2nd Ed)problem 6.5-8からのものです- 得マージに時間アルゴリズムをK 1つのソートされたリストの中にリストをソートし、N、すべての入力リスト内の要素の総数です。(ヒント:k方向のマージには最小ヒープを使用します。)O(nlgk)O(nlg⁡k)O(n \lg k)kkknnnkkk あるとしてリストをソートし、合計n個の値、私たちはそれぞれのリストが含まれていると仮定しましょうn個kkknnn番号、また各リストのは、厳密に昇順にソートされ、そして結果はまた、昇順に格納されます。nknk\frac{n}{k} 私の擬似コードはこのように見えます- list[k] ; k sorted lists heap[k] ; an auxiliary array to hold the min-heap result[n] ; array to store the sorted list for i := 1 to k ; O(k) do heap[i] := GET-MIN(list[i]) ; pick the first element ; and …

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 

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)

2
なぜ最小優先度キュー(ヒープベース)で、「セットキー」だけでなく「減少キー」と呼ばれるのですか?
min-priorityキューで減少キーを呼び出すとき、基本的にキーを設定しているので、誤って高いキーを置くことができますよね?では、なぜ「set-key」または「update-key」と呼ばれないのでしょうか。なぜ(ウィキペディアや他のソースによると)最小優先度キューに「減少キー」があり、最大優先度キューに「増加キー」があるのですか?「set-key」の両方がないのはなぜですか。それを減らすか増やす場合は、ヒーププロパティを不変に保つために何をすべきですか。 つまり、最小ヒープで減少キーを呼び出して、より大きな値を指定するとどうなるでしょうか。例外をスローしますか?「set-key」と呼んで、あらゆる種類の値を処理しないのはなぜですか。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.