🌍 9.6: Heap Gerçek Örnekler

Pratik Kullanım Senaryoları

🎯 Heap Kullanım Alanları

Heap veri yapısı birçok gerçek dünya probleminde kullanılır:

⚡ İşletim Sistemleri

CPU task scheduling, process önceliklendirme

🗺️ Graf Algoritmaları

Dijkstra, Prim, A* pathfinding

📊 Veri Analizi

Top-K elemanlar, medyan bulma, streaming data

🗜️ Veri Sıkıştırma

Huffman encoding, optimal code generation

🎮 Oyun Geliştirme

Event scheduling, AI decision making

📈 Algoritmik Trading

Order book management, price matching

📝 Örnek 1: Top-K Problem

En büyük/küçük K elemanı bul - Çok yaygın mülakat sorusu!

En Büyük K Eleman
import heapq

def top_k_largest(nums, k):
    """En büyük k elemanı bul - O(n log k)"""
    # Min heap kullan (boyut k)
    min_heap = []
    
    for num in nums:
        if len(min_heap) < k:
            heapq.heappush(min_heap, num)
        elif num > min_heap[0]:
            heapq.heapreplace(min_heap, num)
    
    return sorted(min_heap, reverse=True)

# Test
nums = [3, 2, 1, 5, 6, 4, 7, 8, 9]
k = 3

print(f"Liste: {nums}")
print(f"En büyük {k} eleman: {top_k_largest(nums, k)}")

# heapq ile daha kolay
print(f"\nheapq.nlargest: {heapq.nlargest(k, nums)}")

# Performans karşılaştırma
import time

big_list = list(range(100000, 0, -1))  # 100,000 eleman

# Yöntem 1: Sıralama
start = time.time()
result1 = sorted(big_list, reverse=True)[:10]
time1 = time.time() - start

# Yöntem 2: Heap
start = time.time()
result2 = heapq.nlargest(10, big_list)
time2 = time.time() - start

print(f"\n=== 100K elemanda en büyük 10 ===")
print(f"Sıralama: {time1*1000:.2f} ms")
print(f"Heap: {time2*1000:.2f} ms")
print(f"Heap {time1/time2:.1f}x daha hızlı!")
Çıktı bekleniyor...

🔀 Örnek 2: K Sıralı Liste Birleştirme

Merge K Sorted Lists
import heapq

def merge_k_sorted(lists):
    """K tane sıralı listeyi birleştir"""
    heap = []
    result = []
    
    # Her listeden ilk elemanı heap'e ekle
    for i, lst in enumerate(lists):
        if lst:
            heapq.heappush(heap, (lst[0], i, 0))
    
    # Heap'ten tek tek çıkar
    while heap:
        val, list_idx, elem_idx = heapq.heappop(heap)
        result.append(val)
        
        # Bu listeden bir sonraki elemanı ekle
        if elem_idx + 1 < len(lists[list_idx]):
            next_val = lists[list_idx][elem_idx + 1]
            heapq.heappush(heap, (next_val, list_idx, elem_idx + 1))
    
    return result

# Test
lists = [
    [1, 4, 7],
    [2, 5, 8],
    [3, 6, 9]
]

print("Girdi:")
for i, lst in enumerate(lists):
    print(f"  Liste {i+1}: {lst}")

merged = merge_k_sorted(lists)
print(f"\nBirleştirilmiş: {merged}")
print(f"Sıralı mı? {merged == sorted(merged)}")
Çıktı bekleniyor...

🎮 Örnek 3: Task Scheduler (Görev Zamanlayıcı)

CPU Task Scheduler
import heapq

class Task:
    def __init__(self, name, priority, duration):
        self.name = name
        self.priority = priority  # Düşük = yüksek öncelik
        self.duration = duration
    
    def __lt__(self, other):
        return self.priority < other.priority
    
    def __repr__(self):
        return f"{self.name}(P{self.priority}, {self.duration}s)"

def schedule_tasks(tasks):
    """Görevleri öncelik sırasına göre çalıştır"""
    heap = []
    
    # Tüm görevleri heap'e ekle
    for task in tasks:
        heapq.heappush(heap, task)
    
    print("=== Görev Zamanlayıcı ===\n")
    total_time = 0
    
    while heap:
        task = heapq.heappop(heap)
        print(f"⏰ Zaman {total_time}s: {task.name} başladı")
        print(f"   Öncelik: {task.priority}, Süre: {task.duration}s")
        total_time += task.duration
        print(f"   {task.name} tamamlandı ({total_time}s)\n")
    
    print(f"✅ Tüm görevler {total_time}s'de tamamlandı")

# Test
tasks = [
    Task("Video oynat", 5, 3),
    Task("Sistem güncelle", 2, 10),
    Task("Virüs tara", 3, 8),
    Task("Güvenlik duvarı", 1, 2),  # En yüksek öncelik!
    Task("Email senkronize", 4, 5)
]

print("Gelen görevler:")
for task in tasks:
    print(f"  {task}")

print()
schedule_tasks(tasks)
Çıktı bekleniyor...

📊 Örnek 4: Medyan Bulma (Streaming)

Running Median with 2 Heaps
import heapq

class MedianFinder:
    """2 heap ile medyan bul (akış halinde)"""
    
    def __init__(self):
        self.small = []  # Max heap (negatif)
        self.large = []  # Min heap
    
    def add_num(self, num):
        """Yeni sayı ekle"""
        # Önce small'a ekle (max heap)
        heapq.heappush(self.small, -num)
        
        # small'ın max'ı large'ın min'inden küçük olmalı
        if self.small and self.large and (-self.small[0] > self.large[0]):
            val = -heapq.heappop(self.small)
            heapq.heappush(self.large, val)
        
        # Boyutları dengele
        if len(self.small) > len(self.large) + 1:
            val = -heapq.heappop(self.small)
            heapq.heappush(self.large, val)
        
        if len(self.large) > len(self.small):
            val = heapq.heappop(self.large)
            heapq.heappush(self.small, -val)
    
    def find_median(self):
        """Medyanı bul"""
        if len(self.small) > len(self.large):
            return -self.small[0]
        else:
            return (-self.small[0] + self.large[0]) / 2.0

# Test
mf = MedianFinder()
nums = [5, 15, 1, 3, 8, 7, 9, 10, 20]

print("=== Akış Halinde Medyan ===\n")

for num in nums:
    mf.add_num(num)
    median = mf.find_median()
    print(f"Ekle {num:2d} → Medyan: {median}")
Çıktı bekleniyor...

📋 Özet

✅ Heap Modülü Tamamlandı!

  • Top-K: En büyük/küçük k eleman - O(n log k)
  • Merge K Lists: K sıralı listeyi birleştir
  • Task Scheduler: Öncelik tabanlı görev yönetimi
  • Running Median: 2 heap ile anlık medyan
  • Gerçek kullanım: OS, Dijkstra, Huffman, Load balancing...

🎓 Tebrikler!

Heap veri yapısını baştan sona öğrendiniz. Artık priority queue, heap sort ve diğer heap uygulamalarını kullanabilirsiniz!