Yerleşik Heap İmplementasyonu
Python'un heapq modülü, heap işlemleri için optimize edilmiş fonksiyonlar sağlar.
Python heapq sadece min heap sağlar. Max heap için değerleri negatif yapın!
import heapq
print("=== heapq Temel Fonksiyonlar ===\n")
# 1. heappush - Eleman ekle
heap = []
heapq.heappush(heap, 5)
heapq.heappush(heap, 3)
heapq.heappush(heap, 7)
heapq.heappush(heap, 1)
print(f"Heap sonrası: {heap}")
print(f"En küçük (root): {heap[0]}")
# 2. heappop - En küçüğü çıkar
min_val = heapq.heappop(heap)
print(f"\nPop edildi: {min_val}")
print(f"Kalan heap: {heap}")
# 3. heapify - Listeyi heap'e çevir
arr = [9, 3, 7, 1, 5]
print(f"\nRastgele liste: {arr}")
heapq.heapify(arr)
print(f"Heapify sonrası: {arr}")
# 4. nsmallest / nlargest - En küçük/büyük n eleman
data = [5, 2, 9, 1, 7, 3, 8]
print(f"\nVeri: {data}")
print(f"En küçük 3: {heapq.nsmallest(3, data)}")
print(f"En büyük 3: {heapq.nlargest(3, data)}")
# 5. heappushpop - Push + pop (atomic)
heap = [1, 3, 5, 7]
heapq.heapify(heap)
result = heapq.heappushpop(heap, 2)
print(f"\nheappushpop(2): Dönen={result}, Heap={heap}")
# 6. heapreplace - Pop + push (atomic)
result = heapq.heapreplace(heap, 6)
print(f"heapreplace(6): Dönen={result}, Heap={heap}")
import heapq
print("=== Max Heap (Negatif Yöntemi) ===\n")
# Max heap simüle et
max_heap = []
values = [5, 2, 9, 1, 7, 3]
print(f"Eklenecek değerler: {values}")
# Negatif olarak ekle
for val in values:
heapq.heappush(max_heap, -val)
print(f"Heap (negatif): {max_heap}")
# Çıkarırken geri çevir
print("\nMax'tan min'e sıralı çıkar:")
while max_heap:
val = -heapq.heappop(max_heap)
print(f" {val}", end=" ")
print("\n\n=== Alternatif: Sınıf Wrapper ===")
class MaxHeap:
def __init__(self):
self.heap = []
def push(self, val):
heapq.heappush(self.heap, -val)
def pop(self):
return -heapq.heappop(self.heap)
def peek(self):
return -self.heap[0] if self.heap else None
def __len__(self):
return len(self.heap)
# Kullanım
mh = MaxHeap()
for val in [5, 2, 9, 1, 7]:
mh.push(val)
print(f"Max Heap size: {len(mh)}")
print(f"En büyük: {mh.peek()}")
print(f"Pop: {mh.pop()}")
print(f"Yeni en büyük: {mh.peek()}")
heapq fonksiyonlarını canlı olarak deneyin!
heappush(heap, item) - Ekle O(log n)heappop(heap) - En küçüğü çıkar O(log n)heapify(list) - Liste → Heap O(n)nsmallest/nlargest(n, list) - Top-K