Python Programming

Python Yığınlarına Etkin Bir Bakış

Spread the love

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

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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir