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

Kalıp #20

Topolojik Sıralama

İleri

Her yönlü kenar erken → geç olsun diye düğümleri sırala.

Ne zaman kullanılır

Önkoşullar, derleme sırası veya herhangi bir DAG bağımlılık kısıtı.

Tanıma ipuçları

  • Ders programı / sıra
  • Alien dictionary
  • Indegree kuyruğu (Kahn) veya DFS postorder

Yaygın tuzaklar

  • Döngü tespit etmemek (eksik sıra)
  • Grafı yanlış yönde kurmak
  • Birden fazla geçerli sıra: belirtilmedikçe herhangi biri olur

90 saniyelik tanıma egzersizi

Hangisi en iyi uyuyor?

  • Ders programı / sıra
  • Alien dictionary
  • Indegree kuyruğu (Kahn) veya DFS postorder

Etkileşimli

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
A
B
C
D

indegree A0 B1 C1 D2

Önkoşul grafı: A, B ve C'den önce; B ve C, D'den önce.

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

DAG’ta indegree 0 düğümler önce gelebilir. Kahn: onları kuyruğa al, çıkar, komşuların indegree’sini azalt. n’den az düğüm çıkarırsan döngü vardır. DFS: çocukları gezdikten sonra düğümü öne ekle.

Şablon şekilleri

Şekil Temel hamle Notlar
Kahn BFS Indegree + kuyruk Sayıyla döngü tespit
DFS Özyineleme renkleri Postorder öne ekle
Sözlükçe en küçük Kuyruk yerine min-heap Belirleyici sıra

Karmaşıklık temeli

O(V+E) zaman ve alan.

Şablondan probleme

  1. Komşuluk listesi ve indegree dizisi kur.
  2. Tüm indegree 0’ı kuyruğa al.
  3. Pop, sıraya ekle, komşuları azalt; 0 olursa kuyruğa.
  4. order.length < n → döngü / imkânsız.

Şablon

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

Topolojik Sıralama · Şablon
/** Topo template: Kahn BFS; empty array if cycle. */
export function topoSort(n: number, edges: number[][]): number[] {
  const g: number[][] = Array.from({ length: n }, () => []);
  const indeg = new Array(n).fill(0);
  for (const [u, v] of edges) {
    g[u!]!.push(v!);
    indeg[v!]++;
  }
  const q: number[] = [];
  for (let i = 0; i < n; i++) if (indeg[i] === 0) q.push(i);
  const order: number[] = [];
  while (q.length) {
    const u = q.shift()!;
    order.push(u);
    for (const v of g[u]!) if (--indeg[v]! === 0) q.push(v);
  }
  return order.length === n ? order : [];
}
/** Topo template: Kahn BFS; empty array if cycle. */
export function topoSort(n: number, edges: number[][]): number[] {
  const g: number[][] = Array.from({ length: n }, () => []);
  const indeg = new Array(n).fill(0);
  for (const [u, v] of edges) {
    g[u!]!.push(v!);
    indeg[v!]++;
  }
  const q: number[] = [];
  for (let i = 0; i < n; i++) if (indeg[i] === 0) q.push(i);
  const order: number[] = [];
  while (q.length) {
    const u = q.shift()!;
    order.push(u);
    for (const v of g[u]!) if (--indeg[v]! === 0) q.push(v);
  }
  return order.length === n ? order : [];
}
#DurumProblemTürBitti
  1. 1#207 Course ScheduleRehber
  2. 2#210 Course Schedule IIRehber
  3. 3#269 Alien DictionaryRehber
  4. 4#310 Minimum Height TreesRehber
  5. 5#1136 Parallel CoursesRehber
  6. 6#1203 Sort Items by Groups Respecting DependenciesRehber