Who's Studio.

hihoCoder#1105 - 题外话·堆

Word count: 388Reading time: 2 min
2016/05/17

题目

在许多算法中需要支持下面两种运算的数据结构:插入元素和寻找最大值(最小值)元素。支持这两种运算的数据结构称为优先队列。优先队列的有效实现是采用一种称为堆的简单数据结构。
具体描述请见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;
}
CATALOG
  1. 1. 题目
  2. 2. 解题思路
  3. 3. 时间复杂度
  4. 4. 代码