Python kiểm tra xem mục có trong hàng ưu tiên không

Hàng đợi ưu tiên là một loại dữ liệu trừu tượng [ADT] giống như cấu trúc dữ liệu ngăn xếp hoặc hàng đợi thông thường, nhưng trong đó mỗi phần tử bổ sung 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. Nếu hai phần tử có cùng mức độ ưu tiên, chúng sẽ được phục vụ theo thứ tự của chúng trong hàng đợi

Mặc dù hàng đợi ưu tiên thường được triển khai với đống, nhưng về mặt khái niệm, chúng khác biệt với đống. Hàng đợi ưu tiên là một khái niệm trừu tượng giống như danh sách hoặc bản đồ;

từ hàng đợi ưu tiên wiki

Đoạn mã sau sử dụng hàng đợi ưu tiên đơn giản nhất

try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[10]
q.put[1]
q.put[5]
while not q.empty[]:
	print q.get[],

đầu ra

1 5 10

Như chúng ta có thể thấy từ đầu ra, hàng đợi lưu trữ các phần tử theo mức độ ưu tiên chứ không phải theo thứ tự tạo phần tử. Lưu ý rằng tùy thuộc vào các phiên bản Python, tên của hàng đợi ưu tiên sẽ khác nhau. Vì vậy, chúng tôi đã sử dụng cặp thử và ngoại trừ để chúng tôi có thể điều chỉnh vùng chứa của mình theo phiên bản

Hàng đợi ưu tiên không chỉ lưu trữ các nguyên hàm tích hợp sẵn mà còn bất kỳ đối tượng nào như trong phần tiếp theo

Hàng đợi ưu tiên có thể lưu trữ các đối tượng như bộ dữ liệu

try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],

đầu ra

[1, 'one'] [5, 'five'] [10, 'ten']

Các đối tượng lớp C mẫu sử dụng __cmp__[]

Python không được gõ mạnh, vì vậy chúng tôi có thể lưu bất cứ thứ gì chúng tôi muốn. giống như chúng tôi đã lưu trữ một bộ [mức độ ưu tiên, điều] trong phần trước. Chúng ta cũng có thể lưu trữ các đối tượng lớp nếu chúng ta ghi đè phương thức __cmp__[]

try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

class Skill[object]:
    def __init__[self, priority, description]:
        self.priority = priority
        self.description = description
        print 'New Level:', description
        return
    def __cmp__[self, other]:
        return cmp[self.priority, other.priority]

q = Q.PriorityQueue[]

q.put[Skill[5, 'Proficient']]
q.put[Skill[10, 'Expert']]
q.put[Skill[1, 'Novice']]

while not q.empty[]:
    next_level = q.get[]
    print 'Processing level:', next_level.description

đầu ra

New Level: Proficient
New Level: Expert
New Level: Novice
Processing level: Novice
Processing level: Proficient
Processing level: Expert

Heapq triển khai thuật toán sắp xếp heap tối thiểu phù hợp để sử dụng với danh sách của Python

Mô-đun này cung cấp triển khai thuật toán hàng đợi heap, còn được gọi là thuật toán hàng đợi ưu tiên

Heaps là cây nhị phân mà mọi nút cha có giá trị nhỏ hơn hoặc bằng bất kỳ nút con nào của nó. Việc triển khai này sử dụng các mảng mà $heap\left[k\right] \le heap\left[2*k+1\right]$ và $heap\left[k\right] \le heap\left[2*k+ . Để so sánh, các phần tử không tồn tại được coi là vô hạn. Thuộc tính thú vị của heap là phần tử nhỏ nhất của nó luôn là gốc, $heap\left[0\right]$

Trong Python, hàng đợi thường được sử dụng để xử lý các mục bằng cách sử dụng chiến lược nhập trước xuất trước [FIFO]. Tuy nhiên, khi xác định thứ tự xử lý thường phải tính đến mức độ ưu tiên của từng hạng mục. Hàng đợi truy xuất và xóa các mục dựa trên mức độ ưu tiên cũng như thời gian đến của chúng được gọi là hàng đợi ưu tiên. Ưu tiên có thể phức tạp, nhưng may mắn thay, hàng đợi ưu tiên Python có thể được triển khai dễ dàng và hiệu quả bằng cách sử dụng mô-đun tích hợp. Hướng dẫn này giới thiệu hàng đợi ưu tiên Python và giải thích cách triển khai nó trong Python 3

Hàng đợi trong Python

Hàng đợi là gì?

Hàng đợi là một cấu trúc dữ liệu lập trình cơ bản. Cấu trúc dữ liệu được sử dụng để tổ chức, quản lý và lưu trữ dữ liệu. Chúng làm cho các chương trình dễ hiểu và dễ viết hơn, đồng thời cũng thường nhanh hơn và đáng tin cậy hơn

Về mặt khái niệm, hàng đợi biểu thị các mục dữ liệu dưới dạng danh sách có thứ tự. Các mục được xóa khỏi danh sách theo cùng thứ tự chúng đến. Xếp hàng là một khái niệm quen thuộc trong cuộc sống hàng ngày. Mỗi khi một nhóm người xếp hàng cho một cái gì đó, họ tạo thành một hàng đợi. Chẳng hạn, một hàng người tại ngân hàng hoặc quán cà phê là một hàng đợi. Người đầu tiên đến là người đứng đầu hàng đợi. Họ là người tiếp theo được phục vụ. Khi một khách hàng mới đến, họ xếp cuối hàng

Về mặt máy tính, hàng đợi được phục vụ bằng thao tác đẩy và bật. Các mục được đẩy vào hàng đợi và được bật ra khỏi hàng đợi khi chúng được xử lý. Thao tác pop thường xóa mục khỏi hàng đợi. Tuy nhiên, đôi khi có thể nhìn trộm mục nhập nằm ở phía trước hàng đợi mà không xóa nó

Python hỗ trợ hàng đợi thông qua các thư viện rộng lớn của nó. Các lớp và thủ tục tích hợp xử lý tất cả các xử lý thông thường. Bạn chỉ phải tạo một đối tượng hàng đợi và gọi các phương thức để thêm các mục mới và xóa các mục cũ nhất. Hàng đợi thường là lựa chọn tốt nhất cho các hoạt động bao gồm lên lịch tác vụ và xử lý các yêu cầu đến

Ví dụ sau minh họa cách hàng đợi hoạt động trên dữ liệu thực tế

  • Để bắt đầu, các mặt hàng
    q = queue.PriorityQueue[]
    
    3,
    q = queue.PriorityQueue[]
    
    4,
    q = queue.PriorityQueue[]
    
    5 và
    q = queue.PriorityQueue[]
    
    6 sẽ đến theo thứ tự được trình bày. Tất cả bốn mục được thêm vào hàng đợi theo thứ tự chúng đến
  • Tại thời điểm này, một mục được chọn để xử lý. Mục
    q = queue.PriorityQueue[]
    
    3 được chọn và xóa khỏi hàng đợi. Nó được chọn vì nó đến trước và đứng đầu hàng
  • Tiếp theo, mặt hàng
    q = queue.PriorityQueue[]
    
    8 đến. Nó được thêm vào phía sau hàng đợi
  • Hai mục nữa được chọn và xóa. Các mục
    q = queue.PriorityQueue[]
    
    4 và
    q = queue.PriorityQueue[]
    
    5 được truy xuất vì chúng chiếm hai vị trí đầu tiên của hàng đợi
  • Hiện có hai mục trong hàng đợi. Mục
    q = queue.PriorityQueue[]
    
    6 ở phía trước và sẽ là mục được lên lịch tiếp theo, tiếp theo là
    q = queue.PriorityQueue[]
    
    8. Mục tiếp theo đến sẽ được thêm vào cuối hàng đợi, sau
    q = queue.PriorityQueue[]
    
    8

Hàng đợi có thể được tương phản với ngăn xếp. Ngăn xếp cũng là một cấu trúc dữ liệu dựa trên danh sách, nhưng nó sử dụng sơ đồ nhập sau xuất trước [LIFO]. Mục gần đây nhất đến luôn là mục tiếp theo được chọn. Ngăn xếp ít rõ ràng hơn trong cuộc sống hàng ngày, nhưng được sử dụng bất cứ khi nào hiệu quả được ưu tiên hơn tính công bằng nghiêm ngặt. Chẳng hạn, ngăn xếp được sử dụng để lưu trữ và lấy các nguồn cung cấp không dễ hư hỏng. Nguồn cung cấp mới được đặt trên các đơn đặt hàng cũ. Khi cần thêm hàng, các mặt hàng hàng đầu sẽ được loại bỏ trước. Trong lập trình, hầu hết các trình biên dịch sử dụng rộng rãi ngăn xếp. Chúng cũng là lựa chọn tốt nhất để đánh giá các biểu thức toán học, vì tầm quan trọng của thứ tự các phép toán

Đống là gì?

Hàng đợi hiệu quả trong Python vì chúng được triển khai dưới dạng đống. Heap là một loại cấu trúc dữ liệu dựa trên cây đặc biệt. Cây là cấu trúc dữ liệu phân cấp có chứa một nút cha, được gọi là gốc. Gốc có thể có các nút con và mỗi nút con cũng có thể có các nút con. Điều này cho phép cây phát triển hữu cơ thành nhiều tầng. Heap thường được triển khai dưới dạng cây nhị phân. Trong cây nhị phân, mỗi nút không thể có nhiều hơn hai nút con

Hai loại heap là max heap và min heap. Trong một heap tối đa, giá trị được lưu trữ trong nút cha lớn hơn giá trị được lưu trữ trong bất kỳ nút con nào của nó. Một đống tối thiểu hoạt động theo cách ngược lại. Nút cha chứa giá trị nhỏ hơn bất kỳ nút con nào của nó. Mối quan hệ này giữ cho mỗi nút ở mọi cấp độ của heap. Điều này có nghĩa là các giá trị nhỏ dần ở mỗi lớp thấp hơn trong một đống tối đa hoặc lớn hơn trong một đống tối thiểu

Heaps là một phương pháp rất hiệu quả để thao tác dữ liệu có thứ tự. Chúng đặc biệt hữu ích để truy xuất mục có giá trị cao nhất hoặc thấp nhất. Nói chung, các thuật toán được sử dụng trên một đống có độ phức tạp thời gian không đổi hoặc logarit. Điều này rất tốt vì tốc độ tăng trưởng của thuật toán tăng khá chậm khi kích thước của tập dữ liệu tăng lên. Và, tất nhiên, các thuật toán thời gian không đổi hoàn toàn không tăng

Ghi chú

Trong khoa học máy tính, ký hiệu Big O được sử dụng để mô tả cách thời gian thực hiện tăng theo kích thước của tập dữ liệu. Hầu hết các hoạt động heap có độ phức tạp thời gian O[log n]

Mặc dù đống rất hữu ích cho việc sắp xếp và sắp xếp dữ liệu, nhưng chúng có nhược điểm. Chúng phải được giữ cân bằng. Điều này có nghĩa là cần phải làm thêm bất cứ khi nào các nút được thêm hoặc xóa. Heaps hiệu quả hơn với các tập dữ liệu tương đối tĩnh, nhưng vẫn có thể được sử dụng khi các nút được thêm và xóa thường xuyên

Xếp hàng ưu tiên là gì?

Hàng đợi FIFO cơ bản là hàng đợi đơn giản và dễ sử dụng nhất. Nó đôi khi được gọi là một hàng đợi nghiêm ngặt. Trong trường hợp này, mục cũ nhất phải luôn được xóa trước, không có ngoại lệ. Đôi khi, giới hạn này quá cứng nhắc. Tuy nhiên, có thể thêm mức độ ưu tiên vào cấu trúc hàng đợi. Điều này cho phép một mục nhảy lên đầu hàng đợi mặc dù nó không phải là người đầu tiên đến

Hàng đợi ưu tiên tuân theo các nguyên tắc xếp hàng cơ bản, nhưng duy trì nhiều hàng đợi phụ cho các mức độ ưu tiên khác nhau. Nó sắp xếp trước tập hợp các mục dựa trên mức độ ưu tiên của chúng. Các mục có mức độ ưu tiên cao nhất luôn được phục vụ trước, ngay cả khi các mục có mức độ ưu tiên thấp hơn đến sớm hơn. Trong thực tế, việc triển khai nội bộ hàng đợi ưu tiên thường không xây dựng nhiều danh sách. Thay vào đó, mức độ ưu tiên được sử dụng để xác định vị trí chèn mục mới. Điều này có nghĩa là mặt trước của hàng đợi luôn được phục vụ trước, nhưng các mặt hàng mới không tự động vào hàng đợi ở phía sau. Trên thực tế, một mục có mức độ ưu tiên rất cao có thể được đặt ở đầu hàng đợi

Hàng đợi ưu tiên rất hữu ích trong nhiều tình huống thực tế. Ví dụ: các hãng hàng không thực thi quyền ưu tiên xếp hàng khi lên máy bay. Hành khách hạng thương gia xếp hàng ưu tiên cao nhất và được lên máy bay trước. Một hoặc nhiều hàng đợi giá vé thông thường được ưu tiên tiếp theo, tiếp theo là bất kỳ hành khách chờ hoặc vé giá rẻ nào. Nếu một khách hàng doanh nghiệp đến sau khi hành khách giá vé thông thường đã lên máy bay, họ sẽ đi đến đầu hàng. Hàng đợi ưu tiên cũng được sử dụng cho mục đích phân loại tại bệnh viện hoặc để phục vụ các yêu cầu bảo trì

Trong các tình huống điện toán, hệ điều hành đa luồng sử dụng hàng đợi ưu tiên. Các tác vụ có mức độ ưu tiên cao hơn được phân bổ trước các tác vụ nền. Ví dụ: nhấp chuột được ưu tiên hơn hiển thị trang web. Trong các bộ định tuyến mạng, lưu lượng kiểm soát và cập nhật định tuyến được xử lý trước lưu lượng người dùng

Lớp hàng đợi ưu tiên Python

Trong Python, có thể tạo hàng đợi ưu tiên của riêng bạn bằng danh sách Python. Tuy nhiên, tốt hơn là sử dụng lớp

1 5 10
74 tích hợp. Lớp này hỗ trợ tất cả các chức năng cơ bản như
1 5 10
75 và
1 5 10
76 một cách rất hiệu quả. Python tự động chèn và xóa các mục dựa trên mức độ ưu tiên của chúng và duy trì cấu trúc bên trong của hàng đợi

Hàng đợi ưu tiên Python luôn xóa và trả về mục có mức độ ưu tiên cao nhất trong hàng đợi. Nếu hai mục có cùng mức độ ưu tiên, Python sẽ xóa mục đến trước. Đối với một bộ có cả trường dữ liệu và mức độ ưu tiên, trước tiên Python so sánh mức độ ưu tiên và sau đó là mục dữ liệu

Ghi chú

Để tránh sử dụng trường dữ liệu trong so sánh, hãy đặt lớp

1 5 10
74 trong một trình bao bọc và ghi đè hành vi mặc định của nó. Tham khảo tài liệu lớp Python PriorityQueue để biết thêm chi tiết về kỹ thuật này

Việc triển khai lớp PriorityQueue của Python mở rộng mô-đun Python

1 5 10
78, dựa trên thiết kế heap nhị phân. Rất dễ dàng để truy xuất và xóa mục có mức độ ưu tiên cao nhất khỏi một đống nhị phân. Các thao tác thêm và xóa có độ phức tạp về thời gian là O[log n] ngay cả khi các hoạt động tái cân bằng được tính đến. Điều này có nghĩa là lớp
1 5 10
74 vẫn khá hiệu quả ngay cả với các tập dữ liệu lớn. Trong triển khai heap tối đa, mục có mức ưu tiên cao nhất ở phía trước hàng đợi luôn có thể truy cập ngay lập tức ở đầu heap. Chèn một mục vào hàng đợi hơi phức tạp hơn, nhưng vẫn có thể được thực hiện trong thời gian logarit

Để biết thêm chi tiết về cách Python triển khai bên trong lớp

1 5 10
74 của nó, hãy xem tài liệu Python

Nhập hàng đợi ưu tiên

Lớp

1 5 10
74 là một phần của mô-đun
try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],
52. Nó được mô tả trong tài liệu hàng đợi Python và có thể được nhập bằng lệnh sau

try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],
6

Điều này cho phép hàm tạo và tất cả các phương thức của lớp được truy cập trực tiếp mà không cần thêm tên của mô-đun. Ví dụ: có thể tạo hàng đợi ưu tiên bằng lệnh sau

try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],
7

Nếu bạn yêu cầu các chức năng khác trong thư viện

try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],
52, có thể nhập toàn bộ gói

try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],
9

Trong trường hợp này, tên của mô-đun phải đứng trước hàm tạo

1 5 10
74. Dòng sau tạo hàng đợi ưu tiên giống như ví dụ đầu tiên

q = queue.PriorityQueue[]

Cách sử dụng lớp PriorityQueue

Lớp

1 5 10
74 chia sẻ hầu hết các phương thức giống như lớp cha mẹ
try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],
56. Tài liệu hàng đợi Python cung cấp thông tin chi tiết về hàm tạo của lớp và tất cả các phương thức

Các nhà phát triển có thể tạo một đối tượng

1 5 10
74 bằng cách sử dụng hàm tạo của lớp. Đồng thời, họ có thể cung cấp tham số để đặt kích thước tối đa cho hàng đợi. Lệnh sau tạo hàng đợi ưu tiên có thể chứa 100 đối tượng

1 5 10
7
Ghi chú

Các ví dụ trong phần này giả sử lớp

1 5 10
74 đã được nhập bằng cách sử dụng
try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],
59

Giao diện

1 5 10
74 khá đơn giản để sử dụng. Danh sách sau đây mô tả các phương pháp quan trọng nhất

  • trống rỗng. Hàm này trả về
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    61 nếu hàng đợi trống và không chứa mục nào. Nếu không, nó sẽ trả về
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    62. Hàm này thường được sử dụng để xác định xem có cần thêm hoạt động
    1 5 10
    
    76 nào để phục vụ hàng đợi không
  • đầy. Hàm này trả về
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    61 nếu hàng đợi đã đạt đến kích thước tối đa và không còn chỗ cho các mục nhập bổ sung. Một hàng đợi thường chỉ có thể đạt đến công suất tối đa nếu giới hạn kích thước đã được định cấu hình. Mặt khác, kích thước hàng đợi chỉ bị giới hạn bởi bộ nhớ khả dụng
  • được. Điều này loại bỏ và trả lại mục ưu tiên cao nhất khỏi hàng đợi. Các tham số bổ sung có thể được cung cấp cho biết liệu Python có nên chặn việc chờ một mục hay không và nó phải đợi bao lâu. Giá trị mặc định cho tham số
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    65 là
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    61, trong khi giá trị mặc định của
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    67 là
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    68. Theo mặc định, một khối yêu cầu
    1 5 10
    
    76 chờ mãi mãi cho mục tiếp theo đến
  • kích thước tối đa. Phương thức này trả về kích thước tối đa của hàng đợi. Nếu không có kích thước tối đa, nó sẽ trả về
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    70
  • đặt. Phương pháp này thêm một mục có mức độ ưu tiên được chỉ định vào hàng đợi ưu tiên. Các nhà phát triển có thể thêm một giá trị duy nhất để hoạt động dưới dạng ưu tiên hoặc một bộ ở dạng
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    71. Một bộ Python là một danh sách có thứ tự và không thay đổi. Tương tự như phương thức
    1 5 10
    
    76, các tham số
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    65 và
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    67 có thể được truyền cho phương thức. Giá trị mặc định là
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    61 và
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    68. Nếu hàng đợi đã đầy, phương thức
    1 5 10
    
    75 sẽ chặn cho đến khi hết thời gian chờ một vị trí khả dụng
  • qsize. Phương thức này trả về số lượng mục hiện có trong hàng đợi
Ghi chú

Một số lệnh

1 5 10
74, bao gồm
try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],
79,
New Level: Proficient
New Level: Expert
New Level: Novice
Processing level: Novice
Processing level: Proficient
Processing level: Expert
80 và
New Level: Proficient
New Level: Expert
New Level: Novice
Processing level: Novice
Processing level: Proficient
Processing level: Expert
81 có thể tuân theo các điều kiện tương tranh khi sử dụng nhiều quy trình

Có thể xóa hàng đợi bằng lệnh

New Level: Proficient
New Level: Expert
New Level: Novice
Processing level: Novice
Processing level: Proficient
Processing level: Expert
82

try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],
5

Một ví dụ về hàng đợi ưu tiên Python

Ví dụ trong phần này trình bày cách triển khai hàng đợi ưu tiên Python cho hành khách đi máy bay bằng cách sử dụng lớp

1 5 10
74. Nó giải thích cách tạo hàng đợi, cách thêm và xóa mục nhập mới cũng như cách xóa tất cả các mục còn lại khỏi hàng đợi

  1. Nhập gói

    1 5 10
    
    74 từ mô-đun
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    52

    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    6
  2. Tạo một Python

    1 5 10
    
    74, gán biến
    New Level: Proficient
    New Level: Expert
    New Level: Novice
    Processing level: Novice
    Processing level: Proficient
    Processing level: Expert
    
    87 cho đối tượng

    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    7
  3. Tạo ba hành khách bằng phương pháp

    1 5 10
    
    75. Khách hàng Smith ở hạng thương gia, tức là hạng 2, trong khi khách hàng Jones ở hạng nhất, được chỉ định là ưu tiên 1. Khách hàng Wilson đang ở trạng thái “chờ đợi” lớp 4. Mỗi mục được nhập dưới dạng một bộ, chứa mức độ ưu tiên cùng với tên của khách hàng. Bộ dữ liệu được đặt trong dấu ngoặc đơn và là tham số duy nhất được truyền cho phương thức
    New Level: Proficient
    New Level: Expert
    New Level: Novice
    Processing level: Novice
    Processing level: Proficient
    Processing level: Expert
    
    89

    New Level: Proficient
    New Level: Expert
    New Level: Novice
    Processing level: Novice
    Processing level: Proficient
    Processing level: Expert
    
    8
  4. Xóa khách hàng Jones, khách hàng có mức độ ưu tiên cao nhất khỏi hàng đợi. Mặc dù Jones đến sau Smith, nhưng họ được ưu tiên cao nhất vì họ học lớp

    q = queue.PriorityQueue[]
    
    20

    q = queue.PriorityQueue[]
    
    2____270
  5. Đôi khi rất hữu ích để xác minh xem hàng đợi trống hay đầy. Phương thức

    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    79 sẽ trả về
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    62 vì vẫn còn hai mục nhập. Trong thực tế, hàng đợi có kích thước không giới hạn, vì vậy
    New Level: Proficient
    New Level: Expert
    New Level: Novice
    Processing level: Novice
    Processing level: Proficient
    Processing level: Expert
    
    80 cũng là
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    62

    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    71
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    72____273
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    72
  6. Thêm khách hàng Collins vào hàng đợi với mức độ ưu tiên 3 của hạng “tiêu chuẩn”

    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    75
  7. Xóa khách hàng tiếp theo khỏi hàng đợi. Đây là khách hàng Smith

    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    76
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    77
  8. Để xóa tất cả các mục còn lại khỏi hàng đợi ưu tiên, hãy sử dụng vòng lặp

    q = queue.PriorityQueue[]
    
    25. Tại lối vào vòng lặp, xác nhận xem vòng lặp có trống hay không. Nếu phương thức
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    79 trả về false, thì vẫn còn các mục nhập. Trong trường hợp này, phương pháp
    1 5 10
    
    76 trích xuất mục ưu tiên cao nhất từ ​​​​hàng đợi. Collins có mức độ ưu tiên cao hơn và được đưa ra khỏi hàng đợi trước khi Wilson được

    Ghi chú

    Nếu

    1 5 10
    
    76 được sử dụng trên hàng đợi trống với cài đặt mặc định, nó sẽ bị chặn cho đến khi có một mục. Để tránh bế tắc, điều quan trọng là phải đặt tham số
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    65 thành
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    62 hoặc trước tiên hãy xác minh xem hàng đợi có còn chứa nhiều mục hay không

    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    78
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    79
  9. Tại thời điểm này, hàng đợi sẽ trống

    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    90
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    91

Các hướng dẫn này có thể được kết hợp với nhau để tạo thành chương trình

try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],
701

thận trọng

Không đặt tên cho chương trình này là

try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],
702. Điều này sẽ xung đột với mô-đun
try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],
52 thực tế và ẩn giao diện thực tế. Lỗi này tạo ra lỗi
try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],
704 khi chạy

Tập tin. pri_queue. py

try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],
92____293

Bạn có thể chạy tệp bằng lệnh sau

try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],
94

Lấy kích thước của hàng đợi ưu tiên trong Python

Để lấy kích thước của hàng đợi Python, hãy sử dụng lệnh

New Level: Proficient
New Level: Expert
New Level: Novice
Processing level: Novice
Processing level: Proficient
Processing level: Expert
81. Ví dụ sau minh họa cách xác định kích thước của bất kỳ hàng đợi nào trong Python

  1. Tương tự như ví dụ trước, nhập lớp

    1 5 10
    
    74 và tạo đối tượng
    1 5 10
    
    74

    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    95
  2. Thêm một vài mục vào hàng đợi với các mức độ ưu tiên khác nhau bằng cách sử dụng quy trình

    1 5 10
    
    75

    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    96
  3. Xác minh kích thước của hàng đợi ưu tiên bằng phương thức

    New Level: Proficient
    New Level: Expert
    New Level: Novice
    Processing level: Novice
    Processing level: Proficient
    Processing level: Expert
    
    81 của Python

    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    97____298
  4. Thêm một mục mới vào hàng đợi và xác nhận lại kích thước hàng đợi. Nó đã tăng lên

    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    710

    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    99
    q = queue.PriorityQueue[]
    
    0
  5. Xóa một mục khỏi hàng đợi bằng lệnh

    1 5 10
    
    76. Quy trình
    New Level: Proficient
    New Level: Expert
    New Level: Novice
    Processing level: Novice
    Processing level: Proficient
    Processing level: Expert
    
    81 xác nhận kích thước hàng đợi đã trở lại
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    713

    q = queue.PriorityQueue[]
    
    1
    try:
        import Queue as Q  # ver. < 3.0
    except ImportError:
        import queue as Q
    
    q = Q.PriorityQueue[]
    q.put[[10,'ten']]
    q.put[[1,'one']]
    q.put[[5,'five']]
    while not q.empty[]:
        print q.get[],
    
    98

Phần kết luận

Hàng đợi Python là một cấu trúc dữ liệu quan trọng xử lý danh sách các mục theo cách FIFO. Mặc dù hàng đợi truyền thống tuân theo thuật toán FIFO nghiêm ngặt, hàng đợi ưu tiên Python có thể ưu tiên các mục trong danh sách. Điều này cho phép các mục có mức độ ưu tiên cao được xử lý trước các mục có mức độ ưu tiên thấp hơn đến trước đó

Python bao gồm triển khai hàng đợi ưu tiên như một phần của mô-đun

try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

q = Q.PriorityQueue[]
q.put[[10,'ten']]
q.put[[1,'one']]
q.put[[5,'five']]
while not q.empty[]:
    print q.get[],
52 của nó. Nó quản lý hàng đợi ưu tiên bằng cách sử dụng cấu trúc dữ liệu heap. Trong một heap tối đa, giá trị của nút cha lớn hơn giá trị được lưu trữ trong bất kỳ nút con nào của nó. Đống giúp dễ dàng truy cập vào mục có mức độ ưu tiên cao nhất và thậm chí cả việc chèn vào cũng tương đối hiệu quả với độ phức tạp thời gian logarit. Hàng đợi ưu tiên trong Python có giao diện đơn giản và dễ hiểu. Có thể chèn các mục bằng cách sử dụng
1 5 10
75 và truy xuất bằng cách sử dụng
1 5 10
76. Để biết thêm thông tin về hàng đợi Python, hãy xem tài liệu chính thức về hàng đợi Python

Thêm thông tin

Bạn có thể muốn tham khảo các tài nguyên sau để biết thêm thông tin về chủ đề này. Mặc dù chúng được cung cấp với hy vọng rằng chúng sẽ hữu ích, xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc kịp thời của các tài liệu được lưu trữ bên ngoài

Làm cách nào để lấy giá trị từ hàng đợi ưu tiên trong Python?

Python xếp hàng ưu tiên. xếp hàng. Lớp này là một phần của thư viện hàng đợi Python. Bạn cần nhập thư viện hàng đợi để sử dụng lớp này. Để truy xuất một mục từ PriorityQueue, bạn có thể sử dụng phương thức get[] .

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ủ Đề