Bộ so sánh hàng đợi ưu tiên Python

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

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']
3

Trong 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']
6

Về 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 đợi

Là 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ệ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']
1

Chạ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']
2

Bâ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 đợi

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

Đố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']
5

Nế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']
6

Tạ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']
6

Tạ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 đề

  1. 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
  2. Đố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ục

Chú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ôi

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']
0

Hai điều quan trọng đang diễn ra ở đây

  • Chúng tôi đã thêm 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']
    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 đợi
  • Chúng tôi đã triển khai các phương pháp so sánh 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. Để 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ứ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']
    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']
    42

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]



1

Chú ý 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']
0

Xem 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ức

Trong 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

Làm cách nào để đặt bộ so sánh cho hàng đợi ưu tiên trong Python?

Hàng đợi ưu tiên của Python với bộ so sánh tùy chỉnh . Ví dụ: chúng tôi tạo Hàng đợi ưu tiên bằng cách sử dụng heapq. Sau đó, chúng ta sắp xếp heapq bằng phương thức sorted[]. Bây giờ, hãy để chúng tôi sắp xếp hàng đợi dựa trên bộ so sánh tùy chỉnh của chúng tôi.

Làm cách nào để lặp qua hàng đợi ưu tiên trong Python?

Sử dụng vòng lặp while để lặp qua một hàng đợi trong Python, e. g. trong khi không q. trống rỗng[]. . Vòng lặp kiểm tra xem hàng đợi có trống không và lặp lại miễn là có các mục trong hàng đợi.

Python có hàng đợi ưu tiên không?

Python cung cấp triển khai tích hợp cấu trúc dữ liệu hàng đợi ưu tiên . kể từ khi hàng đợi. Lớp PriorityQueue cần duy trì thứ tự các phần tử của nó, cần có cơ chế sắp xếp mỗi khi một phần tử mới được đưa vào hàng đợi. Python giải quyết vấn đề này bằng cách sử dụng một đống nhị phân để triển khai hàng đợi ưu tiên.

Hàng đợi ưu tiên có thể trùng lặp trong Python không?

Có, trong priority_queue của C++, chúng tôi có thể có các giá trị trùng lặp .

Chủ Đề