3. KháiniệmQueue
Hàng đợi (Queue) là một cấu trúc dữ liệu dùng
để chứa các đối tượng làmviệc theo cơ chế FIFO
(First In First Out)
Việc thêm một đối tượng luôn diễn ra ở cuối
hàng đợi và một phần tử luôn được lấy ra từ đầu
hàng đợi.
4. `QueueVídụ:
Hàng đợi (Queue) là một cấu trúc dữ liệu dùng
để chứa các đối tượng làmviệc theo cơ chế FIFO
(First In First Out)
Việc thêm một đối tượng luôn diễn ra ở cuối
hàng đợi và một phần tử luôn được lấy ra từ đầu
hàng đợi.
7. XâydựngQueue
Nếuxây dựng Queuebằngmảng thì sẽ nhận thấy rằng:
- Khi xoá một phần tử front tăng lên 1, khi thêm một
phần tử rear tăng lên 1,đến một lúc nào đó ta không
thể thêm vào hàng được nữa (rear=maxlength-1) dù
mảng còn nhiều chỗ trống (các vị trí trước front)
→Trường hợp này ta gọi là hàng bị tràn
Để khắc phục điều này chúng ta có thể coi mảng
đó như 1 mảng với các phân tử được xếp vòng tròn
để việc push và pop dễ dànghơn.
Queue Circular(Hàng đợi vòng)
8. KháiniệmPriorityQueue
Hàng đợi ưutiên (Priority Queue)là một kiểu dữ liệu trừu tượng tập hợp
đặc biệt, trong đó mỗi phần tử cómột độưu tiên nàođó.
Hàng đợi ưutiên là cấutrúc dữ liệu tổng hợpcủa stack và queue.
Hàng đợi ưutiên không theo cơ chế FIFO.
Độ ưu tiên của phần tử thường là một số, theo đó, phần tử cóđộưu tiên
nhỏ nhất sẽ được ‘ưu tiên’ nhất.
Ví dụ tại bệnh viện, cácbệnh nhân xếphàng để chờ phục vụnhưng không
phải người đếntrước thì được phục vụ trước mà họ cóđộ ưu tiên theo tình
trạng khẩn cấpcủa bệnh.
9. PriorityQueue
Mỗi nút gồm:
+Value (Giá trị)
+ Priority (Độ ưu tiên)
Chẳng hạn:
Ta thấy rằng:nút cóđộ ưutiên cao nhất sẽ đượclấy ra trước trong queue
12. CàiđặtPriorityQueue
Ta không thể cài đặt Priority Queue bằng bảng băm vì bảng băm không
thuận lợi trong việc tìm kiếm phần tử nhỏ nhất
→Nên cách cài đặt Priority Queue khá thuận lợi đó là cài đặt bằng cây có
thứ tự từng phần (TreeHeap).
13. Câycàiđặtbằngmảng
Nút mẹ thứ i gồm:
Nút conbên trái: = 2*i+ 1
Nút conbên phải: =2*i + 2
Nút mẹ cuối cùngtrong cây: (n-1)/2 vớin là sốlượng phần tử
Giả sử ta cónút thứ i trong mảng:
-> Nút mẹ của nút này là (i-1)/2
Các nút mẹ trong cây: từ i=0-> (n-1)/2
15. TreeHeap
Địnhnghĩa cây cóthứ tự từng phần ( Treeheap)
Cây cóthứ tự từng phần là cây nhị phân mà giá trị tại mỗi nút mẹ có1 quan
hệ thứ tự nào đó với2 nút con của nó.
Có 2loại cây heap thường dùng: Max-Heap , Min-Heap
Max-Heap:cây nhị phân mà giá trị tại mỗi nút mẹ đều lớn hơn
hoặc bằng giá trị của hai con.
Min-Heap: cây nhị phân mà giá trị tại mỗi nút mẹ đều nhỏ hơn
hoặc bằng giá trị của hai con.
17. Nhậnxét
Trêncây cóthứ tự từng phần, nút gốc là nút cógiá trị nhỏ nhất
Từ nhận xét này, ta thấy cóthể sử dụng cây cóthứ tự từng phần để cài
đặt hàng đợiưu tiên
Trongđómỗi phần tử được biểu diễn bởi một nút trên câymà độ ưu
tiên của phần tử là giá trị của nút
18. CácthaotáctrênTreeHeap
Vì TreeHeap dùng để biểu diễn Priority Queue nên sẽ cócácthao tác tương tự
Queue:
-Tìm phần tử lớnnhất/nhỏ nhất (Find Min/Max)
- Xóa phần tử đầu tiên của cây (RemoveMiin)
- Thêm phầntử vào cuốicây (Insert)
20. Remove
Chiếnlược: Xét cây Min-Heap
Lấynútlá tạimứccaonhấtvà nằmbênphảinhấtthaythếchonútgốc.
Như vậy cây vẫn "cân bằng" nhưng nó không còn đảm bảo tính thứ tự
từng phần.
Để xây dựng lại cây từng phần ta thực hiện việc "đẩy nút này xuống dưới".
Tức là ta đổi chổ nó với nút con nhỏ nhất của nó, nếu nút con này có độ
ưu tiên nhỏ hơn nó.
Đâylà 1 quátrìnhđệquy.Quá trình đó sẽ dừng khi đã nổi lên đến nút gốc hoặc
cây thỏa mãn tính chất có thứ tự từng phần.
21. RemoveMin
Giải thuật: Xétcây Min-Heap
Bước 1:Tathaythếnútgốcbằngnútlá cuối cùng trongcây
Bước 2: Taxéttừnútgốc:
Nếugiátrịnúttráinhỏhơn nútphảivà nhỏhơn cảnútgốcthì tađổichỗnút
tráivới nútgốc.
Nếugiá trịnútphảinhỏhơn núttráivà nhỏhơn cảnútgốcthì tađổichỗnút
phảivới nútgốc.
Bước 3:
Sau khi đẩy nút gốc xuống một con nào đó (trái hoặc phải) thì
phải tiếp tục xét con đó xem có phải đẩy xuống nữa hay không ?
Quá trình đẩyxuốngsẽ kết thúckhiđã đẩyđến nútlà hoặc cây thỏamãn tính chấtcó thứ
tự từng phần
23. Insert
Chiến lược:
Để thêm một phần tử vào cây ta bắt đầu bằng việc tạo một nút lá mới nằm
ở mức cao nhất.
Nếu tất cả các lá ở mức cao nhất đều đang có mặt thì ta thêm nút mới vào
bên trái nhất ở mức mới.
->Khinàycâybịmấtđi tínhchấtthứtựtoànphần
Tiếp đó ta cho nút này "nổi dần lên" bằng cách đổi chổ nó với nút mẹ của
nó nếu nút mẹ có độ ưu tiên nhỏ hơn.
Đâycũng là 1 quátrìnhđệquy.Quá trình đó sẽ dừng khi đã nổi lên đến nút gốc
hoặc cây thỏa mãn tính chất có thứ tự từng phần.
26. Xây dựng Tree Heap
Để việc xây dựng được hiệu quả, ta phải cố
gắng sao cho cây tương đối ‘cân bằng’.
Mọi nút trung gian (trừ nút là cha của nút lá) đều
có hai con
Đối với các nút mẹ của nút là có thể chỉ có một
con và trong trường hợp đó ta quy ước là con trái
(không có con phải).
27. XâydựngTreeHeap
Có 2 cách xâydựng Tree Heap:
Rebuild (Xây dựng từ một câykháckhông có thứ tự).
Build (Xây dựng trực tiếp từ mảng giá trị cho trước) .
29. HeapSort
Chiến lược: Dựa vào tính chất Tree Heap để sắp xếp lại mảng.
Nhận xét ta thấy rằng:
+ Nút gốc của min-Heap sẽ nhỏ nhất trong cây.
+ Nếu ta lấy nút gốc ra và đưa vào 1 mảng mới ta sẽ được phần
tử nhỏ nhất
Vậy ta lại lấy phần tử nhỏ tiếp theo khi đã loại bỏ phần tử nhỏ
nhất khỏi cây đưa vào mảng mới ta sẽ được mảng đc sắp xếp
tăng dần
30. HeapSort
Thuật toán:
+Bước 1: Ta xây dựng Tree Heap từ mảng ban đầu.(Rebuild hoặc Build)
+Bước 2: Ta lấy phần tử nút gốc ra khỏi cây (Phần tử a[0])
+Để lấy phần tử nút gốc ra khỏi cây ta chỉ cần đổi chỗ nút gốc vs nút là cuối
cùng ( Đổi chỗ a[0] với a[n-1])
+Bước 3:
Ta xây dựng lại cây với n-1 phần tử.
Ta áp dụng thuật toán RemoveMin để cân bằng lại cây
Lặp lại bước 2 khi vẫn còn phần tử trong mảng.
Sau khi kết thúc:Ta thấy rằng mảng sẽ được sắp xếp giảm dần.
31. ỨngdụngPriorityQueue
Ứng dụng
– Quản lý băng thông
- Thuật toán Huffman
- Thuật toán Dijkstra là một thuật toán giải quyết bài toán đường đi ngắn nhất dùng
trong công nghệ Hệ thống định vị toàn cầu (GPS)
- Dùng các bài toán có nhiều lựa chọn để xét độ ưu tiên để đạt hiểu quá tối ưu nhất.