Hàng đợi ưu tiên là một cấu trúc dữ liệu tương tự như hàng đợi, nhưng trong đó mỗi phần tử có một mức độ ưu tiên liên quan. Hàng đợi là cấu trúc dữ liệu vào trước, ra trước [FIFO], trong khi ở hàng đợi ưu tiên, phần tử có mức độ ưu tiên cao nhất được phục vụ trước các phần tử có mức độ ưu tiên thấp hơn
Hàng đợi ưu tiên trong Python? . sử dụng Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
1
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
Python đi kèm với một lớp
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
2 tích hợp, có trong mô-đun Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
3Trong trường hợp đơn giản nhất, một mục trong hàng đợi ưu tiên sẽ là một bộ
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
4. Đây là một ví dụ giả về cách sử dụng nóimport random
from queue import PriorityQueue
def generate_items[]:
items = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
priorities = [2, 1, 3, 3, 0, 1, 1, 2]
return items, priorities
if __name__ == '__main__':
items, priorities = generate_items[]
print['Items/Priorities']
for item, priority in zip[items, priorities]:
print[[item, priority]]
q = PriorityQueue[]
# We add items to priority queue in the order they're listed
# a -> b -> c -> ...
for item, priority in zip[items, priorities]:
q.put[[priority, item]]
# Let's get items from the priority queue one by one
# They will be printed in the order of their priority
print['Getting items from the priority queue']
while not q.empty[]:
next_item = q.get[]
print[next_item]
Và đây là đầu ra
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
Lưu ý rằng theo mặc định, giá trị của số ưu tiên càng thấp thì mức độ ưu tiên của mục nhập càng cao. Đó là
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
5 cao hơn Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
6Về mặt kỹ thuật,
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
2 được triển khai bằng cách sử dụng cấu trúc dữ liệu min-heap. Điều đó có nghĩa là giá trị ưu tiên nhỏ nhất luôn xuất hiện trước. Nếu chúng ta muốn đảo ngược điều này, chúng ta chỉ cần sử dụng giá trị âm của giá trị ưu tiên khi thêm các phần tử vào hàng đợiLà một giải pháp mạnh mẽ hơn, chúng tôi có thể bọc các mục hàng đợi của mình trong một lớp tùy chỉnh với các toán tử so sánh quá tải được triển khai để cung cấp cho chúng tôi thứ tự mong muốn. Chúng tôi sẽ sử dụng hàng đợi ưu tiên theo cách này trong ví dụ tiếp theo của chúng tôi
Giải quyết các ưu tiên bình đẳng và ổn định trật tự
Hãy xem xét một ví dụ liên quan hơn. Chúng tôi sẽ sử dụng nó để phát hiện ra hai vấn đề quan trọng với giải pháp dựa trên bộ của chúng tôi từ phần trước
Giả sử chúng tôi có một trung tâm hỗ trợ khách hàng và chúng tôi muốn triển khai chính sách xếp hàng ưu tiên các yêu cầu từ khách hàng cũ [những người đã đăng ký dịch vụ của chúng tôi trước đó]. Để công bằng hơn, chúng tôi cũng muốn hàng đợi ổn định theo thứ tự chèn - nếu có hai hoặc nhiều khách hàng có cùng mức độ ưu tiên trong hàng đợi, chúng tôi phải phục vụ họ theo thứ tự đến
Để làm cho mọi thứ thực tế hơn, mỗi mục chúng tôi đẩy vào hàng đợi là một thể hiện của lớp
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
8. Nó sẽ chứa một tham chiếu đến khách hàng và một số chi tiết về yêu cầu của họ. Để ưu tiên, chúng tôi sẽ chỉ sử dụng năm đăng kýHãy bắt đầu bằng cách định nghĩa lớp
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
9 và tạo một số thể hiệnItems/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
1Chạy này, chúng tôi nhận được đầu ra sau
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
2Bây giờ, hãy tạo lớp
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
8 chứa một khách hàng và mô tả lý do tại sao họ lại ở trong hàng đợiItems/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
4Đối với khách hàng của chúng tôi, danh sách các nhiệm vụ có thể giống như thế này
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
5Nếu chúng tôi cố gắng thêm các tác vụ này vào hàng đợi ưu tiên, nó sẽ không hoạt động. Chúng tôi nhận được lỗi sau
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
6Tại sao? . e. ưu tiên] các Nhiệm vụ. Các toán tử so sánh không được triển khai cho lớp
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
8Đủ công bằng. Hãy sử dụng thủ thuật cũ của chúng ta - thêm bộ dữ liệu
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
13 vào hàng đợi. Nhưng chúng ta lại nhận được điều tương tựItems/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
6Tại sao điều này không làm việc? . Đằng sau hậu trường,
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
2 sẽ thực hiện so sánh bộ dữ liệu để xác định mục hàng đợi nào là nhỏ nhất, i. e. ở phía trước của hàng đợi. Hãy nhớ rằng các bộ dữ liệu được so sánh theo vị trí, so sánh các phần tử tương ứng. Trong trường hợp của chúng tôi, điều này có nghĩa là nếu mức độ ưu tiên của hai mục bằng nhau [vị trí bộ 0], chúng tôi tiến hành so sánh các mục [vị trí bộ 1]Trong nhiều ứng dụng trong thế giới thực, điều này có thể gây ra hai vấn đề
- Không phải lúc nào cũng có thể so sánh giữa các mục, tôi. e. toán tử so sánh không được xác định cho lớp vật phẩm
- Đối với bất kỳ hai mục nào có cùng mức độ ưu tiên, làm cách nào để trả lại chúng từ hàng đợi theo thứ tự mà chúng được thêm vào hàng đợi?
Đối với vấn đề số 1, chúng tôi có một giải pháp rõ ràng - bọc các mục trong một lớp nơi chúng tôi có thể triển khai các toán tử so sánh. Chúng ta có thể giữ mức độ ưu tiên như một trường trong lớp này và đóng gói mức độ ưu tiên trong các toán tử so sánh. Đối với chúng tôi, đây sẽ là lớp học
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
8 của chúng tôiĐối với vấn đề #2, sắp xếp ổn định, cũng có một giải pháp đơn giản, mặc dù giải pháp ít rõ ràng hơn. thêm một bộ đếm mục để so sánh ưu tiên. Bất cứ khi nào chúng tôi thêm một mục vào hàng đợi, chúng tôi sẽ tăng bộ đếm. Chúng tôi sử dụng bộ đếm để giải quyết các mối quan hệ so sánh giữa các mục ưu tiên bằng nhau
Trực giác ở đây rất đơn giản. Đến hàng đợi sớm hơn và bạn nhận được giá trị bộ đếm mục nhập nhỏ hơn. Nếu ai đó có cùng mức độ ưu tiên đến sau bạn, bạn sẽ đi trước vì giá trị truy cập mục nhập thấp hơn của bạn
Nếu chúng tôi sử dụng các mục nhập bộ dữ liệu, chúng tôi chỉ cần thêm bộ đếm mục nhập ngay sau mức độ ưu tiên trong bộ dữ liệu.
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
17. Bộ đếm mục nhập trong bộ giải quyết vấn đề ổn định sắp xếp của chúng tôi - trong trường hợp có mức độ ưu tiên bằng nhau, chúng tôi so sánh mục nhập thứ hai trong bộ dữ liệu, bộ đếm mục nhập. Nhưng nó cũng giải quyết vấn đề toán tử sắp xếp của chúng ta - vì Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
18 phải là duy nhất cho mỗi mục hàng đợi, chúng ta sẽ không bao giờ cần so sánh trực tiếp các mụcChúng ta sẽ để phần này như một bài tập cho người đọc và tiến hành đóng gói priority và entry_count trong lớp
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
8. Bằng cách này, chúng tôi sẽ chỉ đẩy các phiên bản Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
8 vào hàng đợi thay vì các bộ dữ liệu Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
21Điều đó nói rằng, hãy sửa lớp
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
8 của chúng tôiItems/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
0Hai điều quan trọng đang diễn ra ở đây
- Chúng tôi đã thêm trường
18 và đảm bảo đặt trường này đúng cách trước khi thêm tác vụ vào hàng đợiItems/Priorities ['a', 2] ['b', 1] ['c', 3] ['d', 3] ['e', 0] ['f', 1] ['g', 1] ['h', 2] Getting items from the priority queue [0, 'e'] [1, 'b'] [1, 'f'] [1, 'g'] [2, 'a'] [2, 'h'] [3, 'c'] [3, 'd']
- Chúng tôi đã triển khai các phương pháp so sánh cho lớp
8. Để làm cho các thể hiện của một lớp có thể so sánh được, chúng tôi triển khai các toán tửItems/Priorities ['a', 2] ['b', 1] ['c', 3] ['d', 3] ['e', 0] ['f', 1] ['g', 1] ['h', 2] Getting items from the priority queue [0, 'e'] [1, 'b'] [1, 'f'] [1, 'g'] [2, 'a'] [2, 'h'] [3, 'c'] [3, 'd']
25 vàItems/Priorities ['a', 2] ['b', 1] ['c', 3] ['d', 3] ['e', 0] ['f', 1] ['g', 1] ['h', 2] Getting items from the priority queue [0, 'e'] [1, 'b'] [1, 'f'] [1, 'g'] [2, 'a'] [2, 'h'] [3, 'c'] [3, 'd']
26 [tương ứng là các phương thứcItems/Priorities ['a', 2] ['b', 1] ['c', 3] ['d', 3] ['e', 0] ['f', 1] ['g', 1] ['h', 2] Getting items from the priority queue [0, 'e'] [1, 'b'] [1, 'f'] [1, 'g'] [2, 'a'] [2, 'h'] [3, 'c'] [3, 'd']
27 vàItems/Priorities ['a', 2] ['b', 1] ['c', 3] ['d', 3] ['e', 0] ['f', 1] ['g', 1] ['h', 2] Getting items from the priority queue [0, 'e'] [1, 'b'] [1, 'f'] [1, 'g'] [2, 'a'] [2, 'h'] [3, 'c'] [3, 'd']
28].Items/Priorities ['a', 2] ['b', 1] ['c', 3] ['d', 3] ['e', 0] ['f', 1] ['g', 1] ['h', 2] Getting items from the priority queue [0, 'e'] [1, 'b'] [1, 'f'] [1, 'g'] [2, 'a'] [2, 'h'] [3, 'c'] [3, 'd']
29 hoàn thành lớp với các toán tử so sánh khác.Items/Priorities ['a', 2] ['b', 1] ['c', 3] ['d', 3] ['e', 0] ['f', 1] ['g', 1] ['h', 2] Getting items from the priority queue [0, 'e'] [1, 'b'] [1, 'f'] [1, 'g'] [2, 'a'] [2, 'h'] [3, 'c'] [3, 'd']
40 ,Items/Priorities ['a', 2] ['b', 1] ['c', 3] ['d', 3] ['e', 0] ['f', 1] ['g', 1] ['h', 2] Getting items from the priority queue [0, 'e'] [1, 'b'] [1, 'f'] [1, 'g'] [2, 'a'] [2, 'h'] [3, 'c'] [3, 'd']
41 vàItems/Priorities ['a', 2] ['b', 1] ['c', 3] ['d', 3] ['e', 0] ['f', 1] ['g', 1] ['h', 2] Getting items from the priority queue [0, 'e'] [1, 'b'] [1, 'f'] [1, 'g'] [2, 'a'] [2, 'h'] [3, 'c'] [3, 'd']
42Items/Priorities ['a', 2] ['b', 1] ['c', 3] ['d', 3] ['e', 0] ['f', 1] ['g', 1] ['h', 2] Getting items from the priority queue [0, 'e'] [1, 'b'] [1, 'f'] [1, 'g'] [2, 'a'] [2, 'h'] [3, 'c'] [3, 'd']
Bây giờ chúng ta có thể hoàn thành ví dụ của mình bằng cách thêm khách hàng vào hàng đợi và phục vụ họ theo thứ tự ưu tiên trong khi tôn trọng thứ tự đến trong trường hợp mức độ ưu tiên bằng nhau
import random
from queue import PriorityQueue
def generate_items[]:
items = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
priorities = [2, 1, 3, 3, 0, 1, 1, 2]
return items, priorities
if __name__ == '__main__':
items, priorities = generate_items[]
print['Items/Priorities']
for item, priority in zip[items, priorities]:
print[[item, priority]]
q = PriorityQueue[]
# We add items to priority queue in the order they're listed
# a -> b -> c -> ...
for item, priority in zip[items, priorities]:
q.put[[priority, item]]
# Let's get items from the priority queue one by one
# They will be printed in the order of their priority
print['Getting items from the priority queue']
while not q.empty[]:
next_item = q.get[]
print[next_item]
1Chú ý dòng #68 - #81. Đây là nơi chúng tôi tạo các phiên bản
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
8 và gán Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
18 cho mỗi phiên bản đóNếu bạn chạy đoạn mã trên, bạn sẽ nhận được đầu ra sau
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
0Xem cách khách hàng của chúng tôi đến theo thứ tự ngẫu nhiên nhưng được phục vụ [không phải xếp hàng] vào năm họ đăng ký [khách hàng lớn tuổi trước]. Giữa các khách hàng trong cùng một năm, chúng tôi giữ thứ tự họ đến trong hàng đợi
Như một bài tập, hãy thử loại bỏ
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
18 khỏi các toán tử so sánh và quan sát điều này ảnh hưởng như thế nào đến thứ tự phục vụChuỗi hàng đợi ưu tiên Python có an toàn không?
Có, tất cả các lớp từ mô-đun
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
3 tích hợp đều an toàn cho luồng. Theo tài liệu chính thứcTrong nội bộ, ba loại hàng đợi [Queue, LifoQueue, PriorityQueue] sử dụng khóa để tạm thời chặn các luồng cạnh tranh;
Hàng đợi ưu tiên có giống như đống không?
có và không. Mặc dù các thuật ngữ đôi khi được sử dụng thay thế cho nhau, sự khác biệt là tinh tế
Heap là một cấu trúc dữ liệu [cây] với một thuộc tính quan trọng - trong heap tối đa, phần tử lớn nhất luôn ở gốc; . Heaps có thể duy trì hiệu quả thuộc tính này [được gọi là thuộc tính heap] trong khi thêm hoặc xóa các phần tử vào cấu trúc dữ liệu
Điều này làm cho heap trở thành lựa chọn rõ ràng để triển khai hàng đợi ưu tiên. Hàng đợi ưu tiên là một cấu trúc dữ liệu trừu tượng với các thuộc tính được mô tả trong phần mở đầu của bài viết này
hàng đợi ưu tiên là một kiểu dữ liệu trừu tượng tương tự như cấu trúc dữ liệu ngăn xếp hoặc hàng đợi thông thường trong đó mỗi phần tử cũng có một mức độ ưu tiên được liên kết với nó. Trong hàng đợi ưu tiên, phần tử có mức ưu tiên cao được phục vụ trước phần tử có mức ưu tiên thấp
Trên thực tế,
Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
1 của Python được xây dựng dựa trên mô-đun Items/Priorities
['a', 2]
['b', 1]
['c', 3]
['d', 3]
['e', 0]
['f', 1]
['g', 1]
['h', 2]
Getting items from the priority queue
[0, 'e']
[1, 'b']
[1, 'f']
[1, 'g']
[2, 'a']
[2, 'h']
[3, 'c']
[3, 'd']
48. Mô-đun này cung cấp giao diện đòn bẩy thấp hơn cho hàng đợi ưu tiên dựa trên heap