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 1575], 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 1576,
10 10 1577,
10 10 1578, và
10 10 1579 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 1580 và
10 10 1581. Iterator được cung cấp trong phương thức
10 10 1582 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 15830
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 15831 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 15832 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 15833,
10 10 1576,
10 10 15835 và
10 10 15836];
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 1595
10 10 1596
10 10 1597
10 10 150
10 10 151
10 10 152
10 10 153
10 10 154
10 10 155
10 10 156
10 10 157
10 10 158
10 10 159
10 10 1510
10 10 1511
10 10 157____113
10 10 1514
10 10 1515
10 10 1514
10 10 1517
10 10 1518
10 10 1519
10 10 151
10 10 1514
10 10 1532
10 10 1514
10 10 1534
10 10 1535
10 10 1536
10 10 1514
10 10 1534
10 10 1539
10 10 1536
10 10 1514
10 10 1534____343
10 10 1536
10 10 151
10 10 1514
10 10 1547
10 10 1514
10 10 1549
10 10 151
10 10 1514
10 10 1532
10 10 1514
10 10 1534
10 10 1514
10 10 1536
10 10 151
10 10 1514
10 10 1539
10 10 1514
10 10 1549
10 10 157____543
10 10 1543
Đầ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 1545
10 10 151
10 10 1597
10 10 150
10 10 1597
10 10 15950
10 10 154
10 10 158
10 10 152
10 10 153
10 10 154
10 10 157
10 10 158
10 10 159
10 10 1510
10 10 1511
10 10 157____113
10 10 1514
10 10 15964
10 10 1518
10 10 15966
10 10 1514
10 10 15968
10 10 15969
10 10 15970
10 10 15971
10 10 15972
10 10 15973
10 10 15974
10 10 15975
10 10 15976
10 10 15977
10 10 15976
10 10 15979____100
10 10 1536
10 10 1514
10 10 1543
10 10 1514
10 10 1505
10 10 157____543
10 10 1543
Đầu ra
10 10 151
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 1545
10 10 151
10 10 1597
10 10 150
10 10 1597
10 10 15950
10 10 154
10 10 158
10 10 152
10 10 153
10 10 154
10 10 157
10 10 158
10 10 159
10 10 1510
10 10 1511
10 10 157____113
10 10 1514
10 10 1528
10 10 1518
10 10 15966
10 10 154
10 10 1514
10 10 15979
10 10 1534
10 10 1536
10 10 1514
10 10 15979
10 10 1538
10 10 1536
10 10 1514
10 10 15979
10 10 1534
10 10 1536
10 10 154
10 10 1514
10 10 1505
10 10 157____543
10 10 1543
Đầu ra
10 10 153
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 1550
10 10 1551
10 10 151
10 10 1597
10 10 150
10 10 1597
10 10 15950
10 10 151
10 10 158
10 10 152
10 10 153
10 10 151
10 10 157
10 10 158
10 10 159
10 10 1510
10 10 1511
10 10 157____113
10 10 1514
10 10 1528
10 10 1518
10 10 15966
10 10 151
10 10 1514
10 10 15979
10 10 1534
10 10 1536
10 10 1514
10 10 15979
10 10 1538
10 10 1536
10 10 1514
10 10 15979
10 10 1534
10 10 1536
10 10 151
10 10 1514
10 10 1588
10 10 1589
10 10 1590
10 10 151
10 10 1592____193
10 10 1514
10 10 1595______134
10 10 1536
10 10 151
10 10 1514
10 10 1588
10 10 15101
10 10 1590
10 10 151
10 10 1514
10 10 1588
10 10 15106
10 10 15107
10 10 151
10 10 1514
10 10 1588
10 10 15111
10 10 1590
10 10 157____543
10 10 1543
Đầu ra
10 10 154
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 15116
10 10 1551
10 10 1597
10 10 150
10 10 151
10 10 152
10 10 153
10 10 154
10 10 155
10 10 156
10 10 157
10 10 158
10 10 159
10 10 1510
10 10 15130
10 10 157____113
10 10 151
10 10 1514
10 10 15135
10 10 1514
10 10 1528
10 10 1518
10 10 15966
10 10 1514
10 10 15979
10 10 1534
10 10 1536
10 10 1514
10 10 15979
10 10 1538
10 10 1536
10 10 1514
10 10 15979
10 10 1534
10 10 1536
10 10 1514
10 10 1588
10 10 15154
10 10 1590
10 10 151
10 10 1514
10 10 15158
10 10 1514
10 10 15160
10 10 1514
10 10 1588
10 10 15163
10 10 15164
10 10 157____543
10 10 1543
Đầu ra
10 10 153
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 15168
10 10 15169
10 10 151
10 10 1597
10 10 150
10 10 151
10 10 158
10 10 152
10 10 153
10 10 151
10 10 155
10 10 156
10 10 157
10 10 158
10 10 159
10 10 1510
10 10 1511
10 10 157____113
10 10 1514
10 10 1528
10 10 1518
10 10 15966
10 10 151
10 10 1514
10 10 15979
10 10 1534
10 10 1536
10 10 1514
10 10 15979
10 10 1538
10 10 1536
10 10 1514
10 10 15979
10 10 1534
10 10 1536
10 10 151
10 10 1514
10 10 15306
10 10 151
10 10 1514
10 10 15309
10 10 15310
10 10 15976
10 10 15312
10 10 15313
10 10 1536
10 10 1514
10 10 1543
10 10 157____543
10 10 1543
Đầu ra
10 10 154
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ốngCá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