You are on page 1of 32

Cấu trúc dữ liệu Heap

Trương Phước Hải


Nội dung

• Bài toán mở đầu


• Khái niệm Heap
• Các thao tác trên Heap
• Heap và priority_queue
• Kết luận

2
Bài toán mở đầu

• Cho 3 loại thao tác sau:


Thao tác 1: Thêm mới 1 phần tử vào dãy
Thao tác 2: Cho biết giá trị phần tử lớn nhất dãy
Thao tác 3: Loại phần tử có giá trị lớn nhất ra khỏi dãy

• Ban đầu dãy rỗng. Thực hiện thao tác trên và thông báo
kết quả của từng thao tác loại 2 .

3
Bài toán mở đầu

• Thao tác 1: thêm mới phần tử vào dãy


𝑛
𝑥
0 1 2 3 4 …

a[n++] = x;
Độ phức tạp

4
Bài toán mở đầu

• Thao tác 2: Tìm giá trị lớn nhất dãy


maxVal = a[0];
for (i = 0; i < n; ++i)
maxVal = max(maxVal, a[i]);
Độ phức tạp

5
Bài toán mở đầu

• Thao tác 3: Loại phần tử có giá trị lớn nhất dãy


Bước 1: tìm vị trí phần tử lớn nhất
p = 0;
for (i = 0; i < n; ++i)
if (a[i] > a[p]) p = i;

Độ phức tạp

6
Bài toán mở đầu

• Thao tác 3: Loại phần tử có giá trị lớn nhất dãy


Bước 2: dồn phần tử để hủy phần tử lớn nhất ra khỏi dãy
--n;
for (i = p+1; i < n; ++i)
a[i] = a[i+1];

Độ phức tạp

7
Bài toán mở đầu

• Đánh giá
Độ phức tạp mỗi thao tác với là số phần tử hiện tại của dãy
Độ phức tạp cho thao tác cỡ

8
Nội dung

• Bài toán mở đầu


• Khái niệm Heap
• Các thao tác trên Heap
• Heap và priority_queue
• Kết luận

9
Khái niệm Heap

• Dãy số nguyên tạo thành một heap nếu thỏa


 và được gọi là các cặp phần tử liên đới
Các phần tử và cũng được xem là con của

10
Khái niệm Heap

• Heap là CTDL dạng cây (tree-based) và được tổ chức


dưới dạng cây nhị phân đầy đủ (binary heap)
• Tất cả node trên heap, trừ những node ở mức thấp nhất,
đều có đủ 2 con

11
Khái niệm Heap

• Dãy số có thể tổ chức thành cây nhị phân đầy đủ dưới


dạng sau

𝑎𝑖

𝑎2∗𝑖+1 𝑎2∗𝑖+2

19 7 10 4 2 1 6 3
0 1 2 3 4 5 6 7

12
Khái niệm Heap

• Dãy được gọi là heap (heap max hoặc heap min) nếu
thỏa
: heap max
: heap min

13
Khái niệm Heap

• Một số tính chất của heap


Nếu là heap min thì có giá trị nhỏ nhất dãy

3
4 6

8 5 11 9

10
14
Khái niệm Heap

• Một số tính chất của heap


Nếu là heap max thì có giá trị lớn nhất dãy

19
7 10

4 2 1 6

3
15
Khái niệm Heap

• Một số tính chất của heap


Dãy vẫn duy trì là một heap khi loại bỏ các phần tử cuối

19
7 10

4 2 1 6

3
16
Nội dung

• Bài toán mở đầu


• Khái niệm Heap
• Các thao tác trên Heap
• Heap và priority_queue
• Kết luận

17
Các thao tác trên heap

• Tạo heap: hiệu chỉnh dãy đang có thành một heap


Hiệu chỉnh bắt đầu từ vị trí của phần tử có ít nhất 1 con

6
0
4 10
1 2
9 18 2 11
3 4 5 6
7
7
18
Các thao tác trên heap

• Đánh giá thao tác hiệu chỉnh dãy thành heap


Tại mỗi bước hiệu chỉnh, nếu vi phạm tính chất heap thì
được chuyển đến 1 trong 2 vị trí hoặc
Thao tác trên có thể lan truyền đến lá (phần tử không có con
hay phần tử liên đới)

19
Các thao tác trên heap

• Đánh giá thao tác hiệu chỉnh dãy thành heap


Độ phức tạp của thao tác hiệu chỉnh 1 phần tử phụ thuộc
chiều cao của heap: với số phần tử của dãy
Độ phức tạp của hiệu chỉnh cả dãy

20
Các thao tác trên heap

• Thêm 1 phần tử vào heap

18
0
9 11
1 2
7 4 2 10
3 4 5 6
6 25
7 8

21
Các thao tác trên heap

• Đánh giá thao tác thêm 1 phần tử vào heap


Phần tử mới được thêm vào cuối heap. Hiệu chỉnh từ vị trí
phần tử cha của phần tử thêm vào (nếu vi phạm tính chất heap)
Thao tác có thể lan truyền ngược lên tận gốc: up heap
Độ phức tạp của thao tác

22
Các thao tác trên heap

• Hủy phần tử đầu heap ra khỏi heap

25
0
18 11
1 2
9 4 2 10
3 4 5 6
6 7
7 8

23
Các thao tác trên heap

• Đánh giá thao tác hủy phần tử đầu heap


Nhận xét: hủy phần tử cuối heap (không có con, không có
cặp liên đới) được thực hiện đơn giản hơn
Đổi chỗ phần tử đầu heap và cuối heap cho nhau, sau đó hủy
phần tử cuối ra khỏi heap

24
Các thao tác trên heap

• Đánh giá thao tác hủy phần tử đầu heap


Chỉ hiệu chỉnh tại vị trí vi phạm tính chất heap
Thao tác có thể lan truyền xuống tận lá (down heap)
Độ phức tạp của thao tác

• Có thể hủy phần tử bất kỳ ra khỏi heap?

25
Các thao tác trên heap

• Tìm phần tử nhỏ nhất/lớn nhất heap


Heap max: phần tử đầu heap có giá trị lớn nhất
Heap min: phần tử đầu heap có giá trị nhỏ nhất
Độ phức tạp của thao tác

26
Nội dung

• Bài toán mở đầu


• Khái niệm Heap
• Các thao tác trên Heap
• Heap và priority_queue
• Kết luận

27
Heap và priority_queue

• Thư viện <queue> của STL (Standard Template Library)


hỗ trợ CTDL priority_queue (pq) có cơ chế tương tự heap
• priority_queue gồm 3 thành phần
Kiểu của các phần tử
Container lưu trữ danh sách phần tử
Thao tác so sánh thứ tự giữa 2 phần tử

28
Heap và priority_queue

• Khai báo priority_queue


Ví dụ: khai báo 1 priority_queue chứa các số nguyên
priority_queue<
int, //cấu trúc 1 phần tử
vector<int>, //chứa danh sách phần tử
less<int> > pq; //thao tác so sánh

29
Heap và priority_queue

• priority_queue (pq) hỗ trợ các thao tác cơ bản sau


empty(): kiểm tra pq rỗng
size(): cho biết số phần tử của pq
top(): cho biết giá trị phần tử đầu pq
pop(): hủy phần tử đầu ra khỏi pq
push(x): thêm phần tử x vào pq

30
Nội dung

• Bài toán mở đầu


• Khái niệm Heap
• Các thao tác trên Heap
• Heap và priority_queue
• Kết luận

31
Kết luận

• Heap được ứng dụng xử lý hiệu quả các truy vấn tìm
phần tử nhỏ nhất/lớn nhất trên dãy biến động
Thêm phần tử vào heap:
Hủy phần tử đầu ra khỏi heap:
Lấy giá trị phần tử đầu heap:

32

You might also like