Hàng đợi ưu tiên có tự động sắp xếp Python không?

Sau một thời gian cố gắng tìm ra một lỗi được đồn đại trong hàng đợi ưu tiên của Python [

10
10
15
75], tôi đã thành công trong việc viết một chương trình nhỏ có thể tạo lại lỗi này

Mã có sẵn tại https. //cai Xô nhỏ. org/dpb/queue_change_test. Nó được dành cho Python v. 2. 6. Như tôi đã tìm thấy gần đây, vấn đề thường không phát sinh khi các cấu trúc dữ liệu đơn giản được đặt trong hàng đợi và có thể được sắp xếp theo thứ tự từ điển;

Lỗi xảy ra trong mã này khi danh sách được liệt kê và một số giá trị của chúng sau đó được thay đổi bên ngoài hàng đợi. Hàng đợi sẽ tự động sắp xếp lại, nhưng điều này không phải lúc nào cũng đúng

Nếu sau khi thay đổi các giá trị, hàng đợi được chuyển sang một danh sách khác và những nội dung đó sau đó được đưa vào hàng đợi lại, thì hàng đợi mới được coi là đã được sắp xếp chính xác. Điều đó cho thấy rằng sự cố có liên quan đến chính cấu trúc dữ liệu hàng đợi chứ không phải các giá trị trong hàng đợi. Hàng đợi thêm các giá trị một cách chính xác nhưng không phải lúc nào cũng sắp xếp chúng một cách chính xác khi chúng bị thay đổi sau khi được thêm vào

Phần đầu của hàng đợi này là phần tử nhỏ nhất đối với thứ tự đã chỉ định. Nếu nhiều phần tử được gắn với giá trị nhỏ nhất, thì phần đầu là một trong những phần tử đó -- các phần tử bị phá vỡ tùy ý. Các phép toán truy xuất hàng đợi

10
10
15
76,
10
10
15
77,
10
10
15
78, và
10
10
15
79 truy xuất phần tử ở đầu hàng đợi

Hàng đợi ưu tiên không bị chặn, nhưng có dung lượng bên trong chi phối kích thước của một mảng được sử dụng để lưu trữ các phần tử trên hàng đợi. Nó luôn lớn ít nhất bằng kích thước hàng đợi. Khi các phần tử được thêm vào hàng đợi ưu tiên, dung lượng của nó sẽ tự động tăng lên. Các chi tiết của chính sách tăng trưởng không được chỉ định

Lớp này và trình lặp của nó triển khai tất cả các phương thức tùy chọn của giao diện

10
10
15
80 và
10
10
15
81. Iterator được cung cấp trong phương thức
10
10
15
82 không đảm bảo sẽ duyệt qua các phần tử của hàng đợi ưu tiên theo bất kỳ thứ tự cụ thể nào. Nếu bạn cần truyền tải theo thứ tự, hãy cân nhắc sử dụng
10
10
15
830

Lưu ý rằng việc triển khai này không được đồng bộ hóa. Nhiều luồng không được truy cập đồng thời một phiên bản

10
10
15
831 nếu bất kỳ luồng nào sửa đổi hàng đợi. Thay vào đó, hãy sử dụng lớp
10
10
15
832 an toàn cho luồng

lưu ý thực hiện. việc triển khai này cung cấp thời gian O[log[n]] cho các phương pháp xếp hàng và xếp hàng [

10
10
15
833,
10
10
15
76,
10
10
15
835 và
10
10
15
836];

PriorityQueue được sử dụng khi các đối tượng được cho là được xử lý dựa trên mức độ ưu tiên. Được biết, một Queue tuân theo thuật toán First-In-First-Out, nhưng đôi khi các phần tử của queue cần được xử lý theo mức độ ưu tiên, đó là lúc PriorityQueue phát huy tác dụng

PriorityQueue dựa trên vùng ưu tiên. Các phần tử của hàng đợi ưu tiên được sắp xếp theo thứ tự tự nhiên hoặc theo Bộ so sánh được cung cấp tại thời điểm xây dựng hàng đợi, tùy thuộc vào hàm tạo nào được sử dụng.   

Trong hàng đợi ưu tiên bên dưới, phần tử có giá trị ASCII lớn nhất sẽ có mức ưu tiên cao nhất

Tuyên ngôn

public class PriorityQueue extends AbstractQueue implements Serializable

where E is the type of elements held in this queue

The class implements Serializable, Iterable, Collection, Queue interfaces.

Một vài điểm quan trọng trên Hàng đợi ưu tiên như sau.  

  • PriorityQueue không cho phép null
  • Chúng tôi không thể tạo PriorityQueue của các đối tượng không thể so sánh được
  • PriorityQueue là hàng đợi không liên kết
  • Phần đầu của hàng đợi này là phần tử ít nhất đối với thứ tự đã chỉ định. Nếu nhiều phần tử được gắn với giá trị nhỏ nhất, thì phần đầu là một trong những phần tử đó — các phần tử bị phá vỡ tùy ý
  • Vì PriorityQueue không an toàn cho luồng, nên java cung cấp lớp PriorityBlockingQueue triển khai giao diện BlockingQueue để sử dụng trong môi trường đa luồng java
  • Các thao tác truy xuất hàng đợi thăm dò, xóa, xem nhanh và phần tử truy cập phần tử ở đầu hàng đợi
  • Nó cung cấp thời gian O[log[n]] cho các phương thức thêm và thăm dò ý kiến
  • Nó kế thừa các phương thức từ lớp AbstractQueue, AbstractCollection, Collection và Object

nhà xây dựng

1. Hàng đợi ưu tiên[]. Tạo một PriorityQueue với dung lượng ban đầu mặc định [11] sắp xếp các phần tử của nó theo thứ tự tự nhiên của chúng

PriorityQueue pq = new PriorityQueue[];

2. PriorityQueue[Collection c]: Creates a PriorityQueue containing the elements in the specified collection.

PriorityQueue pq = new PriorityQueue[Collection c];

3. PriorityQueue[int Dung lượng ban đầu]. Tạo một PriorityQueue với dung lượng ban đầu được chỉ định sắp xếp các phần tử của nó theo thứ tự tự nhiên của chúng

PriorityQueue pq = new PriorityQueue[int initialCapacity];

4. PriorityQueue[int initialCapacity, Comparator comparator]: Creates a PriorityQueue with the specified initial capacity that orders its elements according to the specified comparator.

PriorityQueue pq = new PriorityQueue[int initialCapacity, Comparator comparator];

5. PriorityQueue[PriorityQueue c]: Creates a PriorityQueue containing the elements in the specified priority queue.

PriorityQueue pq = new PriorityQueue[PriorityQueue c];

6. PriorityQueue[SortedSet c]: Creates a PriorityQueue containing the elements in the specified sorted set.

PriorityQueue pq = new PriorityQueue[SortedSet c];

Ví dụ

Ví dụ dưới đây giải thích các thao tác cơ bản sau của hàng đợi ưu tiên

  • thêm boolean [phần tử E]. Phương thức này chèn phần tử đã chỉ định vào hàng đợi ưu tiên này
  • nhìn trộm công khai[]. Phương thức này truy xuất, nhưng không xóa, phần đầu của hàng đợi này hoặc trả về null nếu hàng đợi này trống
  • thăm dò dư luận[]. Phương thức này truy xuất và xóa phần đầu của hàng đợi này hoặc trả về null nếu hàng đợi này trống

Java




10
10
15
95

10
10
15
96

10
10
15
97
10
10
15
0

10
10
15
1

10
10
15
2
10
10
15
3

10
10
15
4

10
10
15
5
10
10
15
6

10
10
15
7
10
10
15
8
10
10
15
9
10
10
15
10
10
10
15
11

10
10
15
7____113

10
10
15
14
10
10
15
15

10
10
15
14
10
10
15
17
10
10
15
18
10
10
15
19

10
10
15
1

10
10
15
14
10
10
15
32

10
10
15
14
10
10
15
34
10
10
15
35
10
10
15
36

10
10
15
14
10
10
15
34
10
10
15
39
10
10
15
36

10
10
15
14
10
10
15
34____343
10
10
15
36

10
10
15
1

10
10
15
14
10
10
15
47

10
10
15
14
10
10
15
49

10
10
15
1

10
10
15
14
10
10
15
32

10
10
15
14
10
10
15
34

10
10
15
14
10
10
15
36

10
10
15
1

10
10
15
14
10
10
15
39

10
10
15
14
10
10
15
49

10
10
15
7____543

10
10
15
43

Đầu ra

10
10
15

Thao tác trên PriorityQueue

Hãy xem cách thực hiện một số thao tác thường được sử dụng trên lớp Hàng đợi ưu tiên

1. Thêm phần tử. Để thêm một phần tử vào hàng đợi ưu tiên, chúng ta có thể sử dụng phương thức add[]. Thứ tự chèn không được giữ lại trong PriorityQueue. Các phần tử được lưu trữ dựa trên thứ tự ưu tiên tăng dần theo mặc định.  

Java




10
10
15
45

10
10
15
1

10
10
15
97
10
10
15
0

10
10
15
97
10
10
15
950

10
10
15
4

10
10
15
8
10
10
15
2
10
10
15
3

10
10
15
4

10
10
15
7
10
10
15
8
10
10
15
9
10
10
15
10
10
10
15
11

10
10
15
7____113

10
10
15
14
10
10
15
964
10
10
15
18
10
10
15
966

10
10
15
14
10
10
15
968
10
10
15
969
10
10
15
970
10
10
15
971
10
10
15
972
10
10
15
973
10
10
15
974
10
10
15
975

10
10
15
976
10
10
15
977

10
10
15
976
10
10
15
979____100
10
10
15
36

10
10
15
14
10
10
15
43

10
10
15
14
10
10
15
05

10
10
15
7____543

10
10
15
43

Đầu ra

10
10
15
1

Chúng tôi sẽ không nhận được các phần tử được sắp xếp bằng cách in PriorityQueue

Java




10
10
15
45

10
10
15
1

10
10
15
97
10
10
15
0

10
10
15
97
10
10
15
950

10
10
15
4

10
10
15
8
10
10
15
2
10
10
15
3

10
10
15
4

10
10
15
7
10
10
15
8
10
10
15
9
10
10
15
10
10
10
15
11

10
10
15
7____113

10
10
15
14
10
10
15
28
10
10
15
18
10
10
15
966

10
10
15
4

10
10
15
14
10
10
15
979
10
10
15
34
10
10
15
36

10
10
15
14
10
10
15
979
10
10
15
38
10
10
15
36

10
10
15
14
10
10
15
979
10
10
15
34
10
10
15
36

10
10
15
4

10
10
15
14
10
10
15
05

10
10
15
7____543

10
10
15
43

Đầu ra

10
10
15
3

2. Loại bỏ các yếu tố. Để xóa một phần tử khỏi hàng đợi ưu tiên, chúng ta có thể sử dụng phương thức remove[]. Nếu có nhiều đối tượng như vậy, thì lần xuất hiện đầu tiên của đối tượng sẽ bị xóa. Ngoài ra, phương thức poll[] cũng được sử dụng để loại bỏ phần đầu và trả về

Java




10
10
15
50

10
10
15
51

10
10
15
1

10
10
15
97
10
10
15
0

10
10
15
97
10
10
15
950

10
10
15
1

10
10
15
8
10
10
15
2
10
10
15
3

10
10
15
1

10
10
15
7
10
10
15
8
10
10
15
9
10
10
15
10
10
10
15
11

10
10
15
7____113

10
10
15
14
10
10
15
28
10
10
15
18
10
10
15
966

10
10
15
1

10
10
15
14
10
10
15
979
10
10
15
34
10
10
15
36

10
10
15
14
10
10
15
979
10
10
15
38
10
10
15
36

10
10
15
14
10
10
15
979
10
10
15
34
10
10
15
36

10
10
15
1

10
10
15
14
10
10
15
88
10
10
15
89
10
10
15
90

10
10
15
1

10
10
15
92____193

10
10
15
14
10
10
15
95______134
10
10
15
36

10
10
15
1

10
10
15
14
10
10
15
88
10
10
15
101
10
10
15
90

10
10
15
1

10
10
15
14
10
10
15
88
10
10
15
106
10
10
15
107

10
10
15
1

10
10
15
14
10
10
15
88
10
10
15
111
10
10
15
90

10
10
15
7____543

10
10
15
43

Đầu ra

10
10
15
4

3. Truy cập các phần tử. Vì hàng đợi tuân theo nguyên tắc Nhập trước xuất trước, nên chúng tôi chỉ có thể truy cập phần đầu của hàng đợi. Để truy cập các phần tử từ hàng đợi ưu tiên, chúng ta có thể sử dụng phương thức peek[].
 

Java




10
10
15
116

10
10
15
51

10
10
15
97
10
10
15
0

10
10
15
1

10
10
15
2
10
10
15
3

10
10
15
4

10
10
15
5
10
10
15
6

10
10
15
7
10
10
15
8
10
10
15
9
10
10
15
10
10
10
15
130

10
10
15
7____113

10
10
15
1

10
10
15
14
10
10
15
135

10
10
15
14
10
10
15
28
10
10
15
18
10
10
15
966

10
10
15
14
10
10
15
979
10
10
15
34
10
10
15
36

10
10
15
14
10
10
15
979
10
10
15
38
10
10
15
36

10
10
15
14
10
10
15
979
10
10
15
34
10
10
15
36

10
10
15
14
10
10
15
88
10
10
15
154
10
10
15
90

10
10
15
1

10
10
15
14
10
10
15
158

10
10
15
14
10
10
15
160

10
10
15
14
10
10
15
88
10
10
15
163
10
10
15
164

10
10
15
7____543

10
10
15
43

Đầu ra

10
10
15
3

4. Lặp lại PriorityQueue. Có nhiều cách để lặp qua PriorityQueue. Cách nổi tiếng nhất là chuyển đổi hàng đợi thành mảng và duyệt qua vòng lặp for. Tuy nhiên, hàng đợi cũng có một trình vòng lặp sẵn có có thể được sử dụng để lặp qua hàng đợi

Java




10
10
15
168

10
10
15
169

10
10
15
1

10
10
15
97
10
10
15
0

10
10
15
1

10
10
15
8
10
10
15
2
10
10
15
3

10
10
15
1

10
10
15
5
10
10
15
6

10
10
15
7
10
10
15
8
10
10
15
9
10
10
15
10
10
10
15
11

10
10
15
7____113

10
10
15
14
10
10
15
28
10
10
15
18
10
10
15
966

10
10
15
1

10
10
15
14
10
10
15
979
10
10
15
34
10
10
15
36

10
10
15
14
10
10
15
979
10
10
15
38
10
10
15
36

10
10
15
14
10
10
15
979
10
10
15
34
10
10
15
36

10
10
15
1

10
10
15
14
10
10
15
306

10
10
15
1

10
10
15
14
10
10
15
309
10
10
15
310

10
10
15
976
10
10
15
312
10
10
15
313
10
10
15
36

10
10
15
14
10
10
15
43

10
10
15
7____543

10
10
15
43

Đầu ra

10
10
15
4

Các phương thức trong lớp PriorityQueue

METHODDESCRIPTIONadd[E e]Inserts the specified element into this priority queue.clear[]Removes all of the elements from this priority queue.comparator[]Returns the comparator used to order the elements in this queue, or null if this queue is sorted according to the natural ordering of its elements.contains​[Object o]Returns true if this queue contains the specified element.forEach​[Consumer c]Removes all of this collection’s elements that are also contained in the specified collection [optional operation].removeIf​[Predicate c]Retains only the elements in this collection that are contained in the specified collection [optional operation].spliterator[]Creates a late-binding and fail-fast Spliterator over the elements in this queue. toArray[]Returns an array containing all of the elements in this queue. toArray​[T[] a]Returns an array containing all of the elements in this queue; the runtime type of the returned array is that of the specified array.

Các phương thức được khai báo trong lớp java. sử dụng. Trừu TượngHàng Đợi

METHODDESCRIPTIONaddAll[Collection c]Returns true if this collection contains all of the elements in the specified collection.isEmpty[]Returns true if this collection contains no elements.toString[]Returns a string representation of this collection.

Các phương thức được khai báo trong giao diện java. sử dụng. thu thập

METHODDESCRIPTIONcontainsAll[Collection c]Returns true if this collection contains all of the elements in the specified collection.equals[Object o]Compares the specified object with this collection for equality.hashCode[]Returns the hash code value for this collection.isEmpty[]Returns true if this collection contains no elements.parallelStream[]Returns a possibly parallel Stream with this collection as its source.size[]Returns the number of elements in this collection.stream[]Returns a sequential Stream with this collection as its source.toArray[IntFunction generator]Returns an array containing all of the elements in this collection, using the provided generator function to allocate the returned array.

Các phương thức được khai báo trong giao diện java. sử dụng. Xếp hàng

METHODDESCRIPTIONpeek[] Truy xuất nhưng không xóa phần đầu của hàng đợi này hoặc trả về null nếu hàng đợi này trống. poll[] Truy xuất và xóa phần đầu của hàng đợi này hoặc trả về null nếu hàng đợi này trống

Các ứng dụng.  

  • Thực hiện thuật toán Dijkstra và Prim
  • Tối đa hóa tổng mảng sau K phủ định

Những bài viết liên quan.  

  • Java. sử dụng. Lớp PriorityQueue trong Java
  • Triển khai PriorityQueue thông qua Bộ so sánh trong Java

Bài viết này được đóng góp bởi Mehak Kumar. Vui lòng viết nhận xét nếu bạn thấy bất cứ điều gì không chính xác hoặc nếu bạn muốn chia sẻ thêm thông tin về chủ đề đã thảo luận ở trên

Hàng đợi ưu tiên có được sắp xếp tự động không?

Nếu tập hợp được chỉ định là một thể hiện của SortedSet hoặc là một PriorityQueue khác, thì hàng đợi ưu tiên sẽ được sắp xếp theo cùng một bộ so sánh hoặc theo thứ tự tự nhiên của các phần tử nếu tập hợp được sắp xếp theo thứ tự tự nhiên của các phần tử của nó

Hàng đợi ưu tiên của Python sắp xếp như thế nào?

Vì 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ủa Python được xây dựng trên mô-đun heapq, về cơ bản là một đống nhị phân.

Là một hàng đợi ưu tiên chỉ là một danh sách được sắp xếp?

Lớp hàng đợi ưu tiên được sắp xếp triển khai danh sách được sắp xếp để theo dõi các mục trong hàng đợi ưu tiên. Lớp này thực hiện sắp xếp chèn cho mỗi thao tác thêm để giữ mức tối thiểu ở đầu danh sách.

Hàng đợi ưu tiên có được sắp xếp không?

Các phần tử của Hàng đợi ưu tiên được sắp xếp theo thứ tự tự nhiên trừ khi chúng tôi cung cấp Bộ so sánh trong khi tạo . Các phần tử được sắp xếp theo thứ tự tăng dần theo mặc định, do đó phần đầu của hàng đợi là phần tử có mức ưu tiên thấp nhất.

Chủ Đề