c++実装優先キュー
2056 ワード
ゆうせんキュー
優先キューは、コンピュータ科学における抽象データ型です.優先キューの各要素にはそれぞれ優先度があり、優先度が最も高い要素が最初にサービスを受けます.優先度が同じ要素は、優先キュー内の順序でサービスされます.優先キューは往々にしてスタックで実現される.
典型的な実装は,性能の観点から優先キューがスタックで実現され,O(log n)の時間的複雑度を有する挿入要素性能,O(n)の初期化構造の時間的複雑度を有する.自己平衡二叉を用いてツリーを検索すると,挿入と削除の時間的複雑度はO(log n),二叉ツリーを構築する時間的複雑度はO(n log n)である.計算の複雑さの観点から,優先キューはソートアルゴリズムに等価である.
コード例(詳細はコードコメントを参照)
参照先:https://zh.wikipedia.org/wiki/%E5%84%AA%E5%85%88%E4%BD%87%E5%88%97アルゴリズム第4版p 202
優先キューは、コンピュータ科学における抽象データ型です.優先キューの各要素にはそれぞれ優先度があり、優先度が最も高い要素が最初にサービスを受けます.優先度が同じ要素は、優先キュー内の順序でサービスされます.優先キューは往々にしてスタックで実現される.
典型的な実装は,性能の観点から優先キューがスタックで実現され,O(log n)の時間的複雑度を有する挿入要素性能,O(n)の初期化構造の時間的複雑度を有する.自己平衡二叉を用いてツリーを検索すると,挿入と削除の時間的複雑度はO(log n),二叉ツリーを構築する時間的複雑度はO(n log n)である.計算の複雑さの観点から,優先キューはソートアルゴリズムに等価である.
コード例(詳細はコードコメントを参照)
#include
using namespace std;
class PriorityQueue
{
private:
int* pArray;
int m_length;
public:
PriorityQueue(int N) {
// 1
pArray = new int[N + 1];
m_length = 0;
}
int delMax() {
//
int max = pArray[1];
// , ,
swap(pArray[1], pArray[m_length--]);
//
pArray[m_length + 1] = NULL;
//
sink(1);
//
return max;
}
void insert(int v) {
// v pArray[1] , ++
pArray[++m_length] = v;
//
swim(m_length);
}
//
bool isEmpty() {
return m_length == 0;
}
int size() {
return m_length;
}
//
void swim(int k) {
//
while (k > 1 && pArray[k] > pArray[k / 2]) {
//
swap(pArray[k / 2], pArray[k]);
// k
k /= 2;
}
}
//
void sink(int k) {
while (2 * k <= m_length)
{
// k 2*k j
int j = 2 * k;
// ,
if (j < m_length && (pArray[j] < pArray[j + 1])) j++;
// ,
if (pArray[k] > pArray[j]) break;
//
swap(pArray[k], pArray[j]);
// k
k = j;
}
}
};
int main() {
PriorityQueue pq(5);
pq.insert(2);
pq.insert(11);
pq.insert(6);
pq.insert(1);
pq.insert(15);
cout << pq.delMax() << endl;
cout << pq.delMax() << endl;
cout << pq.delMax() << endl;
cout << pq.delMax() << endl;
cout << pq.delMax() << endl;
return 0;
}
参照先:https://zh.wikipedia.org/wiki/%E5%84%AA%E5%85%88%E4%BD%87%E5%88%97アルゴリズム第4版p 202