Python’ın heapq
modülü, oldukça verimli bir min-heap uygulaması sunar. Tanım gereği bir min-heap, en küçük elemanını kökte (0. indeks) tutar. Eleman ekleme (heappush
) ve çıkarma (heappop
) işlemleri yaygın olsa da, sıklıkla yığının yapısını değiştirmeden en küçük elemanı incelemeniz gerekecektir—bu işleme “gözetleme” diyoruz. Bu kılavuz, Python yığınının içine bakmak için en uygun ve alternatif yöntemleri ele almaktadır.
İçindekiler
- Min-Heap’leri Anlamak
- Verimli Gözetleme:
heap[0]
Yöntemi - Alternatif Gözetleme Yöntemleri
- Doğru Gözetleme Yöntemini Seçme
Min-Heap’leri Anlamak
Min-heap, her düğümün değerinin çocuklarının değerinden küçük veya eşit olduğu ağaç tabanlı bir veri yapısıdır. heapq
bunu, kökün (en küçük eleman) 0. indeksinde uygun bir şekilde bulunduğu bir liste olarak temsil eder. Temel heapq
fonksiyonları şunlardır:
heappush(heap, item)
: Yığın özelliğini koruyarak bir öğe ekler.heappop(heap)
: Yığın özelliğini koruyarak en küçük öğeyi kaldırır ve döndürür.heapify(x)
: Bir listeyi yerinde bir yığına dönüştürür.
Verimli Gözetleme: heap[0]
Yöntemi
Minimum değere bakmanın en verimli yolu, heap[0]
‘a doğrudan erişmektir. Bu, yığını değiştirmeden sabit zamanlı (O(1)) bir işlem sunan min-heap özelliğinden yararlanır.
import heapq
heap = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
heapq.heapify(heap)
enKucuk = heap[0]
print(f"En küçük eleman: {enKucuk}") # Çıktı: En küçük eleman: 1
print(f"Yığın değişmedi: {heap}") # Çıktı: Yığın değişmedi: [1, 3, 2, 4, 5, 9, 5, 6, 5, 3]
Alternatif Gözetleme Yöntemleri
Daha az verimli olsa da, belirli senaryolar için alternatif yöntemler mevcuttur:
heappop()
ve heappush()
kullanma: Bu yaklaşım, en küçük elemanı geçici olarak kaldırır ve ardından geri ekler. İlgili yığın yeniden yapılandırması nedeniyle önemli ölçüde daha yavaştır (O(log n)). Sadece minimum elemanı kaldırmakla gözetlemeyi birleştirmeniz gerekiyorsa bunu kullanın.
import heapq
heap = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
heapq.heapify(heap)
enKucuk = heapq.heappop(heap)
print(f"En küçük eleman: {enKucuk}") # Çıktı: En küçük eleman: 1
heapq.heappush(heap, enKucuk)
print(f"Yığın geri yüklendi: {heap}") # Çıktı: Yığın geri yüklendi: [1, 3, 2, 4, 5, 9, 5, 6, 5, 3]
nsmallest()
kullanma: heapq.nsmallest(n, iterable)
, n
en küçük elemanı döndürür. Sadece birini istemek (nsmallest(1, heap)
) gözetlemeyi sağlar. Bununla birlikte, tek elemanlı gözetleme için heap[0]
‘dan daha az verimlidir (birden çok en küçük elemanı almak için verimli olsa da).
import heapq
heap = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
heapq.heapify(heap)
enKucuk = heapq.nsmallest(1, heap)[0]
print(f"En küçük eleman: {enKucuk}") # Çıktı: En küçük eleman: 1
print(f"Yığın değişmedi: {heap}") # Çıktı: Yığın değişmedi: [1, 3, 2, 4, 5, 9, 5, 6, 5, 3]
Doğru Gözetleme Yöntemini Seçme
Basit gözetleme için, hızı ve basitliği nedeniyle heap[0]
‘a doğrudan erişim açık bir kazananıdır. Alternatif yöntemler yalnızca diğer yığın işlemlerini de gerçekleştirmeniz gereken belirli durumlarda kullanışlıdır.