(20 ο ) ΣΤΑΔΙΑΚΕΣ ΚΑΤΑΣΚΕΥΕΣ Ι: ΑΠΛΗΣΤΟΙ ΑΛΓΟΡΙΘΜΟΙ Σταδιακές κατακευές: από μερικά αποτελέματα ε περιότερα. Το ημείο όπου έχουμε φθάει προφέρεται για μια μικρή ανακόπηη. Το κεπτικό μας ήταν εξ αρχής ότι δεν μπορούμε να λύουμε προβλήματα με αλγοριθμικό τρόπο παρά με το να ανάγουμε αυτά ε άλλα απλούτερα «υπο προβλήματα». Ως προς τούτο, δύο δρόμους έχουμε: είτε να χρηιμοποιήουμε υποπροβλήματα του ιδίου τύπου είτε διαφορετικού. Είδαμε τα προηγούμενα κεφάλαια μια ειρά τεχνικών που επιτρέπουν και οδηγούν την χεδίαη δρατικών αλγορίθμων χρηιμοποιώντας υποπροβλήματα του ιδίου τύπου. Στις τεχνικές αυτές η πρόοδος που προέκυπτε οφειλόταν την περιότερο ή λιγότερο δρατική μείωη του μεγέθους των δεδομένων. Θα δούμε τη υνέχεια μια ομάδα παρόμοιων μεταξύ τους τεχνικών, όπου χρηιμοποιούμε πάλι ιδίου τύπου προβλήματα, με διαφορετική όμως πηγή προόδου. Η τεχνική μας θα είναι η ταδιακή κατακευή μιας λύης. Αν θέλουμε να την εντάξουμε ε ένα ταξινομητικό χήμα θα μπορούαμε να πούμε πως εδώ η πρόοδος δεν προκύπτει επειδή διδονται λιγότερα δεδομένα, αλλά επειδή, κατά κάποια έννοια, δίδονται περιότερα από τα ζητούμενα: «ταδιακή κατακευή» θα ημαίνει για μας, ότι μαζί με τα δεδομένα μας δίδεται και μια «μερική» λύη το πρόβλημά μας και το ζήτημα είναι να βρεθεί μια «πληρέτερη» λύη, (κάτι που επαναλαμβανόμενο μας οδηγεί ταδιακά τη πλήρη λύη). αναγωγή ε υπο-προβλήματα του ιδίου τύπου αναδρομή (πρόοδος: αντιμετωπίζουμε λιγότερα δεδομένα) ταδιακές κατακευές (πρόοδος: γνωρίζουμε "περιότερα" ζητούμενα) διάπαη ε Θ(1) υποπροβλήματα χρήη πολλών υποπροβλημάτων αναγωγή ε "1" υποπρόβλημα S + = S {} + S > S + αξία( S ) > αξία( S) διαίρει & βαίλευε δυναμικός προγραμματιμός κλαματική αναγωγή «άπλητοι» αλγόριθμοι αυξητικές κατακευές τοπική αναζήτηη ε υπο-προβλήματα διαφορετικού τύπου ε "ένα" ε πολλά?? Αυτή η χέη «μερικό» «πληρέτερο» λαμβάνει τρείς κυρίως μορφές: Μας δίδεται ένα ύνολο S τοιχείων που αποτελούν μέρος της λύης, και ζητείται ένα ευρύτερο ύνολο S, που περιλαμβάνει όλα τα υπόλοιπα και ένα τουλάχιτον ακόμα. Η τεχνική αυτή ονομάζεται «άπλητη» τεχνική, (greedy technique), επειδή ό,τι επιλογές κάνει δεν τις αναιρεί. Μας δίδεται ένα ύνολο S τοιχείων που αποτελεί μερική λύη, και ζητείται ένα άλλο μεγαλύτερου μεγέθους S +, όχι κατ ανάγκη υπερύνολο του προηγουμένου. Η τεχνική αυτή ονομάζεται υχνά «αυξητική κατακευή» (incremental contruction). Μας δίδεται μια «λύη» και ένα μέτρο αξιολόγηη αυτής, αξία(s), και ζητείται μια άλλη «λύη» S + με μεγαλύτερη αξία(s + ). Επειδή ως καλύτερη λύη αναζητείται υνήθως μια «μικρή» τροποποίηη της προηγούμενης, η τεχνική αυτή ονομάζεται «τοπική αναζήτηη» (local earch). Θα δούμε τα επόμενα κεφάλαια μια ειρά παραδειγμάτων και για τις τρείς αυτές όψεις της ιδέας της ταδιακής κατακευής. Αρχίζουμε με ένα κλαικό, και «πανταχού παρόν» παράδειγμα ενός άπλητου αλγορίθμου. Πανεπιτήμιο Κρήτης Τμήμα Επιτήμης Υπολογιτών Γ.Φ. Γεωργακόπουλος ver: 17/5/2012 1
Το πρόβλημα των βραχύτερων υνδέεων «αφετηρίας» με «προοριμούς» Ένα ύνολο V «κόμβων» υνδέονται μεταξύ τους και κάθε ύνδεη έχει ένα μήκος (ή γενικότερα ένα κότος). Μας ενδιαφέρει πώς να υνδέουμε μια αφετηρία με όλους τους υπόλοιπους κόμβους κατά τον βραχύτερο (ή «οικονομικότερο» τρόπο). Με ποιές διαδρομές θα το επιτυγχάναμε; «ΟΜΟΑΦΕΤΗΡΙΑΚΕΣ ΒΡΑΧΥΤΕΡΕΣ ΔΙΑΔΡΟΜΕΣ» ΔΙΔΕΤΑΙ: (α) Ένα ύνολο V «κόμβων», και ένα ύνολο Ε V V «ακμών» μεταξύ τους (*). (β) ένα μήκος d(i, j) > 0 (ή «κότος») κάθε ακμής ύνδεης (i, j) Ε. (γ) ένας αφετηριακός κόμβος. ΖΗΤΕΙΤΑΙ: Ν = V διαδρομές γκ = κ, για κ = 1,..., Ν, με κοινή αφετηρία το, ΩΣΤΕ: το μήκος d(γκ) = dij (, ) να είναι το μικρότερο εξ όλων των διαδρομών κ. (, i j) γ κ (*) Οι ακμές (i, j) επιτρέπεται να έχουν κατεύθυνη, θεωρούνται δηλαδή ως διατεταγμένα ζεύγη Τί «χαρακτηριτικές ιδιότητες» θα έχει το ύνολο των βέλτιτων υνδέεων; Το πρόβλημα που αναλάβαμε μας ζητάει να κατακευάουμε ένα ύνολο αντικειμένων αν δεν αναλύουμε τις ιδιότητες που αυτό θα έχει δεν θα πρέπει να ελπίζουμε ε πολλά. (Κάτι τέτοιο θα ήταν αν να ζητούμε έναν ύποπτο για τον οποίο το μόνο που γνωρίζουμε είναι ότι έχει μαλλιά... : ) Τί, λοιπόν, δομικά χαρακτηριτικά περιμένουμε από το ύνολο των διαδρομών που αναζητούμε; Το 1 ο και εύκολο χαρακτηριτικό είναι ότι εάν μια διαδρομή u1 u2... uk un είναι η βραχύτερη από την αφετηρία προς τον κόμβο un, τότε ένα αρχικό τμήμα αυτή της διαδρομής (έως έναν ενδιάμεο κόμβο uk) θα είναι επίης η βέλτιτη διαδρομή έως αυτόν: διότι εάν μια άλλη διαδρομή γ: uk ήταν η βέλτιτη τότε ακολουθώντας αυτήν έως το uk και υνεχίζοντας όπως πριν, θα είχαμε μια διαδρομή έως τον κόμβο un καλύτερη από την βέλτιτη, και αυτό είναι άτοπο. u n βέλτιτη; x βέλτιτη γ? u 1 u k... επίης βέλτιτη... u 2 ε y i? j ε x y βέλτιτη Το 2 ο χαρακτηριτικό περιέχει το ίδιο κεπτικό: εάν έχουμε δύο βέλτιτες διαδρομές από την αφετηρία προς δύο προοριμούς x και y, x, y, αυτές θα έχουν ένα κοινό τμήμα (την αφετηρία τουλάχιτον!), και μετά από κάποιο κόμβο i θα χωρίζουν (κατ ανάγκην αφού x y!). Μετά τον χωριμό τους αυτές οι δύο διαδρομές δεν θα μπορούν πια να υναντηθούν εκ νέου ε κάποιο κόμβο j. Για την ακρίβεια δεν θα χρειάζεται να υναντηθούν, διότι οι 2 διαδρομές (βλ. χήμα) i εx x, και i εy y θα έπρέπε να είχαν ακριβώς το ίδιο μήκος, αλλιώς η βραχύτερη από αυτές θα βελτίωνε την διαδρομή που περιέχει την μακρύτερη από αυτές η βελτίωη όμως του ήδη βέλτιτου είναι αδύνατη. Εάν λοιπόν γνωρίζουμε τις βέλτιτες διαδρομές προς ένα ύνολο κόμβων, το ύνολο των ακμών από τις οποίες αποτελούνται (1 ον ) θα είναι υνδεδεμένο και (2 ον ) δεν θα εμφανίζει κύκλους, θα είναι δηλαδή ένα δένδρο προφανώς με ρίζα τον αφετηριακό κόμβο. Σε αυτό το ημείο αρχίζει να διαφαίνεται το γιατί θα μπορούαμε να ελπίουμε ε μια ταδιακή κατακευή της λύης του προβλήματός μας: Πανεπιτήμιο Κρήτης Τμήμα Επιτήμης Υπολογιτών Γ.Φ. Γεωργακόπουλος ver: 17/5/2012 2
«ΟΜΟΑΦΕΤΗΡΙΑΚΕΣ ΒΡΑΧΥΤΕΡΕΣ ΔΙΑΔΡΟΜΕΣ» ΔΕΝΔΡΙΚΗ ΕΚΔΟΧΗ ΔΙΔΕΤΑΙ: (Ό,τι την αρχική διατύπωη) και, ένα δένδρο Τ με ρίζα την αφετηρία, που δίδει τις βραχύτερες διαδρομές από την αφετηρία προς όλους τους υπόλοιπους κόμβους του. ΖΗΤΕΙΤΑΙ: Μια επαύξηη του Τ, δηλαδή μια πρόθετη ακμή (, π), Τ, π Τ, ΩΣΤΕ: η διαδρομή π, (εντός Τ υν ακμή (,π)), να είναι η βέλτιτη διαδρομή π. Θα υπάρχει πάντοτε μια τέτοια επαύξηη, και ποιά είναι αυτή; Από τί χαρακτηριτικά θα μπορούαμε να την αναγνωρίουμε αν όχι και να την κατακευάουμε; Ας δούμε το επόμενο χήμα ένα παράδειγμα της κατάταης που προκύπτει: Ένα ύνολο Σ κόμβων (κίτρινο χρώμα) έχει υνδεθεί κατά βέλτιτο τρόπο με την αφετηρία, μέω διαδρομών που χηματίζουν ένα δένδρο Τ (μαύρες ακμές) με ρίζα το. Τα μήκη των διαδρομών έως αυτούς είναι 12, 12+8, 9, 9+6 και 9+4. Ένα ύνολο Π κόμβων (φαιό χρώμα) παραμένουν ως προοριμοί αύνδετοι με την αφετηρία. Ένα ύνολο ακμών οι ερυθρές «γέφυρες», δηλαδή η τομή Ε (Σ Π) ) υνδέουν τους ήδη υνδεδεμένους κόμβους με (κάποιους από) τους υπόλοιπους προοριμούς. Αυτό που χρειαζόματε και αρκεί για να επαυξήουμε το δένδρο Τ είναι μια ακμή γέφυρα. Ποιά θα μπορούε να είναι η κατάλληλη; 12 8 6 γέφυρες Γ 18 D() = 15 Δ(, π) = 15 + 10 10 5 π 15 6 9 Τ 4 16 Σ 19 Δ(-, -) = 32 Π Ας προέξουμε εδώ ότι το δένδρο Τ μας δίδει την οριτική βέλτιτη απόταη D( ) των κόμβων του από την αφετηρία, π.χ. η βέλτιτη απόταη του κόμβου από το είναι 9+6 = 15. Κάθε γέφυρα μας προφέρει μια δυνατότητα πρόβαης ε κάποιο κόμβο, και υνεπώς μια πειραματική απόταη έως αυτόν π.χ. η γέφυρα (, π) μας προφέρει για τον κόμβο π την διαδρομή π (η βέλτιτη εντός του Τ και τη υνέχεια η ακμή (, π), και την «πειραματική» απόταη D() + d(,π) = 15+10 = 25. Αν αυτή η απόταη είναι η βέλτιτη από όλες τις διαδρομές π, τότε ΟΚ. Εάν όμως δεν είναι, τί υμπεραίνουμε; Και είναι εύλογο να ρωτήουμε «τί υμπεραίνουμε;» διότι εάν μια διαδρομή δεν είναι η βέλτιτη τότε κάτι πρόθετο υπάρχει (πληροφορία μη τετριμμένη την οποία πρέπει πάντοτε να εξετάζουμε): εδώ θα υπάρχει εκείνη η άλλη διαδρομή που είναι βραχύτερη (ή και βέλτιτη, φυικά). Εάν, λοιπόν, μια γέφυρα (, π) προφέρει για το άκρο προοριμό της π, μια πειραματική απόταη Δ(, π) που δεν είναι η οριτικά μικρότερη δυνατή, τότε μια άλλη διαδρομή γ: π, θα έχει καθαρά μικρότερο μήκος Dγ < Δ(,π) = D() + d(,π). Αυτή η διαδρομή έχει όμως αφετηρία το Σ, και καταλήγει το π Π, επομένως περιέχει έναν «τελευταίο» κόμβο το Σ, και αμέως μετά έναν «πρώτο» π το Π. Θα έχουμε δηλαδή μια ακμή γέφυρα (, π ), η οποία προφέρει για το άκρο π μια πειραματική απόταη Δ(, π ). Η απόταη αυτή είναι προφανώς μικρότερη από το μήκος της όλης διαδρομής γ, και το οποίο είναι καθαρά μικρότερο από την πειραματική απόταη Δ(, π), δηλαδή: Πανεπιτήμιο Κρήτης Τμήμα Επιτήμης Υπολογιτών Γ.Φ. Γεωργακόπουλος ver: 17/5/2012 3
Δ(, π ) Dγ < Δ(, π), δηλαδή: Δ(, π ) < Δ(, π). γέφυρες Γ D() Δ(, π) = D() + d(, π) π Σ ' D(' ) Δ(', π') = D( ) + d(', π') π' Π γ, D γ Τελειώαμε! Εάν η πειραματική απόταη που δίδει μια γέφυρα (, π) δεν είναι η οριτικά βέλτιτη, τότε αυτό υμβαίνει επειδή μια άλλη γέφυρα (, π ) δίδει καθαρά μικρότερη πειραματική απόταη (για το δικό της άκρο). Αυτό δεν μπορεί όμως να υμβαίνει διαρκώς: εάν λάβουμε την γέφυρα (*, π*) με την ελάχιτη πειραματική απόταη, τότε ως προς αυτήν δεν υπάρχει άλλη μικρότερη επομένως αυτή θα δίδει την οριτικά βέλτιτη απόταη για τον προοριμό της π*! Είματε λοιπόν ε θέη να επαυξήουμε το δένδρο που μας δίδεται, έτι ώτε να παρέχει την βέλτιτη διαδρομή για έναν ακόμα κόμβο: παράγουμε όλες τις ακμές γέφυρες ως προς το δεδομένο δένδρο, και χρηιμοποιούμε για την αύξηή του εκείνη την γέφυρα που δίδει την ελάχιτη πειραματική απόταη. Για να βρούμε τις βραχύτερες διαδρομές προς όλους τους κόμβους αρκεί να αρχίουμε από το τετριμμένο δένδρο με ένα κόμβο (την αφετηρία) και να επαναλάβουμε την προηγούμενη διαδικαία V 1 φορές. Δεν έχουμε παρά να γράψουμε τον χετικό ψευδοκώδικα και να εκτιμήουμε την χρονική πλοκή που εμφανίζει. Στο κώδικα που ακολουθεί μια γέφυρα παρίταται ως <(α,β), Δ>, όπου α είναι η αρχή της, β είναι το άκρο προοριμός, και Δ είναι η πειραματική απόταη που προφέρει. Αλγόριθμος «Ομοαφετηριακές βραχύτερες διαδρομές» (αρχική εκδοχή) Διαδικαία Διαδρομές( V: κόμβοι, E: ακμές, d: μήκη-ακμών, : αφετηρία) { // εναρκτήρια τιμοδότηη D[] 0 // οριτική απόταη αφετηρίας Π 0 V-{} // προοριμοί Σ 0 {} // αφετηρία T 0 // αρχικό δένδρο υνδέεων Γ 0 // αρχικές «γέφυρες» Για α=, β Π 0, (α,β) Ε { Δ d(α,β), Γ 0 Γ 0 + <(α,β),δ> } // ταδιακή «άπλητη» κατακευή k 0 Εφόον Π k { <(,π),δ> min{γ k } ως προς Δ // πληιέτερο π (ως προς Δ) D[π] Δ // οριτική απόταη π Π k+1 Π k - {π} // υπόλοιποι προοριμοί Σ k+1 Σ k + {π} // κόμβοι υνδετικού δένδρου T k+1 T k + (,π) // ακμές υνδετικού δένδρου Γ k+1 // επόμενες «γέφυρες» Για α Σ k+1, β Π k+1, (α,β) Ε { Δ D[α]+d(α,β), Γ k+1 Γ k+1 + <(α,β),δ> } k k+1 } } Πανεπιτήμιο Κρήτης Τμήμα Επιτήμης Υπολογιτών Γ.Φ. Γεωργακόπουλος ver: 17/5/2012 4
Η ανάλυη πλοκής δεν είναι δύκολη: αφού ε κάθε βήμα αυξάνουμε το ύνολο Σ των κόμβων που είναι βέλτιτα υνδεδεμένοι με την αφετηρία κατά +1, θα κάνουμε V 1 βήματα. Σε κάθε βήμα όμως εξετάζουμε όλες τις ακμές για να διαπιτώουμε ποιές είναι οι (τρέχουες) γέφυρες, και αυτό κοτίζει Ε βήματα. Το ύνολο Θ( V E ) δεν είναι όμως τη χειρότερη περίπτωη προτιμότερο από το κότος Θ(Ν 3 ) (όπου Ν= V ) που είχαμε βρεί για το πρόβλημα της διαδρομών «από όλα ε όλα» (βλ. κεφάλαιο...). Οι ακμές μπορεί να είναι Θ(Ν 2 ), και ο αλγόριθμός μας θα έχει τη χειρότερη περίπτωη κότος επίης Θ(Ν 3 ). Και ας προέξουμε ότι τον ίδιο χρόνο παράγει μόνον Ν, και όχι Ν 2, διαδρομές... Το φάλμα του παραπάνω κώδικα είναι ότι παράγει τις απαιτούμενες γέφυρες κάθε φορά εξ αρχής. Κάτι τέτοιο δεν είναι όμως απαραίτητο διότι η μεταβολή των γεφυρών Γk Γk+1 δεν οφείλεται παρά την μετακίνηη ενός κόμβου π από τους προοριμούς Π εντός του Σ: Σ Σ+π, Π Π π. Είναι εύλογο λοιπόν να προπαθήουμε να παράγουμε τις εκάτοτε γέφυρες ταδιακά, ενημερώνοντας το προηγούμενο ύνολο γεφυρών Γk ώτε να μας δίδει το επόμενο Γk+1. Στον ακόλουθο χήμα εμφαίνεται τί μεταβολή προκαλείται τις γέφυρες από την μετακίνηη του π από εκτός του Σ εντός αυτού: Σ α πρώην γέφυρες Γ D(π) = 25 5 π β νέες γέφυρες Γ' 15 6 Δ(π, β) = 30 Δ( _, β) = 32 Π Οι μόνες τροποποιήεις του Γk που χρειάζονται αφορούν ακμές ένα άκρο των οποίων είναι ο μετακινούμενος κόμβος π (το χήμα: ερυθρο κίτρινος): Διαγράφουμε από τις γέφυρες όες έχουν την μορφή (α, π) για α Σ (υνδεδεμένοι). Ειάγουμε τις γέφυρες όες ακμές έχουν την μορφή (π, β) για β Π (προοριμοί). (Οι γέφυρες αυτές παράγουν νέες πειραματικές αποτάεις ακόμα και για κόμβους που έχουν ήδη τέτοιες. Στο χήμα παράγονται οι αποτάεις 25+15, 25+6 και 25+5. Η τελευταία είναι καλύτερη από την ήδη υπάρχουα). Ο χετικός κώδικας ακολουθεί. Αλγόριθμος «Ομοαφετηριακές βραχύτερες διαδρομές» δυναμικές γέφυρες Διαδικαία Διαδρομές( V: κόμβοι, E: ακμές, d: μήκη-ακμών, : αφετηρία) { // εναρκτήρια τιμοδότηη... // ταδιακή «άπλητη» κατακευή k 0 Εφόον Π k { <(,π),δ) Ελάχιτο των Γ k ως προς Δ // πληιέτερο π D[π] Δ // οριτική απόταη π Π k+1 Π k - {π} // υπόλοιποι προοριμοί Σ k+1 Σ k + {π} // κόμβοι υνδετικού δένδρου T k+1 T k + (,π) // ακμές υνδετικού δένδρου Γ k+1 Γ k // επόμενες «γέφυρες» Για (α,π) Ε & α Σ k+1 { Διαγράφουμε <(α,π),_> από Γ k+1 } Για (π,β) Ε & β Π k+1 { Δ D[π]+d(π,β), Ειάγουμε <(π,β),δ> το Γ k+1 } k k+1 } } Πανεπιτήμιο Κρήτης Τμήμα Επιτήμης Υπολογιτών Γ.Φ. Γεωργακόπουλος ver: 17/5/2012 5
Αλλά και αυτή η εκδοχή επιδέχεται εύκολα βελτίωη υγκεκριμμένα δύο βελτιώεις, αρκετά χαρακτηριτικές και οι δύο: Έχει πλέον καταφανεί η φύη του υνόλου των γεφυρών: είναι ένα ύνολο τοιχείων το οποίο μεταβάλλεται δυναμικά, και επί του οποίου τίθεται επανειλημμένα το ίδιο ερώτημα, και υγκεκριμμένα «ποιό είναι το ελάχιτο τοιχείο;». Αυτή είναι η αρχετυπική περίπτωη μιας δομής δεδομένων και εδώ αναγνωρίζουμε την δομή που έχει ονοματεί ΟΥΡΑ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ: μια δομή επί της οποίας ορίζονται οι λειτουργίες INSERT (ειαγωγή), DELETE (διαγραφή) και MINIMUM (εντοπιμός ελαχίτου). Η λειτουργία διαγραφής είναι κατά κανόνα μια δαπανηρή λειτουργία τις δομές δεδομένων, και μπορεί να γίνει μόνον αφού εντοπίουμε το διαγραφόμενο τοιχείο εντός της δομής. Μπορούμε όμως να αναβάλουμε αυτόν τον εντοπιμό & διαγραφή. Η ιδέα αυτή, που έχει γενικότερη αλγοριθμική αξία, λέει: «ανάβαλε μια ενέργεια, αν αναμένονται ευνοϊκότερες υνθήκες μελλοντικά». Και εδώ, πράγματι, αρκεί να περιμένουμε έως ότου η υπό διαγραφή γέφυρα εντοπιτεί κάποια τιγμή ως η τρέχουα ελάχιτη. Ο χετικός κώδικας ακολουθεί. Ας προέξουμε εδώ τα εξής δύο: Η αναβολή των διαγραφών μας επιβάλλει όταν λαμβάνουμε μια γέφυρα (, π) από την ουρά να ελέγχουμε εάν ο προοριμός π είναι πράγματι «νέος» ή προκύπτει εξ αναβολής (και «έπρεπε» να είχε διαγραφεί προ καιρού). Ο έλεγχος αν κάποιος κόμβος ανήκει τους προοριμούς ή όχι, «π Π; / Π Π+π / Π Π π» πραγματοποιείται εύκολα εάν κρατείται απλά μια ημείωη «ναί όχι» για κάθε κόμβο που δηλώνει το εάν αυτός έχει ήδη ενταχθεί το υπό κατακευή δένδρο ή όχι. Αλγόριθμος «Ομοαφετηριακές βραχύτερες διαδρομές» δυναμικές γέφυρες, αναβλητικά Διαδικαία Διαδρομές( V: κόμβοι, E: ακμές, d: μήκη-ακμών, : αφετηρία) { // εναρκτήρια τιμοδότηη D[] 0 // οριτική απόταη αφετηρίας Π V-{} // προοριμοί Σ {} // αφετηρία T // αρχικό δένδρο υνδέεων Γ // αρχικές «γέφυρες» (για ) Για α=, β Π, (α,β) Ε { Δ d(α,β), Γ.INSERT(<(α,β),Δ>) } // ταδιακή «άπλητη» κατακευή Εφόον Π { <(,π),δ> Γ.MINIMUM // πληιέτερος π ως προς D[-] Γ.DELETE-MINIMUM // διαγραφή min γέφυρας προς π Εάν π Π τότε // προφέρει νέο κόμβο-προοριμό; { D[π] Δ // οριτική απόταη π Π Π - {π} // υπόλοιποι προοριμοί Σ Σ + {π} // κόμβοι υνδετικού δένδρου T T + (,π) // ακμές υνδετικού δένδρου // πρόθετες «γέφυρες» Για α=π, β Π, (α,β) Ε { Δ D[α]+d(α,β), Γ.INSERT(<(α,β),Δ>) } } } } Είναι αρκετά εύκολο να υλοποιηθεί μια τέτοια ΟΥΡΑ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ με επιδόεις Ο(logN), O(logN), O(1) για τις τρείς λειτουργίες INSERT, DELETE, MINIMUM αντιτοίχως. Στον παραπάνω κώδικα ο βρόχος «εφόον» επαναλαμβάνεται Ε φορές, διότι τόες ακμές γέφυρες θα ειαχθούν και (κάποια τιγμή) θα διαγραφούν, επομένως ο υνολικός λογαριαμός θα μας δώει πλοκή Θ( Ε log E ) = Θ( E log V ). Αυτή η πλοκή είναι O(N 2 logn), αρκετά μικρότερη από Θ(Ν 3 ) όπως επιδιώκαμε εξ αρχής. Μπορούμε και καλύτερα! αλλά αυτό το αφήνουμε για μια άλλη ευκαιρία. Πανεπιτήμιο Κρήτης Τμήμα Επιτήμης Υπολογιτών Γ.Φ. Γεωργακόπουλος ver: 17/5/2012 6