Bölüm 8: Öncelik Kuyruğu ve Heap

Tam ikili ağaç üzerinde hızlı en büyük/en küçük
ÖncelikHeap özelliğiDizi gösterimiEklemeSilmeHeap sort
C ile Veri Yapıları · İki ciltlik ders notları temel alınmıştır

Hazırlık

Başlamadan Önce

C ön bilgisi

Dizi, gösterge, struct, fonksiyon ve dinamik bellek temellerini hatırla.

İlk kavram

Öncelik ve Heap özelliği

Bu bölümün hedefi

Maksimum ve minimum heap düzenini tanımlamak.

Başlangıç sorusu

Heap'te kök neyi garanti eder?

Giriş

Öğrenme Çıktıları

Heap özelliğini açıklamak

Maksimum ve minimum heap düzenini tanımlamak.

İndisleri bulmak

Baba ve çocuk konumlarını dizi indislerinden hesaplamak.

Düzeni onarmak

Yukarı ve aşağı süzme adımlarını uygulamak.

Kullanım seçmek

Ö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.

Maksimum heap

Her baba çocuklarından büyük veya eşittir.

Minimum heap

Her baba çocuklarından küçük veya eşittir.

Kök erişimi

En büyük/en küçük öğe O(1).

Şekil kuralı

Ağaç tamdır; son düzey soldan sağa dolar.

Temel Kavramlar

Kavram Haritası

1Öncelik
2Heap özelliği
3Dizi gösterimi
4Ekleme
5Silme
6Heap sort
Heap, en öncelikli öğeyi kökte tutan tam ikili ağaçtır; bütün dizinin sıralı olması gerekmez.

Gösterim

Dizi ve ağaç aynı yapıyı gösterir

090170260320450510
Baba(i-1)/2
Sol çocuk2i+1
Sağ çocuk2i+2

C 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)
Tür tanımı veri yapısının bellekteki biçimini; yordamlar ise bu yapı üzerindeki davranışı kurar.

C ile Gerçekleştirim

C'de Bellek ve Sahiplik

Sahip kim?

Ayrılan belleği hangi yapı veya yordamın bırakacağını baştan belirle.

Yaşam süresi

Yerel değişken adresini fonksiyon dışına taşırma; dinamik belleği gerektiği kadar yaşat.

Sınırlar

Boyut, kapasite ve geçerli indisleri her işlemde koru.

Boş durum

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;
    }
}
Kod örnekleri C99/C11 uyumlu olacak biçimde küçük ve tek sorumluluklu tutulmuştur.

Temel İşlemler

Kodu Okurken

Ön koşul

Heap'te kök neyi garanti eder?

Değişmez

Her adımda maksimum heap kuralı korunuyor mu?

Son koşul

Baba ve çocuk konumlarını dizi indislerinden hesaplamak.

Hata yolu

0 tabanlı ve 1 tabanlı indis formüllerini karıştırmak

Adım Adım

Heap'e 80 ekle

Sona koy

[90, 70, 60, 20, 50, 10, 80]

Babayla karşılaştır

80'in babası indis 2'deki 60'tır.

Takas

80 > 60 olduğu için yer değiştir: [90,70,80,20,50,10,60].

Dur

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

İşlemZamanEk bellek
En büyük/en küçük erişimiO(1)O(1)
EklemeO(log n)O(1)
Kökü silmeO(log n)O(1)
Heap kurmaO(n)O(1)
Heap sortO(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?

Heap

Sık sık en büyük/en küçük öğe alınacaksa.

Sıralı dizi

Okuma çok, güncelleme az ve tüm sıra gerektiğinde.

Sırasız dizi

Ekleme çok hızlı; en iyi öğeyi bulma seyrekse.

Dengeli arama ağacı

Hem uçlara hem sıralı dolaşıma ihtiyaç varsa.

Dikkat

Sık Yapılan Hatalar

1Heap'i tamamen sıralı dizi sanmak
20 tabanlı ve 1 tabanlı indis formüllerini karıştırmak
3Silmede son öğeyi köke taşımadan boşluk bırakmak
4Süzme sırasında en uygun çocuğu seçmemek

Alıştırmalar

Kendini Sına

  1. Heap'te kök neyi garanti eder?
  2. i indisinin sol çocuğu nedir?
  3. Ekleme neden O(log n)'dir?
  4. Heap kurma neden tek tek eklemeden daha hızlı olabilir?
  5. Öncelik kuyruğu normal kuyruktan nasıl ayrılır?
Cevapları göster
  1. Maksimum heap'te en büyük, minimum heap'te en küçük öğeyi.
  2. 0 tabanlı dizide 2i+1.
  3. En fazla ağacın yüksekliği kadar yukarı çıkılır.
  4. Aşağıdan heapify toplamda O(n) çalışır.
  5. Çıkarma sırasını geliş zamanı yerine öncelik belirler.

Uygulama

Mini Laboratuvar

1 · Çiz

Heap'te kök neyi garanti eder?

2 · Kodla

Ekleme neden O(log n)'dir?

3 · Ölç

Öncelik kuyruğu normal kuyruktan nasıl ayrılır?

Teslim: küçük bir C modülü, üç uç test ve zaman/bellek karmaşıklığı tablosu.

Özet

Bölüm Özeti

Kök garantisi

En öncelikli öğe hemen erişilir.

Tam ağaç

Dizi gösterimi boşluksuz ve verimlidir.

Logaritmik güncelleme

Süzme yalnız bir kök-yaprak yolu izler.

Özet

Kaynaklar ve Devam

Son

Bölüm 8: Öncelik Kuyruğu ve Heap
Ders planına dön
1 / 1 C ile Veri Yapıları

← → veya boşluk ile gezinin · F: tam ekran · Home/End: ilk/son slayt