Menu
Coddy logo textTech

Topolojik Sıralama

Son güncelleme

Yönlü çevrimsiz bir grafın (DAG) topolojik sıralaması, her u → v kenarı için u'nun v'den önce geldiği, düğümlerinin doğrusal bir sıralamasıdır. «Her önkoşul önce bitecek şekilde bu görevleri hangi sırayla çalıştırabilirim?» gibi sorulara yanıt verir. Kahn algoritmasının düğümleri geçerli bir sırayla çıkarışını izlemek için yukarıdan oynat'a basın.

Kahn algoritması, kalan gelen kenarı olmayan (giriş derecesi 0) bir düğümü tekrar tekrar alır, onu sıraya ekler ve çıkan kenarlarını kaldırır; bu da yeni giriş derecesi 0 düğümlerini serbest bırakabilir. Yalnızca bir DAG üzerinde çalışır: bir çevrim varsa bazı düğümler asla giriş derecesi 0'a ulaşmaz ve geçerli bir sıra yoktur. O(V + E) zamanda çalışır.

Zaman ve alan karmaşıklığı

ÖlçütKarmaşıklıkNotlar
ZamanO(V + E)Her düğüm bir kez çıkarılır, her kenar bir kez kaldırılır
AlanO(V)Giriş derecesi sayıları + hazır küme + sıra
GerektirirBir DAGÇevrimlerin topolojik sıralaması yoktur
SonuçBenzersiz değilBirçok geçerli sıra bulunabilir

Adım adım (Kahn algoritması)

AdımNe olur
1Her düğümün giriş derecesini (gelen kenar sayısını) hesapla.
2Giriş derecesi 0 olan tüm düğümleri bir hazır kümede topla.
3Hazır bir düğümü al ve çıktı sırasına ekle.
4Ardıllarının her birinin giriş derecesini azalt.
5Giriş derecesi 0'a ulaşan her ardıl hazır kümeye katılır.
6Hazır küme boşalana kadar tekrarla.

Çözümlü örnek

A→C, B→C, C→D, C→E, D→F, E→F kenarlarına sahip DAG'ı sıralarken (başlangıç giriş dereceleri A:0 B:0 C:2 D:1 E:1 F:2):

AdımHazır kümeSıraEylem
0{A, B}[]A ve B giriş derecesi 0 ile başlar, bu yüzden her ikisi de hazırdır.
1{B}[A]A'yı çıkar; A→C kenarı C'nin giriş derecesini 2 → 1'e düşürür.
2{C}[A, B]B'yi çıkar; B→C kenarı C'yi 1 → 0'a düşürür, böylece C hazır olur.
3{D, E}[A, B, C]C'yi çıkar; C→D ve C→E kenarları D ve E'yi 0'a düşürür, ikisi de hazır olur.
4{E}[A, B, C, D]D'yi çıkar; D→F kenarı F'nin giriş derecesini 2 → 1'e düşürür.
5{F}[A, B, C, D, E]E'yi çıkar; E→F kenarı F'yi 1 → 0'a düşürür, böylece F hazır olur.
6{}[A, B, C, D, E, F]F'yi çıkar; hazır küme boş ve 6 düğümün tümü sıralandı: tamamlandı.

Topolojik sıralamayı ne zaman kullanmalı

Şu durumda kullanınŞu durumda kaçının
Bağımlılıklara uyan bir sıraya ihtiyacınız var (derleme adımları, paket kurulumları, ders önkoşulları).Graf yönsüzdür: topolojik sıra yalnızca yönlü graflar için tanımlıdır.
Graf bir DAG ve herhangi bir geçerli doğrusal sıra istiyorsunuz.Graf çevrimler içerebilir ve yine de tam bir sıraya ihtiyacınız var (hiçbiri yoktur).
Çevrimleri ucuza tespit etmek istiyorsunuz: başarısız bir topolojik sıralama, bir çevrimin var olduğunu kanıtlar.Bir ağırlığa göre en kısa veya en iyi sıraya ihtiyacınız var; sade topolojik sıralama ağırlıkları yok sayar.
Sırayı O(V + E) ile bir kez işleyeceksiniz.Kenarlar sürekli değişiyor ve her güncellemede yeniden sıralamanız gerekiyor; burada artımlı bir yapı daha iyi uyar.

Topological Sort kodu

Python, JavaScript, Java, C++, C dillerinde temiz ve çalıştırılabilir bir Topological Sort uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.

Python ile Topological Sort kodu

Python
1from collections import deque2
3
4def topological_sort(graph):5    # Kahn's algorithm: repeatedly remove nodes with no incoming edges6    in_degree = {node: 0 for node in graph}7    for node in graph:8        for neighbor in graph[node]:9            in_degree[neighbor] += 110    queue = deque(node for node in graph if in_degree[node] == 0)11    order = []12    while queue:13        node = queue.popleft()14        order.append(node)15        for neighbor in graph[node]:16            in_degree[neighbor] -= 117            if in_degree[neighbor] == 0:18                queue.append(neighbor)19    if len(order) != len(graph):20        raise ValueError("Graph has a cycle, no topological order")21    return order22
23
24graph = {25    "shirt": ["tie", "jacket"],26    "tie": ["jacket"],27    "pants": ["shoes", "jacket"],28    "socks": ["shoes"],29    "shoes": [],30    "jacket": [],31}32
33print(" -> ".join(topological_sort(graph)))
Bu kodu Python Playground'da çalıştır

Topolojik Sıralama SSS

Topolojik sıralama ne için kullanılır?
Görevleri, her bağımlılık onu gerektiren şeyden önce gelecek şekilde sıralar. Gerçek kullanımlar arasında derleme sistemleri ve paket yöneticileri (önce bağımlılıkları derlemek), önkoşullu ders planlaması ve elektronik tablo formül değerlendirme sırası bulunur.
Topolojik sıralamanın zaman karmaşıklığı nedir?
Hem Kahn algoritması hem de DFS tabanlı yaklaşım O(V + E) zamanda çalışır, çünkü her düğüm bir kez işlenir ve her kenar bir kez incelenir. O(V) ek alan kullanırlar.
Topolojik sıralama neden bir DAG gerektirir?
Yönlü bir çevrim bir çelişki yaratır: a, b'den önce gelmeliyse ve b, a'dan önce gelmeliyse, hiçbir doğrusal sıra ikisini de sağlamaz. Bu yüzden bir topolojik sıralama, ancak ve ancak graf yönlü çevrimsiz bir graf ise vardır. Kahn algoritması, tüm düğümleri çıkarmadan bitirdiğinde bir çevrim tespit eder.
Kahn algoritması ile DFS topolojik sıralaması arasındaki fark nedir?
Kahn algoritması yinelemeli ve BFS'e benzer: giriş derecesi 0 olan düğümleri tekrar tekrar kaldırır, bu da çevrim tespitini ve sıralamayı tümüyle açık hale getirir. DFS yaklaşımı düğümleri özyinelemeli olarak ziyaret eder ve her birinin özyinelemesi bittikçe onu sıranın başına ekler, böylece bitiş sürelerinin tersini üretir. Her ikisi de O(V + E)'dir; Kahn derin özyinelemeden kaçınır ve hazır kümeyi doğal olarak sunar, DFS ise genellikle yazması daha kısadır.
Normal bir sıralama yerine topolojik sıralamayı ne zaman kullanmalıyım?
Sıra, karşılaştırılabilir bir anahtar yerine öğeler arasındaki bağımlılıklarla tanımlandığında topolojik sıralamayı kullanın. O(n log n) mergesort gibi karşılaştırmalı bir sıralama değere göre sıralar; topolojik sıralama «önce gelmeli» kenarlarına göre sıralar ve karşılaştırmalı bir sıralamanın aksine aynı girdi için birçok geçerli yanıt üretebilir.
Topolojik sıralamanın sonucu benzersiz midir?
Genellikle değildir. İki veya daha fazla düğüm aynı anda hazır (giriş derecesi 0) olduğunda onları herhangi bir sırayla çıkarabilirsiniz, bu yüzden çoğu DAG birden fazla geçerli topolojik sıralamaya izin verir. Sıra yalnızca her adımda tam olarak bir hazır düğüm olduğunda benzersizdir; bu da DAG tek bir zincir (bir Hamilton yolu) oluşturduğunda gerçekleşir.
Coddy programming languages illustration

Coddy ile algoritmalarda ustalaş

BAŞLA