题目
在许多算法中需要支持下面两种运算的数据结构:插入元素和寻找最大值(最小值)元素。支持这两种运算的数据结构称为优先队列。优先队列的有效实现是采用一种称为堆的简单数据结构。
具体描述请见hihoCoder。
解题思路
经典数据结构堆的实现。为方便处理,存储元素的数组下标从1开始。
时间复杂度
插入、删除操作均为logN。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| #include <iostream> #include <vector> using namespace std;
class Heap { private: vector<int> data; int N;
void swap(int i, int j) { int tmp = data[i]; data[i] = data[j]; data[j] = tmp; }
void siftUp(int i) { while (i >> 1 > 0) { if (data[i >> 1] < data[i]) swap(i >> 1, i); else break; i >>= 1; } }
void siftDown(int i) { while (i << 1 <= N) { if ((i << 1) + 1 <= N && data[(i << 1) + 1] > data[i << 1]) i = (i << 1) + 1; else i = i << 1; if (data[i] > data[i >> 1]) swap(i, i >> 1); else break; } }
public: Heap() { data.push_back(0); N = 0; }
void insert(int d) { N++; if (data.size() < N + 1) data.push_back(d); else data[N] = d; siftUp(N); }
int deleteMax() { swap(1, N); int maxD = data[N]; N--; siftDown(1); return maxD; } };
int main() { int N = 0; cin >> N; Heap heap; for (int i = 0; i < N; i++) { char c; int d; cin >> c; if (c == 'A') { cin >> d; heap.insert(d); } else if (c == 'T') cout << heap.deleteMax() << endl; }
return 0; }
|