COMPUTER ENGINEER

← BlogDATA STRUCTURES / ALGORITHMSPython örnek paketi ↓

Doğrusal yapılar ve hashing · 10 / 53

Stack, queue, deque ve ring buffer

Anla → iz sür → uygula → gerekçelendir

2 dk okuma · uygulama için ayrıca zaman ayır

Stack LIFO, queue FIFO sözleşmesi sunar; deque iki ucu destekler. Stack undo, parantez eşleme ve explicit DFS için uygundur. Queue BFS ve iş sırası için kullanılır; işlerin FIFO alınması çok iş parçacığında FIFO tamamlanacakları anlamına gelmez.

Ring buffer sabit kapasiteli dizide head/tail indekslerini mod capacity ile sarar. Boş/dolu ayrımı için size sayacı, bir boş slot veya nesil biti gerekir. Üzerine yazma, bloklama veya reddetme davranışlarından hangisinin geçerli olduğunu tanımla. Queue implementasyonunda dizinin başını silmek yerine indeks ilerletmek kopyalamayı önler.

Monotonic deque, pencere maksimumunu tutarken artık cevap olamayacak küçük eski adayları çıkarır. Her indeks en fazla bir kez girip bir kez çıkar; iç içe while görünmesine rağmen toplam O(n)'dir. Bu, amortize analiz ile invariant'ın birlikte kullanıldığı güçlü bir örnektir. Empty pop ve capacity sınırları test edilmelidir.

Adım adım iz sürme

[2,1,5,3], k=3: ilk pencere maksimumu 5; ikinci de 5. 5 gelince 2 ve 1 adaylıktan çıkar, çünkü 5 daha yeni ve daha büyüktür.

Maliyet ve varsayımlar

Deque uç işlemleri O(1); kayan pencere maksimumu O(n) zaman O(k) ek alan.

Çalıştırılabilir örnek

Python 3 ile çalıştır. Assert küçük bir örneği denetler; genel doğruluk ispatı değildir. Bazı ileri örnekler özellikle küçük model veya referans oracle'dır; tam üretim uygulaması değildir.

Python 3
from collections import deque

def window_max(a, k):
    if not 1 <= k <= len(a):
        raise ValueError("invalid window")
    q, out = deque(), []
    for i, x in enumerate(a):
        while q and q[0] <= i-k: q.popleft()
        while q and a[q[-1]] <= x: q.pop()
        q.append(i)
        if i >= k-1: out.append(a[q[0]])
    return out
assert window_max([2,1,5,3], 3) == [5,5]

KAVRADIĞINI KONTROL ET

Sıra sende

Queue ile priority queue farkı nedir?

Çözümün mantığını göster

Queue giriş sırasını; priority queue karşılaştırıcıya göre en öncelikli öğeyi seçer. İsimleri benzer ama sözleşmeleri farklıdır.

Bir adım ileri

  1. Örneği değiştirmeden önce girdi sözleşmesini ve invariantı yaz.
  2. Uygun olan boş, sınır, tekrar ve adversarial girdileri ekle. Basit bir oracle ile karşılaştır.
  3. Belirtilen modelde maliyeti çıkar; farklı girdi büyüklüklerini ölç ve farkları gerekçelendir.

Temel kaynaklar ve ders notları

Bu eğitimde özgün anlatım kullanıldı; aşağıdaki kaynaklar ispatlar ve ileri okumalar sunar. Bağlantılar daha geniş ders modülünü kapsayabilir.

Pat Morin · Open Data Structures ↗
İlerlemeden önce alıştırmayı çöz.