Grafiğimizin döngüsel olmaması bu sorunu çok daha basit hale getiriyor.
Topolojik sıralama bize köşe bir düzenlenmesidir verebilir böyle, eğer , o zaman hiçbir kenar yoktur için arka . Köşeleri, listedeki tüm kenarların "ileri" gideceği şekilde listeledik.v1,v2,…,vni<jvjvi
(analizi düzeltmek ve biraz daha hızlı algoritma vermek için düzenlenmiştir)
Şimdi son köşesinden başlayarak bu listede geriye doğru . geçişli kapanışı sadece kendisidir. Ayrıca kenarına sahip her köşenin geçişli kapanışına .vnvnvnvn
Birbirinden köşesi, geriye doğru, önce kendi geçişli kapanışına ekleyin , sonra geçişli kapanışındaki her şeyi tüm köşelerin geçişli kapanışına .vivivivi
Çalışma süresi en kötü durumda , köşe noktası sayısı ve kenar sayısıdır. Topolojik sıralama zaman alır . Sonra geriye doğru geçişte başka bir çalışması yaparız: Listede geriye doğru giderken, her kenar için birisinin geçişli kapanışına kadar köşe eklememiz gerekir .n m ∈ O ( n 2 ) O ( n + m ) O ( m n ) nO(n+m+nm)=O(n3)nm∈O(n2)O(n+m)O(mn)n
Bit dizileriyle herkesin geçişli kapanışını temsil ederek güzel bir sabit faktör hızlandırması yapabileceğinizi unutmayın. Diyelim ki sadece ; o zaman bit tek 64 bit int kullanırsınız ise 1'dir yoksa benim Geçişli kapatılması ve 0 içindedir. Sonra 's geçiş kapanış ' s her şeyi eklemek parçası gerçekten hızlı: Biz sadece | = . (İkili VEYA işlem.)i i i j c j c in=64iiijcjci
İçin , Diziden tutmak ve bazı aritmetik yapmak zorunda istiyorum, ama çok daha hızlı bir nesne kümesi daha olurdu.n>64
Ayrıca, en kötü durumda big- hala olduğunu biliyorum , ancak pratikte bunu yenmek için çok daha karmaşık bir şeye sahip olmanız gerekir. Bu algoritma seyrek grafiklerde de çok başarılı.O ( n 3 )OO(n3)