Arama ve sıralama · 12 / 53
Linear/binary search ve arama kalıpları
Anla → iz sür → uygula → gerekçelendir
2 dk okuma · uygulama için ayrıca zaman ayırLinear search hiçbir sıralılık istemez; her öğeyi sınar. Binary search sıralı veri veya false→true gibi monoton bir koşul ister. “Ortadan başla” tek başına yeterli değildir; hangi yarının neden elendiğini ispatla. [lo,hi) yarı açık aralık başlangıçta [0,n)'dir. lower_bound ilk a[i]≥x konumunu bulur; sonuç n ise uygun öğe yoktur.
Binary search yalnız bir değeri bulmak için değildir. Cevap uzayında minimum uygulanabilir kapasiteyi arayabilirsin: bir kapasite yeterliyse daha büyük kapasite de yeterli olmalıdır. Her feasibility kontrolünün maliyetini toplam hesaba ekle. Sırasız linked list üzerinde orta düğümü bulmak O(n) olduğundan, ikili daraltma array'deki erişim avantajını otomatik sağlamaz.
Two pointers sıralı çift toplamı, sliding window ise uygun pencere koşullarında çalışır. Negatif sayılar varsa toplamı aşınca soldan çıkarma stratejisi geçerli olmayabilir. Prefix sums aralık toplamını iki prefix farkına çevirir; prefix hash ile negatif içeren dizide hedef toplam alt dizi sayılabilir.
Adım adım iz sürme
[1,3,3,7], x=3: lo0 hi4 mid2 → hi2; mid1 → hi1; mid0 → lo1. İlk3 indeks1'+'’dedir.
Maliyet ve varsayımlar
Array binary search O(log n) zaman O(1) alan; feasibility maliyeti F ise cevap araması O(F log R).
Ç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.
def lower_bound(a, x):
lo, hi = 0, len(a)
while lo < hi:
mid = lo + (hi-lo)//2
if a[mid] < x: lo = mid + 1
else: hi = mid
return lo
assert lower_bound([1,3,3,7], 3) == 1
assert lower_bound([], 9) == 0İNTERAKTİF LABORATUVAR
Her kararı gör.
Gerçek algoritmayı adım adım incele. İkili arama için girdi önce sıralanır; vurgulanan indeksler sıralı diziye aittir.
Aralık [0, 6], orta 3: 18 ile 24 karşılaştırılıyor.
KAVRADIĞINI KONTROL ET
Sıra sende
[2,-1,2] dizisinde toplam≥3 için pencereyi greedy küçültmek her zaman doğru mu?
Çözümün mantığını göster
Hayır; negatif çıkarılması toplamı artırabilir. Monotonluk varsayımı bozulur. Problem için prefix sums ve monotonic deque gibi uygun bir yöntem gerekebilir.
Bir adım ileri
- Örneği değiştirmeden önce girdi sözleşmesini ve invariantı yaz.
- Uygun olan boş, sınır, tekrar ve adversarial girdileri ekle. Basit bir oracle ile karşılaştır.
- 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.
MIT 6.006 · Introduction to Algorithms ↗