İçeriğe atla
ΣDSA Patterns
Menü
Dil

Kalıp #05

Cevap Üzerinde İkili Arama

Temel

Cevap değerinin kendisinde ikili ara; adayın uygulanabilirliğini doğrusal zamanda kontrol et.

Ne zaman kullanılır

Greedy veya tarama ile doğrulanabilen bir X için min/maks arıyorsan. Kapasite, hız ve bölme problemlerinde klasik.

Tanıma ipuçları

  • Maksimumu minimize et / minimumu maksimize et
  • Koko muz yeme, paket taşıma, dizi en büyük toplamını böl
  • Uygulanabilirlik kontrolü O(n) ve tahmin cevaba göre monoton

Yaygın tuzaklar

  • Yanlış arama sınırları (lo/hi çok dar veya çok geniş)
  • Aslında monoton olmayan uygulanabilirlik
  • mid veya oranlarda tamsayı bölme

90 saniyelik tanıma egzersizi

Hangisi en iyi uyuyor?

  • Maksimumu minimize et / minimumu maksimize et
  • Koko muz yeme, paket taşıma, dizi en büyük toplamını böl
  • Uygulanabilirlik kontrolü O(n) ve tahmin cevaba göre monoton

Interactive

Zihinsel model

Değişmezin tam adım adım anlatımı. Duraklat, noktalara tıkla veya ← → kullan. Her adımı kendi cümlelerinle anlatmayı hedefle.

Adım 1 / 8
1F
2F
3F
4T
5T
6T
7T
8T

feasible(x) is monotonic

Search the answer domain, not array indices. Example: min feasible speed.

Nasıl düşünülür

Dizi indeksi aramıyorsun. Cevap uzayında [lo, hi] arıyorsun. mid tahmini için feasible(mid) çalıştır. Uygulanabilirlik monoton olduğu için ikili arama ilk true (min) veya son true (maks) bulur.

Tarif

  1. Monotonluğu kanıtla: X işe yarıyorsa daha büyük (veya küçük) de yarıyor.
  2. lo / hi için sıkı geçerli sınırlar koy.
  3. Doğru bir feasible yaz.
  4. İlk true (min) veya son true (maks) için ikili ara.

Karmaşıklık temeli

O(n log R) - R cevap aralığının boyutu.

Şablon

TypeScript, Python ve C#’te aynı iskelet. Değişmezi uyarla; yapıyı koru.

Cevap Üzerinde İkili Arama · Şablon
/** Binary search on answer: first mid where feasible(mid) is true. */
export function binarySearchOnAnswer(
  lo: number,
  hi: number,
  feasible: (mid: number) => boolean,
): number {
  while (lo < hi) {
    const mid = lo + ((hi - lo) >> 1);
    if (feasible(mid)) hi = mid;
    else lo = mid + 1;
  }
  return lo;
}
/** Binary search on answer: first mid where feasible(mid) is true. */
export function binarySearchOnAnswer(
  lo: number,
  hi: number,
  feasible: (mid: number) => boolean,
): number {
  while (lo < hi) {
    const mid = lo + ((hi - lo) >> 1);
    if (feasible(mid)) hi = mid;
    else lo = mid + 1;
  }
  return lo;
}