Heap
Heap (đống) là một cấu trúc dữ liệu cây có khóa của mỗi nút lớn hơn khóa của mỗi nút con. Trong heap thì khóa lớn nhất luôn nằm ở nút gốc.
Binary Heap
Binary Heap (đống nhị phân) là một cấu trúc dữ liệu Heap sử dụng cây nhị phân. Ngoài ra tất cả các tầng đều đầy đủ (tức đều có 2 nút con), tầng cuối cùng không đầy đủ thì được lấp đầy từ phải qua trái.
Ví dụ sau là một cây biểu diễn đống nhị phân:
99 ↙ ↘ 50 90 ↙↘ ↙↘ 20 40 70 10
Biểu diễn dữ liệu
Heap có thể biểu diễn dạng liên kết nhưng thường thì cấu trúc Heap được biểu diễn bằng mảng tương tự như cây nhị phân.
Cây nhị phân biểu diễn bằng mảng thì vị trí i
có hai con là 2*i + 1
và 2*i + 2
. Và vị trí i
có cha là (i-1) / 2
(trừ khóa gốc không có cha). Vị trí i
tính từ 0
.
Chèn một khóa
Thuật toán chèn một khóa như sau:
- Chèn khóa mới vào tầng cuối cùng của đống
- So sánh khóa mới với khóa của nút cha, nếu nó nhỏ hơn cha, kết thúc.
- Nếu không, đổi chỗ khóa mới và khóa của nút cha, và trở lại bước trước.
|
|
Vun đống
Vun đống là liên tục chèn giá trị vào mảng.
Ví dụ sau chèn các số 8, 2, 4, 0, 9, 1, 2, 3, 5, 4 vào đống, sẽ ra đống như sau:
9 ↙ ↘ 8 4 ↙ ↘ ↙↘ 5 4 1 2 ↙↘ ↙ 0 3 2
Biểu diễn qua mảng là 9 8 4 5 4 1 2 0 3 2
.
|
|
Xóa khóa lớn nhất
Thuật toán xóa khóa lớn nhất như sau:
- Đổi chỗ khóa cần xóa và khóa cuối cùng ở tầng cuối cùng rồi xóa khóa cần xóa khỏi đống. Khởi tạo nút hiện tại là nút gốc.
- So sánh khóa của nút hiện tại và khóa ở các nút con, nếu nó lớn hơn, kết thúc.
- Nếu không, đổi chỗ khóa hiện tại và khóa lớn hơn trong các khóa của nút con. Chuyển vị trí nút hiện tại tới nút con vừa được hoán đổi và trở về bước trước.
|
|
Sau khi xóa nút gốc thì kết quả sẽ là 8 5 4 3 4 1 2 0 2
hay biểu diễn kiểu liên kết:
8 ↙ ↘ 5 4 ↙ ↘ ↙↘ 3 4 1 2 ↙↘ 0 2