İçeriğe atla
CodeItRaw
Heap & Öncelik Kuyruğu

Ders 2/2

k'inci en büyük elemanı bulmak için bütün listeyi sıralamak gerekmez. Boyu k'yi geçmeyen bir heap tut: her elemanı ekle, heap k'den büyürse en küçüğünü at. Sonunda heap'te en büyük k eleman kalır ve en küçükleri, yani heap[0], k'inci en büyüktür.

import heapq
heap = []
for v in values:
heapq.heappush(heap, v)
if len(heap) > k:
heapq.heappop(heap)
return heap[0]
Ters gibi görünür ama doğrudur: en büyükleri tutmak için en küçüğü atan bir heap kullanılır. Heap hiç k'den büyümediği için her işlem log k'dir; liste çok uzun, k küçükse bu, sıralamaktan belirgin biçimde ucuzdur.

İkinci kalıp: "hep en küçük ikisini al, birleştir, sonucu geri koy". İpleri en ucuza birleştirmek böyledir: erken birleştirdiğin ip sonraki her birleştirmede yeniden sayılır, bu yüzden kısa olanlar önce birleşmelidir. Sıralı bir liste burada işe yaramaz, çünkü birleşen ip sıranın ortasına düşer; heap onu yerine kendisi koyar.

Görevler

Görevler sırayla açılır. Hepsini çözünce sonraki ders açılır.

Bu dersin görevleri, önceki dersler bitince açılır. Anlatımı şimdiden okuyabilirsin.

  1. 01

    K'ıncı En Büyük

    Fonksiyon

  2. 02

    Halat Birleştirme

    Fonksiyon

  3. 03

    En Küçük k Tane

    Kod Okuma · AI'yı Denetle

Sırayı beklemeden çözmek istersen bütün problemler kilitsiz açık: Problemler listesi