Bölüm 8: Öncelik Kuyruğu ve Heap
Hazırlık
Başlamadan Önce
Dizi, gösterge, struct, fonksiyon ve dinamik bellek temellerini hatırla.
Öncelik ve Heap özelliği
Maksimum ve minimum heap düzenini tanımlamak.
Heap'te kök neyi garanti eder?
Giriş
Öğrenme Çıktıları
Maksimum ve minimum heap düzenini tanımlamak.
Baba ve çocuk konumlarını dizi indislerinden hesaplamak.
Yukarı ve aşağı süzme adımlarını uygulamak.
Öncelik kuyruğu ile normal kuyruk arasındaki farkı açıklamak.
Temel Kavramlar
Öncelik kuyruğu geliş sırasına değil anahtara bakar
Heap, en öncelikli öğeyi kökte tutan tam ikili ağaçtır; bütün dizinin sıralı olması gerekmez.
Her baba çocuklarından büyük veya eşittir.
Her baba çocuklarından küçük veya eşittir.
En büyük/en küçük öğe O(1).
Ağaç tamdır; son düzey soldan sağa dolar.
Temel Kavramlar
Kavram Haritası
Gösterim
Dizi ve ağaç aynı yapıyı gösterir
(i-1)/22i+12i+2C ile Gerçekleştirim
Maksimum heap
typedef struct {
int *veri;
size_t adet;
size_t kapasite;
} MaxHeap;
#define BABA(i) (((i) - 1) / 2)
#define SOL(i) (2 * (i) + 1)
#define SAG(i) (2 * (i) + 2)C ile Gerçekleştirim
C'de Bellek ve Sahiplik
Ayrılan belleği hangi yapı veya yordamın bırakacağını baştan belirle.
Yerel değişken adresini fonksiyon dışına taşırma; dinamik belleği gerektiği kadar yaşat.
Boyut, kapasite ve geçerli indisleri her işlemde koru.
NULL, boş yapı ve tek öğe durumlarını özellikle heap'i tamamen sıralı dizi sanmak riskiyle birlikte test et.
Temel İşlemler
Eklemede yukarı süzme
void yukari_suz(MaxHeap *h, size_t i) {
while (i > 0) {
size_t p = BABA(i);
if (h->veri[p] >= h->veri[i]) break;
takas(&h->veri[p], &h->veri[i]);
i = p;
}
}Temel İşlemler
Kodu Okurken
Heap'te kök neyi garanti eder?
Her adımda maksimum heap kuralı korunuyor mu?
Baba ve çocuk konumlarını dizi indislerinden hesaplamak.
0 tabanlı ve 1 tabanlı indis formüllerini karıştırmak
Adım Adım
Heap'e 80 ekle
[90, 70, 60, 20, 50, 10, 80]
80'in babası indis 2'deki 60'tır.
80 > 60 olduğu için yer değiştir: [90,70,80,20,50,10,60].
Yeni baba 90; 90 ≥ 80, heap özelliği sağlandı.
Sınıf Notu
Dersten Sesler
“Beş farklı yaklaşımı hiç kod yazmadan, tuşlara dokunmadan analiz ediyorum. Önce maliyet tablosu!”
“O aşağı in, yukarı çık yapılan yapıya ne gerek var? Bir görelim; hem ekleme hem silme O(log n).”
Notlardaki sınıf içi anlatımdan, yazım ve uzunluk bakımından sunuma uyarlanmıştır.
Analiz
Karmaşıklık Özeti
| İşlem | Zaman | Ek bellek |
|---|---|---|
| En büyük/en küçük erişimi | O(1) | O(1) |
| Ekleme | O(log n) | O(1) |
| Kökü silme | O(log n) | O(1) |
| Heap kurma | O(n) | O(1) |
| Heap sort | O(n log n) | O(1) |
n: öğe sayısı · h: yükseklik · V: düğüm sayısı · E: kenar sayısı
Tasarım Kararı
Hangi Durumda Hangisi?
Sık sık en büyük/en küçük öğe alınacaksa.
Okuma çok, güncelleme az ve tüm sıra gerektiğinde.
Ekleme çok hızlı; en iyi öğeyi bulma seyrekse.
Hem uçlara hem sıralı dolaşıma ihtiyaç varsa.
Dikkat
Sık Yapılan Hatalar
Alıştırmalar
Kendini Sına
- Heap'te kök neyi garanti eder?
- i indisinin sol çocuğu nedir?
- Ekleme neden O(log n)'dir?
- Heap kurma neden tek tek eklemeden daha hızlı olabilir?
- Öncelik kuyruğu normal kuyruktan nasıl ayrılır?
Cevapları göster
- Maksimum heap'te en büyük, minimum heap'te en küçük öğeyi.
- 0 tabanlı dizide 2i+1.
- En fazla ağacın yüksekliği kadar yukarı çıkılır.
- Aşağıdan heapify toplamda O(n) çalışır.
- Çıkarma sırasını geliş zamanı yerine öncelik belirler.
Uygulama
Mini Laboratuvar
Heap'te kök neyi garanti eder?
Ekleme neden O(log n)'dir?
Öncelik kuyruğu normal kuyruktan nasıl ayrılır?
Özet
Bölüm Özeti
En öncelikli öğe hemen erişilir.
Dizi gösterimi boşluksuz ve verimlidir.
Süzme yalnız bir kök-yaprak yolu izler.
Özet
Kaynaklar ve Devam
- Veri Yapıları ve Algoritmalar 2, PDF s. 28-32 ve sıralama bölümü
- Horowitz, Sahni ve Anderson-Freed, Fundamentals of Data Structures in C.
- Kernighan ve Ritchie, The C Programming Language.