Bir dizideki en büyük k elemanı (top-k) heap ile nasıl bulursunuz?

Cevap

Heap (priority queue), en küçük (min-heap) veya en büyük (max-heap) elemana O(1) erişim, ekleme ve kök çıkarmada O(log n) sağlayan, dizi üzerinde tutulan tam ikili ağaçtır.

Fikir

En büyük k elemanı bulmak için boyutu k olan bir min-heap tutulur. Heap'in kökü, şimdiye kadarki en büyük k elemanın en küçüğüdür. Yeni eleman kökten büyükse kök atılır, yeni eleman eklenir.

import heapq

def top_k(nums, k):
    heap = []
    for x in nums:
        if len(heap) < k:
            heapq.heappush(heap, x)
        elif x > heap[0]:
            heapq.heapreplace(heap, x)   # pop + push tek adımda
    return sorted(heap, reverse=True)

top_k([5, 1, 9, 3, 7, 8], 3)  # [9, 8, 7]
  • Zaman: O(n log k)
  • Bellek: O(k)

Alternatifler

YöntemZamanNot
Tümünü sıralaO(n log n)En basit
Boyutu k min-heapO(n log k)Akan (stream) veride ideal
Tümünden heap kur, k kez popO(n + k log n)heapify O(n)
QuickselectOrtalama O(n)Yerinde, en kötü O(n²)

Python'da kısa yol heapq.nlargest(k, nums). "En sık geçen k eleman" varyasyonunda önce Counter ile frekanslar sayılır, sonra frekansa göre aynı teknik uygulanır.

Veri akış hâlinde geliyorsa ve tamamı belleğe sığmıyorsa boyutu k heap yaklaşımı tek uygun seçenektir.

  1. Binary search'ün zaman karmaşıklığı nedir ve neden?KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  2. Two Sum: toplamı hedefe eşit olan iki elemanın indekslerini bulun.KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  3. Bir parantez dizisinin geçerli olup olmadığını kontrol edin: "({[]})"KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  4. Tek yönlü bağlı listeyi ters çevirin.OrtaAlgoritmalar & Veri YapılarıYazılım Müh.
  5. BFS ve DFS arasındaki fark nedir? Hangisini ne zaman kullanırsınız?OrtaAlgoritmalar & Veri YapılarıYazılım Müh.
  6. get ve put işlemleri O(1) olan bir LRU Cache tasarlayın.ZorAlgoritmalar & Veri YapılarıYazılım Müh.

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle