You are on page 1of 10

Priority queue

Cho n ván gỗ có chiều dài lần lượt là đơn vị độ dài . Ta có thể


ghép hai ván gỗ có chiều dài và thành một ván gỗ mới có chiều dài là và
tốn chi phí là . Hỏi chi phí nhỏ nhất để ghép n ván gỗ đã cho thành một ván gỗ
duy nhất là bao nhiêu?

Ví dụ:

Input Output

6 60

128276

Giải thích ví dụ:

 Đầu tiên ta ghép hai ván gỗ thứ nhất và thứ hai. Khi này, các ván gỗ còn lại có
chiều dài là 3 8 2 7 6, chi phí hiện tại là 3
 Trong các ván gỗ sau khi ghép, ta ghép ván gỗ thứ nhất và thứ ba. Khi này, các
ván gỗ còn lại có chiều dài là 5, 8, 7, 6, chi phí hiện tại là 8
 Trong các ván gỗ sau khi ghép, ta ghép ván gỗ thứ nhất và thứ tư. Khi này, các
ván gỗ còn lại có chiều dài là 11, 8, 7, chi phí hiện tại là 19
 Trong các ván gỗ sau khi ghép, ta ghép ván gỗ thứ hai và thứ ba. Khi này, các ván
gỗ còn lại có chiều dài là 11, 15, chi phí hiện tại là 34
 Ta ghép hai ván gỗ còn lại. Khi này, chỉ còn một ván gỗ cuối cùng có chiều dài
26. Chi phí cuối cùng là 60

I Khái Niệm

-Hàng đợi ưu tiên là loại hàng đợi sắp xếp các phần tử dựa trên giá trị ưu tiên của
chúng. Các phần tử có giá trị ưu tiên cao hơn thường được truy xuất trước các phần tử
có giá trị ưu tiên thấp hơn.
-Trong hàng đợi ưu tiên, mỗi phần tử có một giá trị ưu tiên gắn liền với nó. Khi bạn
thêm một phần tử vào hàng đợi, nó sẽ được chèn vào vị trí dựa trên giá trị ưu tiên của
nó.
-Có mộ t số cách để triể n khai hàng đợ i ưu tiên, bao gồ m sử dụ ng
* mả ng,
*danh sách liên kế t,
* vùng heap
* cây tìm kiế m nhị phân.

Thuộc tính của hàng đợi ưu tiên


Vì vậy, Hàng đợi ưu tiên là phần mở rộng của hàng đợi với các thuộc tính sau.
 Mỗ i mụ c có mộ t mứ c độ ưu tiên liên quan đế n nó.
 Phầ n tử có mứ c độ ưu tiên cao sẽ đượ c xế p hàng trướ c phầ n tử có mứ c độ
ưu tiên thấ p.
 Nế u hai phầ n tử có cùng mứ c độ ưu tiên thì chúng sẽ đượ c phân phát theo
thứ tự trong hàng đợ i.
Trong hàng đợ i ưu tiên bên dướ i, phầ n tử có giá trị ASCII tố i đa sẽ có mứ c độ ưu tiên
cao nhấ t. Các phầ n tử có mứ c độ ưu tiên cao hơn sẽ đượ c phụ c vụ trướ c.

Hoạt động của hàng đợi ưu tiên:


Hàng đợ i ưu tiên điể n hình hỗ trợ các hoạ t độ ng sau:
1) Chèn vào hàng ưu tiên
Khi mộ t phầ n tử mớ i đượ c chèn vào hàng ưu tiên, nó sẽ di chuyể n đế n vị trí trố ng từ
trên xuố ng dướ i và từ trái sang phả i. Tuy nhiên, nế u phầ n tử không ở đúng vị trí thì nó
sẽ đượ c so sánh vớ i nút cha. Nế u phầ n tử không theo đúng thứ tự , các phầ n tử sẽ bị
hoán đổ i. Quá trình hoán đổ i tiế p tụ c cho đế n khi tấ t cả các phầ n tử đượ c đặ t vào
đúng vị trí.
2) Xóa trong hàng ưu tiên
Như bạ n biế t rằ ng trong vùng heap tố i đa, phầ n tử tố i đa là nút gố c. Và nó sẽ loạ i bỏ
phầ n tử có mứ c độ ưu tiên cao nhấ t trướ c tiên. Vì vậ y, bạ n loạ i bỏ nút gố c khỏ i hàng
đợ i. Việ c xóa này sẽ tạ o ra mộ t khe trố ng, khe này sẽ đượ c lấ p đầ y thêm bằ ng phầ n
chèn mớ i. Sau đó, nó so sánh phầ n tử mớ i đượ c chèn vớ i tấ t cả các phầ n tử bên trong
hàng đợ i để duy trì tính bấ t biế n củ a heap.
3) Nhìn vào hàng ưu tiên
Thao tác này giúp trả về phầ n tử tố i đa từ Max Heap hoặ c phầ n tử tố i thiể u từ Min
Heap mà không xóa nút khỏ i hàng đợ i ưu tiên.

Các loại hàng đợi ưu tiên:


1) Hàng đợi ưu tiên thứ tự tăng dần
Như tên cho thấ y, trong hàng đợ i ưu tiên theo thứ tự tă ng dầ n, phầ n tử có giá trị ưu
tiên thấ p hơn sẽ đượ c ưu tiên cao hơn trong danh sách ưu tiên. Ví dụ : nế u chúng ta có
các phầ n tử sau trong hàng ưu tiên đượ c sắ p xế p theo thứ tự tă ng dầ n như
4,6,8,9,10. Ở đây, 4 là số nhỏ nhấ t nên nó sẽ có mứ c ưu tiên cao nhấ t trong hàng đợ i
ưu tiên và vì vậ y khi chúng ta dequeue khỏ i loạ i hàng đợ i ưu tiên này, 4 sẽ bị xóa khỏ i
hàng đợ i và dequeue trả về 4.
2) Hàng đợi ưu tiên theo thứ tự giảm dần
Nút gố c là phầ n tử tố i đa trong vùng heap tố i đa, như bạ n có thể biế t. Nó cũ ng sẽ loạ i
bỏ phầ n tử có mứ c độ ưu tiên cao nhấ t trướ c tiên. Kế t quả là nút gố c sẽ bị xóa khỏ i
hàng đợ i. Việ c xóa này để lạ i mộ t khoả ng trố ng, khoả ng trố ng này sẽ đượ c lấ p đầ y
bằ ng nhữ ng phầ n chèn mớ i trong tương lai. Bấ t biế n heap sau đó đượ c duy trì bằ ng
cách so sánh phầ n tử mớ i đượ c chèn vớ i tấ t cả các mụ c khác trong hàng đợ i.
Các loại hàng đợi ưu tiên

Sự khác biệt giữa Hàng đợi ưu tiên và Hàng đợi thông


thường?
Không có mứ c độ ưu tiên nào gắ n liề n vớ i các phầ n tử trong hàng đợ i, quy tắ c nhậ p
trướ c xuấ t trướ c (FIFO) đượ c triể n khai trong khi đó, trong hàng đợ i ưu tiên, các phầ n
tử có mứ c độ ưu tiên. Các phầ n tử có mứ c độ ưu tiên cao hơn sẽ đượ c phụ c vụ trướ c.
Triển Khai hang đợi ưu tiên ?

/ Chương trình C++ để thực hiện Hàng đợi Ưu tiên

// sử dụng Mảng

#include <bits/stdc++.h>

using namespace std;

// Cấu trúc cho các phần tử trong

// hàng đợi ưu tiên

struct item {

int value;

int priority;

};

// Lưu trữ phần tử của hàng đợi ưu tiên


item pr[100000];

// Con trỏ đến chỉ số cuối cùng

int size = -1;

// Hàm để chèn một phần tử mới

// vào hàng đợi ưu tiên

void enqueue(int value, int priority)

// Tăng kích thước

size++;

// Chèn phần tử

pr[size].value = value;

pr[size].priority = priority;

// Hàm để kiểm tra phần tử đầu tiên

int peek()

int highestPriority = INT_MIN;


int ind = -1;

// Kiểm tra phần tử có

// ưu tiên cao nhất

for (int i = 0; i <= size; i++) {

// Nếu ưu tiên giống nhau, chọn

// phần tử có

// giá trị cao nhất

if (highestPriority == pr[i].priority && ind > -1

&& pr[ind].value < pr[i].value) {

highestPriority = pr[i].priority;

ind = i;

else if (highestPriority < pr[i].priority) {

highestPriority = pr[i].priority;

ind = i;

// Trả về vị trí của phần tử


return ind;

// Hàm để loại bỏ phần tử có

// ưu tiên cao nhất

void dequeue()

// Tìm vị trí của phần tử

// có ưu tiên cao nhất

int ind = peek();

// Dịch chuyển phần tử một chỉ số trước

// từ vị trí của phần tử

// có ưu tiên cao nhất được tìm thấy

for (int i = ind; i < size; i++) {

pr[i] = pr[i + 1];

// Giảm kích thước của

// hàng đợi ưu tiên đi một

size--;
}

// Mã nguồn chính

int main()

// Gọi hàm để chèn các phần tử

// theo ưu tiên

enqueue(10, 2);

enqueue(14, 4);

enqueue(16, 4);

enqueue(12, 3);

// Lưu trữ phần tử đầu tiên

// tại thời điểm hiện tại

int ind = peek();

cout << pr[ind].value << endl;

// Loại bỏ phần tử đầu tiên

dequeue();
// Kiểm tra phần tử đầu tiên

ind = peek();

cout << pr[ind].value << endl;

// Loại bỏ phần tử đầu tiên

dequeue();

// Kiểm tra phần tử đầu tiên

ind = peek();

cout << pr[ind].value << endl;

return 0;

Ứng dụng của hàng đợi ưu tiên:


 Lậ p lịch CPU
 Các thuậ t toán đồ thị như thuậ t toán đườ ng đi ngắ n nhấ t củ a Dijkstra , Cây
kéo dài tố i thiể u củ a Prim , v.v.
 Triể n khai ngă n xế p
 Tấ t cả các ứ ng dụ ng xế p hàng có liên quan đế n mứ c độ ưu tiên.
 Nén dữ liệ u bằ ng mã Huffman
 Mô phỏ ng theo sự kiệ n, chẳ ng hạ n như khách hàng đang xế p hàng chờ .
 Tìm phầ n tử lớ n nhấ t/nhỏ thứ K.
Ưu điểm của hàng đợi ưu tiên:
 Nó giúp truy cậ p các phầ n tử mộ t cách nhanh hơn. Điề u này là do các phầ n
tử trong hàng đợ i ưu tiên đượ c sắ p xế p theo mứ c độ ưu tiên, ngườ i ta có
thể dễ dàng truy xuấ t phầ n tử có mứ c độ ưu tiên cao nhấ t mà không cầ n phả i
tìm kiế m trong toàn bộ hàng đợ i.
 Việ c sắ p xế p các phầ n tử trong Hàng đợ i ưu tiên đượ c thự c hiệ n mộ t cách
linh hoạ t. Các phầ n tử trong hàng đợ i ưu tiên có thể đượ c cậ p nhậ t các giá
trị ưu tiên, điề u này cho phép hàng đợ i tự độ ng sắ p xế p lạ i khi mứ c độ ưu
tiên thay đổ i.
 Các thuậ t toán hiệ u quả có thể đượ c thự c hiệ n. Hàng đợ i ưu tiên đượ c sử
dụ ng trong nhiề u thuậ t toán để cả i thiệ n hiệ u quả củ a chúng, chẳ ng hạ n như
thuậ t toán Dijkstra để tìm đườ ng đi ngắ n nhấ t trong biể u đồ và thuậ t toán
tìm kiế m A* để tìm đườ ng.
 Bao gồ m trong các hệ thố ng thờ i gian thự c. Điề u này là do hàng đợ i ưu tiên
cho phép bạ n nhanh chóng truy xuấ t phầ n tử có mứ c ưu tiên cao nhấ t, chúng
thườ ng đượ c sử dụ ng trong các hệ thố ng thờ i gian thự c trong đó thờ i gian là
điề u cố t yế u.
Nhược điểm của hàng đợi ưu tiên:
 Độ phứ c tạ p cao. Hàng đợ i ưu tiên phứ c tạ p hơn các cấ u trúc dữ liệ u đơn
giả n như mả ng và danh sách liên kế t, đồ ng thờ i có thể khó triể n khai và bả o
trì hơn.
 Tiêu thụ bộ nhớ cao. Việ c lưu trữ giá trị ưu tiên cho từ ng phầ n tử trong
hàng ưu tiên có thể chiế m thêm bộ nhớ , điề u này có thể là mố i lo ngạ i trong
các hệ thố ng có tài nguyên hạ n chế .
 Nó không phả i lúc nào cũ ng là cấ u trúc dữ liệ u hiệ u quả nhấ t. Trong mộ t số
trườ ng hợ p, các cấ u trúc dữ liệ u khác như đố ng hoặ c cây tìm kiế m nhị phân
có thể hiệ u quả hơn đố i vớ i mộ t số thao tác nhấ t định, chẳ ng hạ n như tìm
phầ n tử tố i thiể u hoặ c tố i đa trong hàng đợ i.
 Đôi khi điề u đó khó dự đoán hơn:. Điề u này là do thứ tự củ a các phầ n tử
trong hàng đợ i ưu tiên đượ c xác định bở i các giá trị ưu tiên củ a chúng, thứ
tự các phầ n tử đượ c truy xuấ t có thể khó dự đoán hơn so vớ i các cấ u trúc
dữ liệ u khác như ngă n xế p hoặ c hàng đợ i, tuân theo nguyên tắ c vào trướ c,
xuấ t trướ c ( FIFO) hoặ c thứ tự nhậ p sau, xuấ t trướ c (LIFO).

You might also like