PriorityQueue untuk Pemrosesan Terurut
Gunakan PriorityQueue dengan urutan alami dan comparator kustom untuk skenario penjadwalan tugas.
PriorityQueue untuk Pemrosesan Terurut adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
Apa itu PriorityQueue?
PriorityQueue secara bawaan merupakan heap minimum: elemen dengan urutan alami terendah selalu berada di bagian depan. Elemen tidak diurutkan secara internal—hanya elemen minimum yang dijamin berada di bagian depan.
import java.util.PriorityQueue;
PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(30);
pq.offer(10);
pq.offer(20);
System.out.println(pq.poll()); // 10 (min)
System.out.println(pq.poll()); // 20
System.out.println(pq.poll()); // 30Struktur Heap Internal
PriorityQueue menggunakan heap minimum biner yang disimpan dalam array. Induk pada indeks i selalu ≤ anak-anaknya pada 2i+1 dan 2i+2. Hal ini menjamin offer/poll dengan kompleksitas O(log n) dan peek dengan kompleksitas O(1).
Heap Maksimum dengan Comparator Terbalik
Untuk membuat heap maksimum (elemen terbesar berada di urutan pertama), teruskan Comparator.reverseOrder():
PriorityQueue<Integer> maxPQ = new PriorityQueue<>(Comparator.reverseOrder());
maxPQ.offer(10);
maxPQ.offer(50);
maxPQ.offer(30);
System.out.println(maxPQ.poll()); // 50 (max)
System.out.println(maxPQ.poll()); // 30PriorityQueue dengan Objek Khusus
Gunakan comparator untuk mengurutkan record atau class khusus:
record Job(String name, int priority) {}
PriorityQueue<Job> queue = new PriorityQueue<>(
Comparator.comparingInt(Job::priority) // ascending priority
);
queue.offer(new Job("Backup", 5));
queue.offer(new Job("Alert", 1));
queue.offer(new Job("Report", 3));
System.out.println(queue.poll().name()); // Alert (priority 1)Peek vs Poll
peek() mengembalikan elemen terdepan tanpa menghapusnya. poll() menghapus dan mengembalikannya. Keduanya mengembalikan null pada antrean kosong (berbeda dengan element()/remove() yang menimbulkan pengecualian).
PriorityQueue<String> pq = new PriorityQueue<>();
pq.offer("banana");
pq.offer("apple");
System.out.println(pq.peek()); // apple (not removed)
System.out.println(pq.peek()); // apple (still there)
System.out.println(pq.poll()); // apple (removed)
System.out.println(pq.peek()); // bananaContoh Penjadwalan Tugas
PriorityQueue ideal untuk simulasi penjadwalan CPU ketika tugas memiliki prioritas yang berbeda:
record Task(String name, int priority) {}
PriorityQueue<Task> scheduler = new PriorityQueue<>(
Comparator.comparingInt(Task::priority).reversed() // highest first
);
scheduler.offer(new Task("Low", 1));
scheduler.offer(new Task("Critical", 10));
scheduler.offer(new Task("Normal", 5));
while (!scheduler.isEmpty()) {
System.out.println("Processing: " + scheduler.poll().name());
}
// Critical, Normal, LowK Elemen Terkecil
PriorityQueue adalah alat klasik untuk menemukan K elemen terkecil tanpa mengurutkan seluruh array:
int[] nums = {7, 2, 5, 1, 9, 3, 8};
int k = 3;
PriorityQueue<Integer> pq = new PriorityQueue<>();
for (int n : nums) pq.offer(n);
for (int i = 0; i < k; i++) {
System.out.print(pq.poll() + " ");
}
// 1 2 3K Elemen Terbesar dengan Heap Maksimum
Sebagai alternatif, pertahankan heap minimum berukuran K saat melakukan iterasi untuk menemukan K elemen terbesar:
int[] nums = {7, 2, 5, 1, 9, 3, 8};
int k = 3;
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
for (int n : nums) {
minHeap.offer(n);
if (minHeap.size() > k) minHeap.poll(); // remove smallest
}
// minHeap now contains the 3 largest: [7, 8, 9]
System.out.println(minHeap); // order may varyPola Algoritma Dijkstra
Algoritma jalur terpendek Dijkstra mengandalkan heap minimum untuk selalu memperluas node yang belum dikunjungi dengan biaya paling rendah terlebih dahulu:
record Entry(int node, int cost) {}
PriorityQueue<Entry> pq = new PriorityQueue<>(
Comparator.comparingInt(Entry::cost)
);
pq.offer(new Entry(0, 0)); // start node, cost 0
while (!pq.isEmpty()) {
Entry curr = pq.poll();
System.out.println("Visit node " + curr.node() + " cost=" + curr.cost());
// expand neighbors...
}Iterasi Tidak Berurutan
Melakukan iterasi pada PriorityQueue TIDAK mengembalikan elemen dalam urutan prioritas—hanya poll() yang melakukannya. Untuk memperoleh keluaran yang terurut, lakukan poll berulang kali, bukan menggunakan perulangan untuk setiap elemen.
PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.addAll(List.of(5,3,1,4,2));
// WRONG for sorted output:
for (int n : pq) System.out.print(n+" "); // unordered!
// CORRECT:
while (!pq.isEmpty()) System.out.print(pq.poll()+" "); // 1 2 3 4 5Ringkasan Kinerja
Kompleksitas operasi PriorityQueue:
- offer(e): O(log n)
- poll(): O(log n)
- peek(): O(1)
- contains(e): O(n)
- remove(e): O(n)
Tidak aman untuk thread—gunakan PriorityBlockingQueue untuk akses bersamaan.
Pemeriksaan Singkat
Apa yang dijamin mengenai urutan elemen saat melakukan iterasi pada PriorityQueue dengan perulangan untuk setiap elemen?
Ringkasan: PriorityQueue
Inti penting:
- PriorityQueue adalah heap minimum: elemen terkecil diambil terlebih dahulu
- Gunakan Comparator.reverseOrder() untuk heap maksimum
- offer/poll memiliki kompleksitas O(log n), sedangkan peek memiliki kompleksitas O(1)
- Kasus penggunaan klasik: elemen terbesar/terkecil ke-K, Dijkstra, dan penjadwalan tugas
- Perulangan untuk setiap elemen tidak menghasilkan urutan prioritas—gunakan poll()
Pertanyaan yang Sering Diajukan
Apakah pelajaran “PriorityQueue untuk Pemrosesan Terurut” gratis?
Ya — teks lengkap “PriorityQueue untuk Pemrosesan Terurut” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “PriorityQueue untuk Pemrosesan Terurut”?
Gunakan PriorityQueue dengan urutan alami dan comparator kustom untuk skenario penjadwalan tugas. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “PriorityQueue untuk Pemrosesan Terurut” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Struktur Internal LinkedList
- Operasi Deque: Stack dan Queue
- Perbandingan LinkedList dan ArrayList
- PriorityQueue untuk Pemrosesan Terurut