Topolojik Sıralama (Topological Sort) Algoritması
Topolojik sıralama, yönlü asiklik graflarda (DAG) düğümleri bağımlılıklarına göre sıralayan bir algoritmadır. Her düğüm, kendisine bağımlı olan düğümlerden önce gelecek şekilde bir doğrusal sıralama oluşturur. Bu algoritma, görev planlaması, derleme sırası, kurs ön koşulları gibi bağımlılık yönetimi gerektiren birçok alanda kullanılır.
Avantajlar
- Doğrusal zaman karmaşıklığı (O(V + E) - Düğüm ve kenar sayısıyla orantılı)
- Bağımlılık ilişkilerini doğru şekilde yönetir
- Çevrimleri (döngüleri) tespit edebilir
- Derleme sırası, görev planlaması gibi birçok gerçek dünya problemine uygulanabilir
- DFS algoritmasının doğal bir uzantısıdır
Dezavantajlar
- Yalnızca yönlü asiklik graflar (DAG) için kullanılabilir
- Çevrimli graflar için kullanılamaz
- Birden fazla geçerli topolojik sıralama olabilir (tek bir doğru çözüm yoktur)
- Yüksek öncelikli görevleri belirleme konusunda yetersiz kalabilir
İnteraktif Demo
Topolojik sıralama algoritmasını test edin. Grafı aşağıdaki formatta girin (her satır bir düğümü ve komşularını temsil eder):
Format: Düğüm:Komşu1,Komşu2,Komşu3
Örnek gösterim:
A:B,C
- A düğümünden B ve C düğümlerine kenarlar varB:D
- B düğümünden D düğümüne kenar varC:
- C düğümünden çıkan kenar yok
Graf Yapısı
Topolojik Sıralama Sonucu
Bu sıralama, her düğümün kendi tüm bağımlılıklarından sonra geldiği bir düzeni gösterir. Bir DAG için birden fazla geçerli topolojik sıralama olabilir.
Kod Örnekleri
Topolojik sıralama algoritmasının farklı programlama dillerindeki implementasyonları.
1function topologicalSort(graph: Record): { result: string[], hasCycle: boolean } { 2 // Düğümlerin ziyaret durumunu izlemek için3 const visited: Record = {}; 4 const tempVisited: Record = {}; // Geçici ziyaret (çevrim tespiti için) 5 const result: string[] = [];6 let hasCycle = false;7 8 // DFS yardımcı fonksiyonu9 function dfs(node: string) {10 // Çevrim kontrolü - eğer düğüm geçici olarak ziyaret edildiyse, çevrim var demektir11 if (tempVisited[node]) {12 hasCycle = true;13 return;14 }15 16 // Eğer düğüm zaten ziyaret edildiyse, tekrar ziyaret etmeye gerek yok17 if (visited[node]) {18 return;19 }20 21 // Düğümü geçici olarak ziyaret edildi olarak işaretle22 tempVisited[node] = true;23 24 // Komşu düğümleri kontrol et25 const neighbors = graph[node] || [];26 for (const neighbor of neighbors) {27 dfs(neighbor);28 }29 30 // Düğüm işlendi, artık kalıcı olarak ziyaret edildi31 visited[node] = true;32 // Geçici ziyaret işaretini kaldır33 tempVisited[node] = false;34 35 // Sonuç listesine ekle (başa ekleyerek sıralama tersine çevrilir)36 result.unshift(node);37 }38 39 // Tüm düğümler için DFS40 for (const node of Object.keys(graph)) {41 if (!visited[node]) {42 dfs(node);43 }44 }45 46 return { result, hasCycle };47}
Algoritma Nasıl Çalışır?
Topolojik sıralama, yönlü asiklik graflarda (DAG) düğümleri sıralama yöntemidir. Eğer grafdaki iki düğüm arasında u'dan v'ye bir kenar varsa, u düğümü topolojik sıralamada v'den önce gelmelidir. Algoritmanın temeli, her düğümün kendisine bağımlı olan tüm düğümlerden önce işlenmesini sağlamaktır.
Algoritmanın Adımları
Topolojik sıralama için yaygın olarak iki yaklaşım kullanılır:
1. DFS (Derinlik Öncelikli Arama) Tabanlı Yaklaşım
- Her düğüm için, henüz ziyaret edilmediyse DFS başlat
- Mevcut düğümün tüm komşularını ziyaret et
- Tüm komşuları ziyaret edildikten sonra, düğümü sonuç listesinin başına ekle
- DFS tamamlandığında, sonuç listesi doğru topolojik sıralamayı içerir
2. Kahn Algoritması (Girdi Derecesi Tabanlı)
- Her düğümün girdi derecesini (gelen kenar sayısı) hesapla
- Girdi derecesi 0 olan düğümleri bir kuyruğa ekle
- Kuyruktan bir düğüm çıkar, sonuç listesine ekle
- Çıkarılan düğümün tüm komşularının girdi derecesini 1 azalt
- Girdi derecesi 0'a düşen düğümleri kuyruğa ekle
- Kuyruk boşalana kadar devam et
Çevrim Tespiti
Topolojik sıralama yalnızca çevrimsiz graflar (DAG) için mümkündür. Algoritma çevrim tespiti de yapabilir:
- DFS yaklaşımında, geçici ziyaret işaretleri kullanarak çevrimleri tespit edebiliriz. Eğer bir düğüm halen geçici ziyaret edildi olarak işaretliyken tekrar ziyaret edilirse, bu bir çevrim olduğunu gösterir.
- Kahn algoritmasında, eğer sonuç listesinin uzunluğu graf düğüm sayısından azsa, graf bir çevrim içeriyor demektir.
Örnek Uygulama: Ders Ön Koşulları
Topolojik sıralama algoritmasının klasik uygulamalarından biri, üniversite derslerinin ön koşul ilişkilerini düzenlemektir. Örneğin:
- Matematiksel Analiz → Diferansiyel Denklemler
- Lineer Cebir → Sayısal Analiz
- Algoritma Teorisi → Veri Yapıları → İşletim Sistemleri
Topolojik sıralama algoritması, bu dersleri ön koşulları dikkate alarak sıralayarak bir öğrencinin hangi dersleri hangi sırayla alması gerektiğini belirlemede yardımcı olur.