Seyrek matrislerde daha hızlı olan Floyd-Warshall versiyonunu yapmaya çalışabilirsiniz.
İlk önce, bu algoritmanın ne yaptığını hatırlayalım:
bir mesafeler matrisi olsun . Algoritmanın başında , kenarının ağırlığıdır . Bu kenar yoksa .M i , j i → j M i , j = ∞MMben , jben → jMben , j= ∞
Algoritma adımlıdır. Algoritmanın aşamasında , düğümlerinin her çifti için belirlediğimizk i , jVkben , j
Mben , j← dk { Mben , j, Mben , k+ Mk , j} .
Açıkça, veya güncelleme yapılması gerekmez. Böylece, algoritmanın ilk adımlarında, sadece kabaca gerçekleştirmek için gereken karşılaştırmalar nerede ve göstermek sırasıyla nodunun gelen ve giden kenarlarının sayısı . Algoritma ilerledikçe, matrisinin gittikçe daha fazla girişi doldurulur. Bu nedenle, son adımlar daha uzun sürebilir.M k , J = ∞ d , e g ı n ( k ) ⋅ d , e g O u t ( k ) d e g ı n ( k ) d e g O u t ( k ) K EMben , k= ∞Mk , j= ∞de gben n( k ) ⋅ de gO u t( k )de gben n( k )de gO u t( k )kM
Not biz yineleme için sadece üzerinde olmayan sonsuz hücrelerini etkili bir yola ihtiyaç duyduklarını matrisinin-inci satır ve sütunun. Bu, her düğüm için bir dizi gelen ve giden kenar tutularak yapılabilir.k
Algoritmanın ilk adımlarının seyreklikten büyük ölçüde yararlanabileceği anlaşılmaktadır. Örneğin, ile rastgele oluşturulmuş bir grafik , ilk yinelemenin ( ) yalnızca adım olduğunu gösterir. Eğer grafik birçok bağlı bileşene bölünürse, o zaman matrisi algoritma boyunca nispeten seyrek kalır ve toplam çalışma zamanı kadar düşük olabilir . Öte yandan, grafik sadece bir bağlı bileşen içeriyorsa, son yineleme adım atması bekleniyor . Bu durumda toplam çalışma zamanı . Seyrek olmayan sürümü kadar büyük.k = 0 O ( 1 ) M O ( V ) k = | V | O ( V 2 ) O ( V 3 )E= 0 ( V)k = 00 ( 1 )MO ( V)k = | V|O ( V2)O ( V3)