Menu
Coddy logo textTech

Heap (İkili Yığın)

Son güncelleme

İkili yığın, en küçük (min-heap) veya en büyük (max-heap) değeri kökte tutan tam bir ikili ağaçtır. Bu görselleştirme bir min-heap'tir: her ebeveyn, çocuklarından küçük veya onlara eşittir. Bir değer eklemek için onu bir sonraki boş yuvaya koyar, ardından ebeveyninden küçük olduğu sürece onunla yer değiştirerek "yukarı süzersiniz", ta ki yığın özelliği yeniden sağlanana kadar. Yukarıdaki oynat düğmesine basarak her yeni değerin yerine doğru nasıl yükseldiğini izleyin.

Yığın tam bir ağaç olduğundan bir dizide sıkışık biçimde saklanır: i düğümünün çocukları 2i+1 ve 2i+2 konumundadır. Ekleme ve minimumu çıkarma O(log n)'dir (kökten yaprağa bir yol), minimuma bakmak ise O(1)'dir - bu tam olarak bir öncelik kuyruğunun ihtiyaç duyduğu şeydir.

Zaman ve alan karmaşıklığı

İşlemKarmaşıklıkNotlar
Min/maks'a bakmaO(1)Her zaman köktür
Ekleme (push)O(log n)Bir yol boyunca yukarı süzme
Min/maks çıkarmaO(log n)Bir yol boyunca aşağı süzme
Yığını inşa etmeO(n)Hepsini bir kerede heapify
AlanO(n)Dizi tabanlı, işaretçi yok

Adım adım (push)

AdımNe olur
1Yeni değeri sona ekle (bir sonraki boş yaprak).
2Onu ebeveyniyle karşılaştır.
3Daha küçükse (min-heap), yukarı doğru yer değiştir.
4Ebeveyninden daha küçük olmayana veya köke ulaşana kadar tekrarla.

Çözümlü örnek

[5, 3, 8, 1, 4] değerlerini birer birer ekleyerek bir min-heap inşa etme:

PushSüzme sonrası diziEylem
5[5]İlk değer kök olur.
3[3, 5]3 < ebeveyn 5, bu yüzden köke kadar yükselir.
8[3, 5, 8]8 > ebeveyn 5, bu yüzden yaprak olarak kalır.
1[1, 3, 8, 5]1 < ebeveyn 5, yer değiştirir; sonra 1 < ebeveyn 3, köke kadar yükselir.
4[1, 3, 8, 5, 4]4 > ebeveyn 3, bu yüzden kalır; minimum 1 kökte kalır.

Heap ne zaman kullanılır

Şu durumda kullanınŞu durumda kaçının
Değişen bir kümeden tekrar tekrar en küçük veya en büyük öğeye ihtiyacınız olduğunda.Yalnızca uç değeri değil, keyfi değerleri aramanız gerektiğinde - bir BST veya hash kümesi kullanın.
Dijkstra, A* veya bir zamanlayıcı için öncelik kuyruğu uyguluyorsanız.Verileri her zaman tam sıralı tutmanız gerektiğinde.
Kompakt dizi düzeniyle O(log n) ekleme ve minimum çıkarma istediğinizde.Belirli bir (kök olmayan) öğeyi hızlıca arama veya silme gerektiğinde.
Bir öğe akışını birleştirip önceliğe göre çekmeniz gerektiğinde.Veri kümesi çok küçükse ve doğrusal tarama daha basit ve yeterince hızlıysa.

Heap (Priority Queue) kodu

Python, JavaScript, Java, C++, C dillerinde temiz ve çalıştırılabilir bir Heap (Priority Queue) uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.

Python ile Heap (Priority Queue) kodu

Python
1class MinHeap:2    def __init__(self):3        self.data = []4
5    def push(self, value):6        # Append at the end, then bubble up to restore order7        self.data.append(value)8        i = len(self.data) - 19        while i > 0:10            parent = (i - 1) // 211            if self.data[parent] <= self.data[i]:12                break13            self.data[i], self.data[parent] = self.data[parent], self.data[i]14            i = parent15
16    def pop(self):17        # Move the last leaf to the root, then sift it down18        top = self.data[0]19        last = self.data.pop()20        if self.data:21            self.data[0] = last22            self._sift_down(0)23        return top24
25    def _sift_down(self, i):26        n = len(self.data)27        while True:28            smallest = i29            left, right = 2 * i + 1, 2 * i + 230            if left < n and self.data[left] < self.data[smallest]:31                smallest = left32            if right < n and self.data[right] < self.data[smallest]:33                smallest = right34            if smallest == i:35                return36            self.data[i], self.data[smallest] = self.data[smallest], self.data[i]37            i = smallest38
39
40heap = MinHeap()41for value in [5, 3, 8, 1, 9, 2]:42    heap.push(value)43
44print("Heap array:     ", heap.data)45print("Popped in order:", [heap.pop() for _ in range(6)])
Bu kodu Python Playground'da çalıştır

Heap SSS

Heap ne için kullanılır?
Heap'ler, Dijkstra'nın en kısa yol algoritmasını, görev zamanlayıcılarını ve olay simülasyonlarını çalıştıran öncelik kuyruklarını uygular. Ayrıca heapsort'un arkasındaki motordur. Değişen bir kümeden tekrar tekrar en küçük veya en büyük öğeye ihtiyaç duyduğunuzda araç bir heap'tir.
Heap ile ikili arama ağacı arasındaki fark nedir?
Her ikisi de ikili ağaçtır, ancak bir BST tam bir soldan sağa sıralı düzen tutar (sıralı aramayı mümkün kılar), oysa bir heap yalnızca ebeveyn-çocuk ilişkisini garanti eder (kökte min veya maks). Bir heap uç değere O(1) erişim verir; bir BST herhangi bir değere O(log n) arama verir.
Bir heap neden dizide saklanır?
Bir heap her zaman tam bir ikili ağaç olduğundan, düğümleri dizi indekslerine kusursuzca eşlenir: i indeksinin çocukları 2i+1 ve 2i+2'de, ebeveyni (i-1)/2'dedir. Bu, çocuk işaretçilerini saklamayı önler ve mükemmel önbellek performansı sağlar.
Bir heap, sıralı bir diziyle aynı mıdır?
Hayır. Bir heap yalnızca her ebeveynin çocuklarından küçük (min-heap) veya büyük (max-heap) olduğunu garanti eder, bu yüzden kardeşler ve kuzenler belirli bir sırada değildir. Sıralı bir dizi tam olarak sıralıdır ancak eklemesi O(n) maliyetlidir, oysa bir heap O(log n)'de ekler ve yine de uç değere anında erişim verir.
Bir diziyi sadece sıralamak yerine ne zaman heap kullanmalıyım?
Veriler sürekli değişiyorsa ve yalnızca mevcut minimum veya maksimuma ihtiyacınız varsa bir heap'e yönelin - ekleme ve çıkarma her biri O(log n)'dir, tüm diziyi yeniden sıralamaya karşı. Statik bir veri kümeniz varsa ve tüm öğeleri sırayla istiyorsanız, tek bir O(n log n) sıralama daha basit ve genellikle daha hızlıdır.
n öğeden bir heap inşa etmek O(n log n) sürer mi?
Hepsini bir kerede inşa ederseniz sürmez. n öğeyi tek tek eklemek O(n log n)'dir, ancak son ebeveynden köke doğru aşağı süzen aşağıdan yukarıya heapify toplamda O(n) çalışır, çünkü çoğu düğüm en alta yakındır ve yalnızca kısa bir mesafe aşağı süzülür.
Coddy programming languages illustration

Coddy ile algoritmalarda ustalaş

BAŞLA