Arborele minim algoritm de căutare se întinde
Arborele minim algoritm de căutare se întinde
Minim arbore de acoperire (MoU) conectat grafic ponderată este un subgraf conectat de ea, constând din toate vârfurile de arbori sursă și unele din coastele lui, și suma greutăților marginilor posibile minime. Dacă graficul inițial este deconectat, procedura descrisă mai jos poate fi aplicată în mod alternativ la fiecare componenta conectată, obținându-se astfel arborii minime Întinsă pentru aceste componente.
MOU pentru graficul conectat poate fi găsit prin forță brută. Deoarece o multitudine de nervuri MOU este un subset al setului de muchii ale sursei, puteți încerca pur și simplu, toate subgrupurile posibile și pentru a găsi printre ei MOU. Este ușor de văzut că acesta este un proces extrem de consumatoare de timp. Multitudinea de nervuri N are 2 N subseturi. Pentru fiecare dintre aceste subseturi, vom avea nevoie pentru a verifica dacă acesta este conectat seturi subgrafic care acoperă toate nodurile originalului, și nu conține cicluri, iar apoi se calculează greutatea. Procesul poate fi accelerat după ce a găsit primul arbore de acoperire. Nr subset de margini, greutatea totală este mai mare decât cea a găsit deja cel mai bun arbore de acoperire, nu putem merge, deci nu este nevoie pentru a verifica conectivitatea, aciclic și acoperirea tuturor nodurilor. Cu toate acestea, chiar și cu această metodă îmbunătățită, complexitatea unei brute-force este de ordinul O (2 N).
Dijkstra-Prim
La sfârșitul anilor 1950 și Edgar Dijkstra Nota de lucru și publicarea rezultatelor, în mod independent, am propus următorul algoritm pentru construirea MOD.
Noi folosim pentru a căuta MoU așa-numitul algoritm „greedy“. act Greedy, folosind de fiecare dată doar o parte din datele originale și luând cea mai bună soluție pe baza acestei părți. În cazul nostru, vom lua în considerare la fiecare pas dintr-o multitudine de aripioare care permit conectarea la partea deja construite din arborele de acoperire și alegeți dintre ele marginea cu cea mai mică greutate. Repetând această procedură, obținem un arbore de acoperire cu cea mai mică greutate.
Vom împărți nodurile în trei clase: nodurile incluse în partea deja construite din vârfurile de arbori care mărginesc parte construite, și nu a luat în considerare în partea de sus. Să începem cu un vârf arbitrar și să o includă într-un arbore de acoperire. Ca urmare a construcției va fi copaci nerădăcinoși, alegerea de nod de intrare nu afectează rezultatul final (desigur, în cazul în care numai MOD). Toate nodurile conectate la aceasta, aduce în jantă. Apoi, marginile ciclului de căutare cu cea mai mică greutate care leagă partea deja construite din arborele de acoperire cu un chenar; această margine cu un nou vârf, se adaugă la copac și actualizează frontiera. După toate nodurile din toamna copac, lucrarea va fi terminată.
Aici este algoritmul: Figura 1 conform algoritmului descris cu titlu de exemplu. La începutul procesului vom alege un nod arbitrar A. Așa cum am spus, o alta alegere a rezultatului inițial vârf va fi la fel ca în cazul în care MOU este unic. Graficul original este prezentat în Fig. 1 (a) și, așa cum sa menționat deja, începem construirea de top MOD A. Toate nodurile conectate direct la A, formează o bordură originală. Se poate observa că marginea cel mai puțin în greutate se conectează nodurile A și B, prin urmare, la partea deja construite din MAp adaugă vârf B, cu margine AB. Când a adăugat la partea superioară a arborelui B (Fig. 1 (c)), trebuie să determinăm dacă nu ar trebui să adauge la granița noilor nodurile. Ca rezultat, vom constata că aceasta trebuie să fie făcut cu vârfurile E și G. Din moment ce aceste două noduri sunt conectate numai cu vârful B este deja construită o parte din copac, vom adăuga la lista de nervuri luate în considerare la următoarea etapă de etanșare. Aici este necesar să se verifice dacă muchiile de la un vârf de la A la C, D și F, cea mai scurtă dintre muchiile de legătură aceste noduri cu un copac sau se găsește margini mai confortabile emanate din coloana B. în vertex inițial B nu este conectat direct la orice C, sau cu F, asa ca pentru ei nimic nu sa schimbat. Dar marginea BD AD coaste scurte, și, prin urmare, ar trebui să-l înlocuiască. Cinci muchii muscă merge în jantă, are o margine BE, deci copacul este necesar să se adauge la partea de sus și E (fig. 1 (d)). EG fin greutate mai mică greutate coaste BG, așa că înlocuiește acesta din urmă. Dintre cele patru margini de conducere în jantă, cea mai mică greutate are curent alternativ, astfel încât următorul text se adaugă la copac. Adăugarea la marginile se întinde de arbori și nodurile C AC (Fig. 1 (d)) nu modifică lista de margini.
Apoi vom selecta nervura AF și adăugați-l la copac cu partea de sus a F. În plus, vom schimba lista de link-uri ca aripioarele FD se cântărește mai puțin decât greutatea de coaste și BD greutate coaste FG greutate mai mică EG coaste. Rezultată franjuri (Fig. 1 (e)) FD nervura are cea mai mică greutate între restul, și se adaugă după cum urmează.
Acum trebuie să adăugați la copac doar o singură unitate (Fig. 1 (g)). După acest proces este finalizat, și am construit MOD înrădăcinați la vârful A (Fig. 1 (h)).
Algoritmul lui Kruskal
Prima Dijkstra Algoritmul începe cu vârf specifice de construcție MOD și se extinde treptat copac construit; în contrast, algoritmul Kruskal se concentrează pe margini.
În acest algoritm, vom începe cu un copac gol și adăugați-l la coaste, în ordinea crescătoare a greutăților până când veți obține un set de margini, care combină toate nodurile. În cazul în coaste alerga afară înainte de toate nodurile sunt conectate între ele, acest lucru înseamnă că numărul de original a fost deconectat și contactați rezultatul este o uniune MOD toate componentele sale conectate.
Lucrăm cu același grafic (vezi. Fig. 2 (a)), și că descrierea algoritmului Dijkstra -Prima. Să începem cu marginile putin in greutate, care este, coaste DF. Situația inițială este prezentată în Fig. 2 (b).
Următoarele se adaugă la greutatea nervurii 2, care leagă nodurile A și B (Figura 2 (c).), Și apoi - greutatea unei margini de trei, și avem o situație cu orez. 2 (g).
Pentru graficul rezultat sunt adăugate coaste secvențial greutăți 4 și 5 (figurile 2 (d) și (e)). a rămas doar vârful neconectat G. În continuare, trebuie să ia în considerare greutatea înotătoarelor 6.
Două dintre cele patru margini ale greutății 6 trebuie eliminate, deoarece adăugarea lor va conduce la un ciclu în partea deja construite din MOU. CF coaste pentru aderare ar crea o buclă care cuprinde de vârf A, iar marginile de îmbinare BD - un ciclu care cuprinde vârfuri A și F. Cele două posibilități rămase sunt la fel de potrivite, și selectarea uneia dintre ele, obținem un MOD cu Fig. 2 (g), sau MOU cu orez. 2 (h).
Aici este un algoritm general care implementează această procedură (numărul de muchii din grafic se notează cu E, iar numărul de vârfuri - prin N): Bucla principală este executată atâta timp cât valoarea edgeCount variabilei nu coincide cu numărul de muchii din grafic sau până când includedCount variabilă nu arată pe care le-am adăugat destule coaste pentru a forma un arbore de acoperire. Rețineți că se întinde copac într-un grafic cu N noduri trebuie să aibă N - 1 margine.
În interiorul buclei, să găsim mai întâi părinții de noduri conectate printr-o muchie adaugă alta. Dacă aceste noduri aparțin diferitelor partiții de rădăcini, adăugând margini dintre ele nu va provoca un ciclu, și două partiții fuzioneze într-o singură rădăcină comună. Rutinele FindRoot și a Uniunii sunt descrise în detaliu în articolul „partiția setului.“
Complexitatea acestui algoritm este aceeași ca și complexitatea unui algoritm de sortare utilizat, deoarece numărul de operații pe ciclu în timp liniar cu numărul de muchii. Prin urmare, complexitatea algoritmului de căutare Kruskal MOD este O (E log E).