Αλγόριθμοι Eλάχιστα μονοπάτια Μάρθα Σιδέρη Προτεινόμενη βιβλιογραφία: S. Dasgupta, C.H. Papadimitriou, and U.V. Vazirani «Αλγόριθμοι» Κλειδάριθμος 009 Κεφάλαιο. http://www.cs.berkeley.edu/~vazirani/algorithms/chap.pdf epl lect6 0 Algorithm BFS(G=(V,E):graph, s : node) { Q: queue of nodes; dist(s)=0; for all u in V dist(u)= - enqueue(s); 6 while Q nonempty do { v=dequeue(q); 8 previsit(v); 9 for each edge (v, w) out of v do 0 if dist(w)= - then {dist(w)=dist(v)+; % prev(w)=v; enqueue(w);}}} (γ) epl lect6 0
Παράδειγμα εκτέλεσης αλγορίθμου αναζήτησης κατά πλάτος http://eclass.aueb.gr/modules/docaueb ument/file.php/inf6/examples% 00/BFS.ppsx epl lect6 0 O BFS υπολογίζει σωστά ελάχιστα μονοπάτια Ο BFS υπολογίζει σωστά ελάχιστα μονοπάτια (σε αριθμό ακμών από τον αρχικό κόμβο) Γιατί; Επαγωγή Βάση: ισχύει για τον s (dist(v)=0) Υπόθεση: ισχύει για dist(v)=k Βήμα: κάθε κόμβος v με dist(v)=k+ έχει ακμή από κόμβο u με dist(u)=k και δεν έχει ακμή από κόμβο με μικρότερο dist epl lect6 0
Εφαρμογές ελάχιστων μονοπατιών: routing protocols, π.χ. Open Shortest Path First epl lect6 0 Αν οι ακμές έχουν βάρη; Μπορούμε να χρησιμοποιήσουμε BFS? Ναι, αν προσθέσουμε κόμβους στο γράφημα. epl lect6 0 6
Πως το κάνουμε πιο έξυπνα? Αλγόριθμος Dijkstra Athens University of Economics awarded him an honorary doctorate in 00. "The question of whether computers can think is like the question of whether submarines can swim"; epl lect6 0 Ελάχιστα μονοπάτια από ένα κόμβο Ποια είναι η ελάχιστη απόσταση του G? 6 epl lect6 0 8
Ελάχιστα μονοπάτια από ένα κόμβο, αλγόριθμος του Dijkstra algorithm Dijkstra(G=(V, E) γράφημαμεθετικάβάρη, s: κόμβος) {H: ουρά προτεραιότητας (π.χ.heap) με κλειδί το πεδίο dist; for each v in V do {/* ΜΑΧΙΝΤ είναι πολύ μεγάλος ακέραιος*/ dist(v) = MAXINT prev(v) = nil;} dist(s)=0; H= makequeue(v); while H nonempty do {v=deletemin(h); for each edge (v, w) out of v do if dist(w) > dist(v) + length(v, w) then {dist(w) = dist(v) + length(v, w); prev(w) = v; decreasekey(w, H);} relax(v,w) } } epl lect6 0 9 Παράδειγμα εκτέλεσης αλγορίθμου Dijkstra http://eclass.aueb.gr/modules/doc ument/file.php/inf6/examples% 00/Dijkstra.pps epl lect6 0 0
Αλγόριθμος του Dijkstra Τερματίζει? Είναι ορθός? Πόσο γρήγορος είναι? epl lect6 0 Ορθότητα αλγορίθμου Dijkstra v: κοντινότερος στο s από όλους εκτός R Ποιος είναι προηγούμενος στο ελάχιστο μονοπάτι? epl lect6 0 6
Αλγόριθμος του Dijkstra Τερματίζει? Είναι ορθός? Πόσο γρήγορος είναι? epl lect6 0 algorithm Dijkstra(G=(V, E) γράφημα με θετικά βάρη, s: κόμβος) {H: ουρά προτεραιότητας με κλειδί το πεδίο dist; for each v in V do {dist(v) = ; n prev(v) = nil;} dist(s)=0; H= makequeue(v); n φορές insert while H nonempty do {v=deletemin(h); n φορές deletemin for each edge (v, w) out of v do if dist(w) > dist(v) + length(v, w) then {dist(w) = dist(v) + length(v, w); prev(w) = v; decreasekey(w, H);} e φορές decreasekey } } n n insert n deletemin e decreasekey n ( n e) insert n deletemin epl lect6 0
Πολυπλοκότητα αλγορίθμου Dijkstra n.deletemin()+(e+n).insert(), όπου n= V, e= E Υλοποίηση ουράς προτεραιότητας deletemin insert n. deletemin + (n+e).insert συνδ. λίστα, πίνακας O(n) O(n ) Heap σωρός θυμάστε χρόνους για deletemin? insert? epl lect6 0 Heaps: Δομή Σωρού πλήρες δυαδικό δένδρο ίσως εκτός από το κατώτατο στάδιο, όπου είναι γεμάτο από αριστερά προς τα δεξιά. epl lect6 0 6 8
Ύψος δυαδικού δένδρου βάθος 0 Ύψος = Βάθος Βάθος epl lect6 0 Πλήρες δυαδικό δένδρο Δυαδικό δένδρο, στο οποίο όλοι οι εσωτερικοί κόμβοι έχουν ακριβώς παιδιά. Κάθε κόμβος που δεν είναι φύλλο έχει παιδιά Όλα τα φύλλα είναι στο ίδιο βάθος. κόμβος Βάθος = κόμβοι κόμβοι epl lect6 0 8 9
Πλήρες δυαδικό δένδρο συνέχεια Για πλήρες δυαδικό δένδρο ύψους h Αριθμός φύλλων = h Αριθμός εσωτερικών κόμβων = h - Συνολικός αριθμός κόμβων = h+ - Για πλήρες δυαδικό δένδρο με n φύλλα Ύψος, h = logn epl lect6 0 9 Heaps: Δομή Σωρού πλήρες δυαδικό δένδρο ίσως εκτός από το κατώτατο στάδιο, όπου είναι γεμάτο από αριστερά προς τα δεξιά. Αν το δένδρο περιλαμβάνει n κόμβους το ύψος h είναι h = log (n) epl lect6 0 0 0
Η σωρός έχει την εξής ιδιότητα (heap property) Τιμή ενός κόμβου τιμές των παιδιών του 6 Η ρίζα έχει τη μικρότερη τιμή. 0 epl lect6 0 Η σωρός έχει την εξής ιδιότητα (heap property) Τιμή ενός κόμβου τιμές των παιδιών του 6 Η ρίζα έχει τη μικρότερη τιμή. 0 epl lect6 0
Η σωρός έχει την εξής ιδιότητα (heap property) Τιμή ενός κόμβου τιμές των παιδιών του 6 Η ρίζα έχει τη μικρότερη τιμή. 0 epl lect6 0 Υλοποίηση σωρού array Έστω ο κόμβος με δείκτη i PARENT(i), πατέρας στο δένδρο 6 LEFT(i) αριστερό παιδί στο δένδρο RIGHT(i) δεξιό παιδί στο δένδρο 0 6 PARENT(i) = i/ LEFT(i) = i RIGHT(i) = i + 6 A 6 0 heap-size(a) = 6 epl lect6 0
Παράδειγμα HEAPIFY(A,) όταν heap-size(a) size(a)=6= 6 6 A 6 Δεν ισχύει η ιδιότητα epl lect6 0 HEAPIFY(A,) HEAPIFY(A,) 6 6 Ισχύει η heap property 6 epl lect6 0 6
Παράδειγμα:deletemin 6 8 9 0 A 9 0 8 6 9 6 0 8 9 0 Νέα ρίζα 8 6 epl lect6 0 Παράδειγμα:deletemin 6 8 9 0 A 6 9 0 8 6 9 6 0 8 9 8 epl lect6 0 8
Παράδειγμα:deletemin 6 8 9 0 A 6 9 0 8 6 9 6 0 8 9 8 epl lect6 0 9 Παράδειγμα:deletemin 6 8 9 0 A 6 9 0 8 6 9 6 0 8 9 8 epl lect6 0 0
Παράδειγμα:deletemin 6 8 9 0 A 8 9 0 6 8 9 6 0 8 9 6 Χρόνος εκτέλεσης O(lg n) epl lect6 0 Παράδειγμα:insert(h, 6) 6 8 9 0 A 8 9 0 6 6 8 9 6 0 8 9 6 6 epl lect6 0 6
Παράδειγμα:insert(h, 6) 6 8 9 0 A 8 6 9 0 6 8 6 9 6 0 8 9 6 Χρόνος εκτέλεσης O(lg n) epl lect6 0 decrease key κόμβου 9 από 6 σε 6 8 9 0 A 8 6 9 0 8 6 9 6 0 8 9 epl lect6 0
decrease key του κόμβου 9 από 6 σε 6 8 9 0 A 6 9 0 8 6 9 6 0 8 9 8 Χρόνος εκτέλεσης O(lg n) epl lect6 0 Πολυπλοκότητα αλγορίθμου Dijkstra n.deletemin()+(e+v).insert(), όπου n= V, e= E Υλοποίηση heap deletemin insert n.deletemin +(e+n) (e+n).insert συνδ. λίστα, πίνακας O(n) O(n ) σωρός: binary heap O(logn) O(logn) O((e+n).logn) epl lect6 0 6 8
Τριαδική σωρός: πλήρες τριαδικό δένδρο, εκτός ίσως από το τελευταίο επίπεδο. 8 9 0 Ύψος log n _, floor, κατώφλιο epl lect6 0 Τριαδική σωρός: πλήρες τριαδικό δένδρο, εκτός ίσως από το τελευταίο επίπεδο. 8 9 0 Τιμή ενός κόμβου <= τιμές των παιδιών του, (τοπικά) Ύψος log n _, floor, κατώφλιο epl lect6 0 8 9
Τριαδική σωρός:deletemin 8 9 0 Θα γίνει νέα ρίζα epl lect6 0 9 Τριαδική σωρός:deletemin 8 9 0 Ύψος log n epl lect6 0 0 0
Τριαδική σωρός:deletemin 8 9 0 epl lect6 0 Τριαδική σωρός:deletemin 8 9 0 Χρόνος εκτέλεσης log n (log n) log Για να βρούμε το μικρότερο από n χρειαζόμαστε n- συγκρίσεις epl lect6 0
Τριαδική σωρός: insert, decrease key 8 9 0 6 (log n) Χρόνος εκτέλεσης log n log Κάθε ένας συγκρίνεται μόνο με τον πατέρα του epl lect6 0 d-αδική σωρός:deletemin. 8 0. Χρόνος εκτέλεσης d(log n) d d log n log d epl lect6 0
d-αδική σωρός:insert, decrease key. 8 0. Χρόνος εκτέλεσης log d n log n log d epl lect6 0 Πολυπλοκότητα αλγορίθμου Dijkstra n.deletemin()+(e+n).insert(), όπου n= V, e= E Υλοποίηση heap deletemin insert n.deletemin +(e+n) (e+n).insert συνδ. λίστα, πίνακας O(n) O(n ) σωρός: binary heap O(logn) O(logn) O((e+n).logn) d-αδική heap O(dlogn/logd) O(logn/logd) O((nd+e).(logn/logd)) O((nd+e)(logn/logd)) Fibonacci heap O(logn) O() O(nlogn +e) epl lect6 0 6
Πολυπλοκότητα αλγορίθμου Dijkstra n.deletemin()+(e+n).insert(), όπου n= V, e= E Υλοποίηση heap deletemin insert n.deletemin + (e+n).insert d-αδική heap O(dlogn/logd) O(logn/logd) O((nd+e).(logn/logd)) Μπορούμε να μεταβάλουμε το d. Ποιο d δίνει καλύτερα αποτελέσματα?? epl lect6 0 Πολυπλοκότητα αλγορίθμου Dijkstra n.deletemin()+(e+n).insert(), όπου n= V, e= E Υλοποίηση heap deletemin insert n.deletemin + (e+n).insert d-αδική heap O(dlogn/logd) O(logn/logd) O((nd+e).(logn/logd)) (logn/logd)) Έστω ότι παίρνουμε τη μέση πυκνότητα d=e/n του γραφήματος και δίνουμε τιμή στο d. Έχουμε τα καλύτερα αποτελέσματα!! Για πυκνά γραφήματα: n Για αραιά γραφήματα nlog n Για ενδιάμεσα γραφήματα e epl lect6 0 8
Πως βρίσκουμε τα αποτελέσματα για e d n Πράξεις στη σχέση log n ( nd e) log d Πυκνά: e n Αραιά: e n Τι εννοούμε ενδιάμεσα γραφήματα? e n epl lect6 0 9