Ters silme algoritması - Reverse-delete algorithm

tersine silme algoritması bir algoritma içinde grafik teorisi elde etmek için kullanılır az yer kaplayan ağaç belirli bir bağlantıdan kenar ağırlıklı grafik. İlk ortaya çıktı Kruskal (1956) ama karıştırılmamalıdır Kruskal'ın algoritması aynı kağıtta görünen. Grafiğin bağlantısı kesilirse, bu algoritma grafiğin bağlantısı kesilen her bir parçası için minimum bir kapsayan ağaç bulacaktır. Bu minimum genişleyen ağaç kümesine, grafikteki her tepe noktasını içeren minimum genişleyen orman denir.

Bu algoritma bir Açgözlü algoritma, herhangi bir durumda en iyi seçeneği seçmek. Tersi Kruskal'ın algoritması, minimum yayılan ağaç bulmak için başka bir açgözlü algoritmadır. Kruskal’ın algoritması boş bir grafikle başlar ve kenarlar eklerken, Ters-Sil algoritması orijinal grafikle başlar ve ondan kenarları siler. Algoritma şu şekilde çalışır:

  • E kenarlarının bir listesini içeren G grafiğiyle başlayın.
  • Kenar ağırlıklarının azalan sırasına göre E'den geçin.
  • Her kenar için, kenarın silinmesinin grafiğin bağlantısını daha da kesip kesmeyeceğini kontrol edin.
  • Ek bağlantı kesilmesine yol açmayan herhangi bir silme işlemi gerçekleştirin.

Sözde kod

işlevi ReverseDelete (kenarlar [] E) dır-dir    çeşit E azalan sırada Bir dizin tanımlayın ben ← 0    süre ben < boyut(E) yapmak        Tanımlamak kenarE[ben]	    sil E[ben]	    Eğer grafik bağlı değil sonra                E[ben] ← kenar                benben + 1    dönüş kenarlar [] E

Yukarıdaki grafikte bir dizi kenar E her kenar bir ağırlık ve bağlantılı köşeler içerir v1 ve v2.

Misal

Aşağıdaki örnekte yeşil kenarlar algoritma tarafından değerlendirilmekte ve kırmızı kenarlar silinmektedir.

0.svg'yi Tersine ÇevirBu bizim orijinal grafiğimiz. Kenarlara yakın sayılar kenar ağırlıklarını gösterir.
Ters Sil 1.svgAlgoritma, maksimum ağırlıklı kenar ile başlayacaktır, bu durumda DE 15 kenar ağırlığında kenar DE'nin silinmesi grafiğin bağlantısını daha fazla kesmediğinden silinir.
Ters Sil 2.svgBir sonraki en büyük kenar FG bu nedenle algoritma, bu kenarın silinmesinin grafiğin bağlantısını daha da kesip kesmeyeceğini kontrol edecektir. Kenarın silinmesi grafiğin daha fazla bağlantısını kesmeyeceğinden, kenar silinir.
Tersine Sil 3.svgBir sonraki en büyük kenar kenardır BD böylece algoritma bu kenarı kontrol edecek ve kenarı silecektir.
Tersine Sil 4.svgKontrol edilecek bir sonraki kenar kenar ÖRNEĞİN, düğümün bağlantısını keseceği için silinmeyecek G grafikten. Bu nedenle, silinecek bir sonraki kenar kenar M.Ö.
Tersine Sil 5.svgBir sonraki en büyük kenar kenardır EF böylece algoritma bu kenarı kontrol edecek ve kenarı silecektir.
Ters Sil 6.svgAlgoritma daha sonra kalan kenarları arayacak ve silinecek başka bir kenar bulamayacaktır; dolayısıyla bu, algoritma tarafından döndürülen son grafiktir.

Çalışma süresi

Algoritmanın çalıştığı gösterilebilir Ö(E günlük V (günlük günlüğü V)3) zaman (kullanma büyük-O gösterimi ), nerede E kenarların sayısıdır ve V köşe sayısıdır. Bu sınır şu şekilde elde edilir:

  • Karşılaştırma sıralaması kullanarak kenarları ağırlığa göre sıralamak Ö(E günlük E) zaman, basitleştirilebilir Ö(E günlük V) en büyük E olabilir V2.
  • Var E döngünün yinelemeleri.
  • Bir kenarın silinmesi, ortaya çıkan grafiğin bağlanabilirliğinin kontrol edilmesi ve (eğer bağlantısı kesilmişse) kenarın yeniden takılması, Ö(günlükV (günlük günlüğü V)3) işlem başına süre (Thorup 2000 ).

Doğruluğun kanıtı

İspatını okumanız tavsiye edilir. Kruskal'ın algoritması ilk.

İspat iki bölümden oluşmaktadır. İlk olarak, algoritma uygulandıktan sonra kalan kenarların yayılan bir ağaç oluşturduğu kanıtlanmıştır. İkincisi, yayılan ağacın minimum ağırlıkta olduğu kanıtlanmıştır.

Kapsayan ağaç

Algoritma tarafından üretilen kalan alt grafiğin (g) bağlantısı kesilmez çünkü algoritma bunu 7. satırda kontrol eder. Sonuç alt grafiği bir döngü içeremez, çünkü böyle olursa kenarlar boyunca hareket ederken maksimum kenarla karşılaşacağız. döngüde ve bu kenarı sileriz. Bu nedenle g, G ana grafiğinin kapsayan bir ağacı olmalıdır.

Minimum olma

Aşağıdaki önerinin P tümevarım ile doğrudur: F, while döngüsünün sonunda kalan kenarlar kümesiyse, (kenarları) bir alt kümesi olan bazı minimum yayılan ağaç vardır. F.

  1. Açıkça P while döngüsünün başlangıcından önce tutar. Ağırlıklı bağlantılı bir grafik her zaman minimum bir kapsama ağacına sahip olduğundan ve F grafiğin tüm kenarlarını içerdiğinden, bu minimum kapsayan ağaç F'nin bir alt kümesi olmalıdır.
  2. Şimdi varsayalım P bazı nihai olmayan kenar kümesi için doğrudur F ve izin ver T içerdiği minimum yayılan ağaç olmak F. Algoritmada e kenarını sildikten sonra, F'nin bir alt kümesi olan T 'ağacını kapsayan bazı (muhtemelen başka) olduğunu göstermeliyiz.
    1. eğer bir sonraki silinen kenar e T'ye ait değilse, o zaman T = T ', F'nin bir alt kümesidir ve P tutar. .
    2. aksi takdirde, e T'ye aitse: ilk önce algoritmanın yalnızca F.'de bağlantısızlığa neden olmayan kenarları kaldırdığına ve böylece e'nin bağlantısızlığa neden olmadığına dikkat edin. Ancak e'nin silinmesi T ağacında bağlantısızlığa neden olur (çünkü bu T'nin bir üyesidir). e'nin T'yi t1 ve t2 alt grafiklerine ayırdığını varsayalım. Tüm grafik e'yi sildikten sonra bağlandığından, o zaman t1 ve t2 arasında (e dışında) bir yol olması gerekir, bu nedenle F'de (e'yi kaldırmadan önce) bir C döngüsü olmalıdır. şimdi bu döngüde başka bir kenara sahip olmalıyız (buna f diyelim), bu T'de olmayan ama F'de (çünkü tüm döngü kenarları T ağacında olsaydı, o zaman artık bir ağaç olmazdı). şimdi T '= T - e + f'nin, F'nin bir alt kümesi olan minimum kapsayan ağaç olduğunu iddia ediyoruz.
    3. ilk olarak T'nin bir yayılan ağaç . bir ağaçtaki bir kenarı silerek ve bir döngüye neden olmayan başka bir kenar ekleyerek, aynı köşelere sahip başka bir ağaç elde ettiğimizi biliyoruz. T yayılan bir ağaç olduğu için T 'bir yayılan ağaç çok. çünkü "f" eklemek, "e" kaldırıldığından beri herhangi bir döngüye neden olmaz. (T ağacının grafiğin tüm köşelerini içerdiğine dikkat edin).
    4. ikinci olarak T'nin bir minimum yayılan ağaç. "e" ve "f" kenarları için üç durumumuz var. wt ağırlık fonksiyonudur.
      1. wt (f)
      2. wt (f)> wt (e) bu da imkansızdır. o zamandan beri, kenar ağırlıklarının azalan sırasına göre kenarlardan geçerken önce "f" yi görmeliyiz. Bir C döngüsüne sahip olduğumuz için, bu yüzden "f" yi kaldırmak F'de herhangi bir bağlantısızlığa neden olmaz, bu nedenle algoritma onu F'den daha önce kaldırırdı. bu yüzden F'de "f" mevcut değildir ve bu imkansızdır (4. adımda f'nin var olduğunu kanıtladık.
      3. yani wt (f) = wt (e) yani T 'aynı zamanda bir minimum yayılan ağaç. Ve yine P tutar.
  3. yani P while döngüsü tamamlandığında (ki bu tüm kenarları gördüğümüzde) ve sonunda F'nin a olduğunu kanıtladığımızda yayılan ağaç ve F'nin bir minimum ağacı alt kümesi olarak kapsayan. bu yüzden F olmalıdır az yer kaplayan ağaç kendisi.

Ayrıca bakınız

Referanslar

  • Kleinberg, Jon; Tardos, Éva (2006), Algoritma Tasarımı, New York: Pearson Education, Inc..
  • Kruskal, Joseph B. (1956), "Bir grafiğin en kısa kapsayan alt ağacı ve seyyar satıcı problemi üzerine", American Mathematical Society'nin Bildirileri, 7 (1): 48–50, doi:10.2307/2033241, JSTOR  2033241.
  • Thorup, Mikkel (2000), "Optimale yakın tam dinamik grafik bağlantısı", Proc. Bilgisayar Teorisi Üzerine 32.ACM Sempozyumu, s. 343–350, doi:10.1145/335305.335345.