スタックのみを使用して効率的な優先キューを実装する
-
29-09-2020 - |
質問
は、スタックデータ構造を使用してのみ効率的な優先キューを(ヒープとして効率的に)実装することが可能ですか?
ヒープを使用して実装されている優先キューの通常の効率は次のとおりです。
- min - $ o(1)$
- min - $ o(\ log n)$
- add - $ O(\ log n)$
スタックのみを使用して同じ複雑さで何かをすることは可能ですか?
Minecraft内のパスフィンディングアルゴリズムとして、*(ノードの優先順位を優先順位を優先する)を実装したいが、Minecraftはランダムアクセスを許可し、それに実装できる最も効力的な動的構造はスタックです。。
解決
残念ながら、それは不可能です。これらの項目の値に関係なく、スタックから項目を抽出する順序は、それらがプッシュされている順序によってのみ異なります。優先キューには、アイテムの値に依存する順序で削除される項目が必要です。
他のヒント
スタックやキューを実装できるスタックやキューを実装できるようにする(バイナリ)ヒープデータ構造を使用して、優先キューの完璧な表現を行うことができます。
優先キューでは、スタックのようなFILO原理ではなく、好みの問題です。
これは、Cormen et al。、アルゴリズムの紹介、第3版。
大丈夫、ヒープを使用した優先キューの実装は、ヒープ、max_heap、またはmin_heapのプロパティに関連しているため、min_priority_queueはmin_heapを使用してmin_heapを使用して実装できます。、挿入および削除。
(バイナリ)ヒープ自体は配列オブジェクトであり、ほぼ完全なバイナリ検索ツリーとして表示できます...
スタック実装(PSUDOコードがあります)
class Stack
Inner class Element
int priority // priority of the element.
Key element // the element it self
MAX_PRIORITY_QUEUE<Element> queue;
next_priority = 0;
void push(Key x) // value of the pushed element
q.push(Element(next_priority++, x))
Key pop()
// as popping some element the next push must take its place
next_priority--
return queue.pop().element
.
優先順位(ヒープ)を使用してキューを実装するが、優先順位は次々に減少します。
所属していません cs.stackexchange