Sıralı İşleme için PriorityQueue
Görev zamanlama senaryolarında doğal sıralama ve özel karşılaştırıcılarla PriorityQueue kullanın.
Sıralı İşleme için PriorityQueue, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
PriorityQueue nedir?
Bir PriorityQueue, varsayılan olarak bir minimum yığınıdır: doğal sıralamadaki en küçük öğe her zaman başta bulunur. Öğeler içeride sıralanmaz; yalnızca minimum öğenin önde olması garanti edilir.
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()); // 30Yığının İç Yapısı
PriorityQueue, bir dizide saklanan ikili bir minimum yığını kullanır. i dizinindeki üst öğe, 2i+1 ve 2i+2 dizinlerindeki alt öğelerden her zaman küçüktür veya onlara eşittir. Bu yapı, offer/poll işlemlerinin O(log n), peek işleminin ise O(1) olmasını garanti eder.
Ters Karşılaştırıcıyla Maksimum Yığını
Bir maksimum yığını oluşturmak için (en büyük öğe önce gelecek şekilde) Comparator.reverseOrder() geçirin:
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()); // 30Özel Nesnelerle PriorityQueue
Özel kayıtları veya sınıfları sıralamak için bir comparator kullanın:
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 ve Poll Karşılaştırması
peek(), baştaki öğeyi kaldırmadan döndürür. poll() ise öğeyi kaldırır ve döndürür. Boş bir kuyrukta her ikisi de null döndürür; element()/remove() ise hata fırlatır.
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()); // bananaGörev Planlama Örneği
PriorityQueue, görevlerin farklı önceliklere sahip olduğu CPU planlama benzetimleri için idealdir:
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, LowEn Küçük K Öğeyi Bulma
PriorityQueue, diziyi tamamen sıralamadan en küçük K öğeyi bulmak için kullanılan klasik bir araçtır:
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 3Maksimum Yığınıyla En Büyük K Öğeyi Bulma
Alternatif olarak, en büyük K öğeyi bulmak için yineleme sırasında K boyutunda bir minimum yığını koruyabilirsiniz:
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 varyDijkstra Algoritması Kalıbı
Dijkstra'nın en kısa yol algoritması, ziyaret edilmemiş en ucuz düğümü her zaman önce genişletmek için bir minimum yığını kullanır:
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...
}Yineleme Sırasızdır
Bir PriorityQueue üzerinde yineleme yapmak, öğeleri öncelik sırasına göre döndürmez; bunu yalnızca poll() yapar. Sıralı çıktı için for-each kullanmak yerine art arda poll çağrısı yapın.
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 5Performans Özeti
PriorityQueue işlem karmaşıklığı:
- offer(e): O(log n)
- poll(): O(log n)
- peek(): O(1)
- contains(e): O(n)
- remove(e): O(n)
İş parçacığı açısından güvenli değildir; eşzamanlı erişim için PriorityBlockingQueue kullanın.
Hızlı Kontrol
Bir PriorityQueue üzerinde for-each döngüsüyle yineleme yapıldığında öğelerin sırası hakkında ne garanti edilir?
Özet: PriorityQueue
Temel çıkarımlar:
- PriorityQueue bir minimum yığınıdır: en küçük öğe ilk olarak poll edilir
- Maksimum yığını için Comparator.reverseOrder() kullanın
- offer/poll işlemleri O(log n), peek işlemi O(1) sürede gerçekleşir
- Klasik kullanım alanları: K'inci en büyük/en küçük öğe, Dijkstra, görev planlama
- for-each öncelik sırasını vermez; poll() kullanın
Sıkça Sorulan Sorular
“Sıralı İşleme için PriorityQueue” dersi ücretsiz mi?
Evet — “Sıralı İşleme için PriorityQueue” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Sıralı İşleme için PriorityQueue” dersinde ne öğreneceğim?
Görev zamanlama senaryolarında doğal sıralama ve özel karşılaştırıcılarla PriorityQueue kullanın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Sıralı İşleme için PriorityQueue” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- LinkedList'in İç Yapısı
- Deque İşlemleri: Yığın ve Kuyruk
- LinkedList ve ArrayList Karşılaştırması
- Sıralı İşleme için PriorityQueue