ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΜΕΤΑΠΤΥΧΙΑΚΟ ΠΡΟΓΡΑΜΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ Σχεδίαση και Ανάλυση Αλγορίθμων Διδάσκων: Ε. Μαρκάκης, Φθινοπωρινό εξάμηνο 2014-2015 Λύσεις 3ης Σειράς Ασκήσεων Πρόβλημα 2. Εστω ένας γράφος G = (V, E). Ενα υποσύνολο ακμών E E ονομάζεται σύνολο α- κμών ανάδρασης, αν τέμνει κάθε κύκλο του γραφήματος. Κάθε κύκλος του γραφήματος δηλαδή έχει τουλάχιστον μια ακμή που ανήκει στο Ε. Επομένως αφαιρώντας τις ακμές του E, το γράφημα ϑα γίνει άκυκλο. Σχεδιάστε έναν αποδοτικό αλγόριθμο για το εξής πρόβλημα: σε είσοδο ένα γράφημα με ϑετικά βάρη στις ακμές του, ο αλγόριθμος πρέπει να υπολογίζει ένα σύνολο ακμών ανάδρασης ελαχίστου συνολικού βάρους. Απάντηση. [Παπαευσταθίου] Ενα σύνολο S είναι σύνολο ακμών ανάδρασης στο G αν τέμνει κάθε κύκλο του γραφήματος. Διαφορετικά το S είναι σύνολο ακμών ανάδρασης στο G αν κάθε κύκλος στο G περιέχει τουλάχιστον μία ακμή στο S. Για κάθε σύνολο ακμών ανάδρασης S αν αφαιρέσουμε το S από το γράφημα G, τότε αυτό που ϑα μείνει ϑα είναι ένα δέντρο. Άρα η ελαχιστοποίηση του βάρους του συνόλου ακμών ανάδρασης S ισοδυναμεί με το να μεγιστοποιήσουμε το βάρος αυτού του δέντρου. Συνεπώς το σύνολο ακμών ανάδρασης ελαχίστου βάρους είναι το συμπλήρωμα του μέγιστου spanning tree στο γράφημα G. Algorithm 1 minweightedfeedbackedges et(g) MaxS T = FindmaximumspanningT ree(g) //see algorithm 2 S = MaxS T //find the complement of the maximum spanning tree return S Algorithm 2 FindmaximumspanningT ree(g) T = sort the edges in decreasing order while T n 1 do if T e does not create cycle then add the edge e to T end if end while return T 1
O(nlogn) για το sorting, και O( E log E ) για την εύρεση του maxi- Πολυπλοκότητα: mum spanning tree. Πρόβλημα 3. Οι παρακάτω ερωτήσεις αφορούν τη χρήση ουρών προτεραιότητας,και συγκεκριμένα την υλοποίησή τους με σωρούς που είδαμε και στο μάθημα. 1. Ο σωρός που έχουμε δει στο μάθημα ονομάζεται δυαδικός σωρός (binaryheap), ε- πειδή χρησιμοποιούμε δυαδικό δέντρο για την αναπαράστασή του. Μια άλλη ιδέα για να υλοποιήσουμε μια ουρά προτεραιότητας είναι η χρήση d-αδικού σωρού, για κάποια μικρή τιμή του d. Π.χ. για d 3, αυτό σημαίνει ότι το δέντρο ϑα είναι πλέον τριαδικό, κάθε εσωτερικός κόμβος ϑα έχει 3 παιδιά, και ϑα εξακολουθούν να ισχύουν ό,τι είδαμε και στο δυαδικό σωρό, δηλαδή, το δέντρο ϑα έχει γεμάτα όλα τα επίπεδα εκτός ίσως του τελευταίου, και το κλειδί ενός κόμβου ϑα πρέπει να είναι μικρότερο ή ίσο από τα κλειδιά των παιδιών του. Οι λειτουργίες bubbleup και bubbledown ορίζονται επίσης με τον ίδιο τρόπο,όπως και πριν. Το πλεονέκτημα είναι ότι έτσι μπορεί να μειωθεί το ύψος του δέντρου. Δείξτε πόσο ϑα είναι το ύψος του δέντρου σε ένα d-αδικό σωρό με n στοιχεία και γιατί αυτό συνεπάγεται καποια (έστω μικρή) βελτίωση για την insert Εξηγήστε γιατί αυτό αντισταθμίζεται από καποια μικρή επιβάρυνση για την delete min. 2. Εστω ότι έχετε k ταξινομημένους πίνακες,και κάθε πίνακας έχει n στοιχεία.το k είναι μια παράμετρος με 1 k n. Θέλουμε να συγχωνεύσουμε τους πίνακες σε έναν ταξινομημένο πίνακα μεγέθους nk. Μία λύση είναι να βαλουμε όλα τα στοιχεία σε ένα νέο πίνακα μεγέθους nk, και να τον ταξινομήσουμε. Ποια η πολυπλοκότητα αυτής της λύσης; Σκεφτείτε πώς με τη χρήση δυαδικού σωρού, μπορούμε να πετύχουμε μια πιο αποδοτική υλοποίηση (ως συνάρτηση του k και του n). Απάντηση. [Κουτσούλης, Μιτσοπούλου, Χαριτίδης] 1. Ανάλυση για την insert: Κάθε μία νέα τιμή που εισέρχεται στον d-αδικό σωρό πηγαίνει στην τελευταία ελεύθερη ϑέση στο τέλος του σωρού. Επειτα γίνονται τόσες ενέργειες bubbleup όσες χρειάζονται. Η διαδικασία αυτή γίνεται συγκρίνοντας την τιμή του νέου στοιχείου με τον εκάστοτε γονέα και ανεβαίνοντας εάν είναι μικρότερο, ένα επίπεδο την φορά. Αυτό γίνεται τόσες φορές όσες χρειαστεί. Στο χειρότερο σενάριο (worst case scenario) ϑα ανέβει από το τελευταίο επίπεδο μέχρι και την ρίζα την οπο- ία ϑα αντικαταστήσει. Το ύψος στο σωρό είναι log x y, με x ο αριθμός των παιδιών του κάθε κόμβου στο δέντρο, και y το πλήθος των στοιχείων του δέντρου που υλοποιεί τον σωρό. Επομένως, το άθροισμα των συγκρίσεων αυτών στην χειρότερη περίπτωση είναι log d n, μία σύγκριση ανά επίπεδο, με τον εκάστοτε γονέα. Για d > 2 είναι log d n < log 2 n. Επομένως με την συγκεκριμένη υλοποίηση για κάθε εισαγωγή στον σωρό, γίνονται λιγότερες bubbleup ενέργειες από ότι με τον δυαδικό σωρό. Άρα βελτιώνεται ο χρόνος της διαδικασίας insert κατά την διαφορά αυτή. Οι δύο πολυπλοκότητες είναι: O(log 2 n) 2
για την υλοποίηση με δυαδικό σωρό και O(log d n) για την υλοποίηση με d-αδικό σωρό και O(log d n) < O(log 2 n). Ανάλυση για την delete min: Για την αφαίρεση στοιχείου από τον σωρό με την χρήση της delete min, αφαιρείται η ρίζα που είναι το μικρότερο στοιχείου της δομής δεδομένων. Επειτα, το τελευταίο στοιχείο του δέντρου έρχεται στην ϑέση της ρίζας και γίνονται τόσα bubbledown όσα χρειάζονται. Αντίστοιχα με την προηγούμενη περίπτωση, οι ενέργειες bubbledown στο χειρότερο σενάριο (worst case scenario) ϑα είναι από την κορυφή του δέντρου μέχρι και το τελευταίο επίπεδο. Σε αντίθεση με την προηγούμενη περίπτωση, σε κάθε επίπεδο η σύγκριση πρέπει να γίνει με κάθε παιδί του κόμβου. Θα πρέπει να γίνουν δηλαδή d συγκρίσεις ανά επίπεδο. Επομένως στο χειρότερο σενάριο ϑα γίνουν d log d n συγκρίσεις συνολικά. Στην υλοποίηση της δομής δεδομένων με δυαδικό σωρό, γίνονται μόνο 2 log 2 n συγκρίσεις, με πολυπλοκότητα O(2 log n), ή αλλιώς O(log n). Με την υλοποίηση του d-αδικού σωρού, η πολυπλοκότητα είναι O(d log d n), για την οποία ισχύει O(d log d n) > O(log n). Παρατηρήσεις: 1)Για την ακρίβεια, το ύψος του δέντρου με το οποίο υλοποιείται ο σωρός είναι: log x y + 1. Η πολυπλοκότητα στην προηγούμενη ανάλυση δεν επηρεάζεται. 2)Για d μικρό, η διαφορά με την δυαδική υλοποίηση είναι μικρή. Οταν το d είναι μεγάλο, τότε φαίνεται η διαφορά. Παραδείγματα: α)για d = 3, είναι: log 2 1000 9.97. ενώ log 3 1000 6.29. Με 2*9.97 20 και 3*6.29 19. β)για d = 10, τότε είναι: log 2 1000 9.97. ενώ log 10 1000 = 3. Με 2*9.97 20 και 10*3 30. 2. Για την πρώτη υλοποίηση, η πολυπλοκότητα είναι O(nk log 2 nk), χρησιμοποιώντας έναν από τους γνωστούς αλγόριθμους ταξινόμησης για τον οποίο το πλήθος των στοιχείων ϑα είναι n k. Η πολυπλοκότητα αυτή αναλύεται σε O(nk(log 2 n + log 2 k)) Μια υλοποίηση με χρήση δυαδικού σωρού ϑα μπορούσε να είναι η παρακάτω: 1)δημιουργία άδειου πίνακα Result μεγέθους n k, όπου ϑα αποθηκευτεί ο τελικός ταξινομημένος πίνακας 2)δημιουργία δυαδικού σωρού μεγέθους k. 3)εισαγωγή του πρώτου στοιχείου από τον κάθε πίνακα στον δυαδικό σωρό με την insert. Για το κάθε στοιχείο αποθηκεύεται και ο πίνακας από τον οποίο προήλθε 4)μέχρι να αδείασει ο δυαδικός σωρός: α)αφαίρεση του στοιχείου της ρίζας και εισαγωγή του στον πίνακα Result (χωρίς μεταφορά άλλου στοιχείου στην ρίζα και χωρίς bubbledown) β)αν υπάρχει κι άλλο στοιχείο του πίνακα από τον οποίο είχε εξαχθεί η προηγούμενη ρίζα, τότε εισαγωγή στην ρίζα του επόμενου στοιχείου αυτού και buddledown. Διαφορετικά γίνεται ανακατασκευή του σωρού, με μεταφορά του τελευταίου στοιχείου του σωρού στη ρίζα και bubbledown, κι έτσι μειώνοντας το μέγεθός του κατά έναν κόμβο (συνθήκη τερματισμού του βρόχου) 5)Στο τέλος του αλγορίθμου ο πίνακας Result έχει καταχωρημένα όλα τα στοιχεία όλων των πινάκων σε ταξινομημένη αύξουσα σειρά. 3
Το ύψος του δυαδικού σωρού είναι log 2 k + 1, με πολυπλοκότητα O(log 2 k). Τα πρώτα δύο βήματα είναι σταθερής πολυπλοκότητας. Το τρίτο βήμα απαιτεί k εισαγωγές στον σωρό με την insert, με κάθε εισαγωγή να έχει το πολύ log 2 k bubbleup ενέργειες για την insert. Άρα O(k log 2 k). Για το τέταρτο βήμα χρειάζονται το πολύ nk ανακατεσκευές με χρήση bubbledown, με O(log 2 k) κόστος η κάθε μία. Επομένως έχει πολυπλοκότητα O(nk log 2 k). Άρα η πολυπλοκότητα της λύσης αυτής είναι O(k log 2 k) + O(nk log 2 k), ή αλλιώς O((k log 2 k) + (nk log 2 k)), που είναι ίσο με O(nk log 2 k) για το οποίο προφανώς ισχύει: O(nk log 2 k) < O(nk(log 2 n + log 2 k)), επομένως υπάρχει μια μικρή βελτίωση. Πρόβλημα 4. Ενας τρόπος για να αποδείξει κανείς ότι ένα πρόβλημα Π είναι NP-πλήρες είναι με τη μέθοδο της γενίκευσης. Αυτό σημαίνει ότι πρέπει να δείξουμε ότι το Π αποτελεί γενίκευση κάποιου γνωστού NP-πλήρους προβλήματος (εμπεριέχει δηλαδή όλα τα instances ενός NP-πλήρους προβλήματος). Δείξτε με βάση αυτή την ιδέα ότι τα παρακάτω προβλήματα είναι NP-πλήρη, χρησιμοποιώντας τα NP-πλήρη προβλήματα που έχουμε ήδη δει. 1. Longest Path: Δεδομένου ενός γράφου G = (V, E), και ενός ακεραίου k, υπάρχει μονοπάτι με μήκος τουλάχιστον k. Θεωρήστε ότι δεν έχουμε βάρη και ότι το μήκος του μονοπατιού είναι το πλήθος των ακμών που χρησιμοποιεί. 2. Max-SAT: Δεδομένης μιας CNF φόρμουλας φ, και ενός ακεραίου k, υπάρχει μια απονομή αλήθειας που να ικανοποιεί τουλάχιστον k clauses. 3. Stingy SAT: Δεδομένης μιας CNF φόρμουλας φ, και ενός ακεραίου k, υπάρχει μια απονομή αλήθειας που να ικανοποιεί τη φόρμουλα και όπου το πολύ k μεταβλητές είναι true. Απάντηση. [Πετρίδης, Σπυριδάκης, Τσελεπάκης] 1. Longest Path: Αρχικά παρατηρούμε ότι το πρόβλημα Hamiltonian Path είναι μια ειδική περίπτωση του προβλήματος Longest Path για k = V 1, όπου k το ελάχιστο μήκος μονοπατιού του Longest Path. Το Longest Path έχει polynomial-time verification. Για να είναι ικανοποιήσιμο κάποιο certificate x = (V, E ) ενός instance I =< (V, E), k > του προβλήματος (όπου V V, E E), αρκεί να επιβεβαιωθεί ότι περιέχει μονοπάτι που καλύπτει όλους τους κόμβους v V και για το πλήθος των ακμών ισχύει E = V 1 (που επίσης εξασφαλίζει ότι το μονοπάτι είναι άκυκλο). Για να αποδείξουμε ότι το πρόβλημα είναι NP-hard, προχωράμε σε αναγωγή ( Hamiltonian Path P Longest Path). Εστω ένα instance I =< (V, E) > του προβλήματος Hamiltonian Path. Κατασκευάζουμε ένα instance I =< (V, E), k > του προβλήματος Longest Path, όπου k = V 1. Εστω επίσης ένα certificate x = (V, E ), V V, E E για τα I,I. 4
{ Αν το x ικανοποιεί το instance I προφανώς ικανοποιεί και το I εφόσον σημαίνει ότι περιέχει μονοπάτι μήκους V 1 και για το I ισχύει k = V 1. { Αν το x ικανοποιεί το instance I προφανώς ικανοποιεί και το I εφόσον σημαίνει ότι περιέχει μονοπάτι με μήκος τουλάχιστον k, όπου k = V 1. Συνεπώς το Longest Path NP και είναι NP-hard, άρα Longest Path NPC. 2. Max-SAT: Αρχικά παρατηρούμε ότι το CNF-SAT είναι μια ειδική περίπτωση του Max-SAT για k = m, όπου m ο συνολικός αριθμός των clauses στην φόρμουλα του προβλήματος. Το Max-SAT έχει προφανώς polynomial-time verification όπως και το CNF- SAT και άρα ανήκει στο NP. Για να αποδείξουμε ότι το Max-SAT είναι NP-hard προχωράμε σε reduction CNF-SAT P MAX-SAT. Εστω μια ένα instance I =< Φ > του CNF-SAT, όπου Φ μια boolean formula σε conjuctive normal form με m clauses. Κατασκευάζουμε ένα instance I =< Φ, k > του Max-SAT με k = m. { Αν ένα certificate ικανοποιεί το I προφανώς ικανοποιεί και το I, αφού ικανοποιούνται m clauses της Φ και k = m. { Αν ένα certificate ικανοποιεί το I προφανώς ικανοποιεί και το I, εφόσον ικανοποιούνται k clauses, το σύνολο δηλαδή των clauses της Φ, αφού k = m. Συνεπώς το Max-SAT NP και είναι NP-hard, άρα Max-SAT NPC. 3. Stingy SAT: Αρχικά παρατηρούμε ότι το CNF-SAT είναι μια ειδική περίπτωση του Stingy SAT για k = n, όπου n ο συνολικός αριθμός των variables στην φόρμουλα του προβλήματος. Το Stingy SAT προφανώς ανήκει στο NP καθώς μπορούμε να επιβεβαιώσουμε την εγκυρότητα μιας υποψήφιας λύσης σε πολυωνυμικό χρόνο. Για να αποδείξουμε ότι το Stingy SAT είναι NP-hard ϑα κάνουμε την εξής αναγωγή: CNF-SAT P Stingy SAT. Εστω μια ένα instance I =< Φ > του CNF-SAT, όπου Φ μια boolean formula σε conjuctive normal form με n variables. Κατασκευάζουμε ένα instance I =< Φ, k > του Stingy-SAT με k = n. { Αν ένα certificate ικανοποιεί το I προφανώς ικανοποιεί και το I, αφού ικανοποιείται η Φ με το πολύ n μεταβλητές να είναι true και k = n. { Αν ένα certificate ικανοποιεί το I προφανώς ικανοποιεί και το I, εφόσον ικανοποιείται η Φ με το πολύ k μεταβλητές να είναι true, όπου k = n (συνεπώς οσεσδήποτε από τις n μεταβλητές της Φ μπορούν να είναι true). Συνεπώς το Stingy-SAT NP και είναι NP-hard, άρα Stingy-SAT NPC. 5
Πρόβλημα 5. 1. Δώστε μια αναγωγή από το πρόβλημα SUBSET-SUM στο πρόβλημα PARTITION. 2. Το εξής πρόβλημα (3DM - 3-dimensional matching) αποτελεί γενίκευση των matching προβλημάτων σε διμερείς γράφους. Εστω 3 ξένα μεταξύ τους σύνολα X = x 1,..., x n, Y = y 1,..., y n, και Z = z 1,..., z n με n αντικείμενα το καθένα. Εστω επίσης ένα σύνολο T X Y Z, που αποτελείται από τριάδες της μορφής (x i, y j, z k ). Κάθε τριάδα περιέχει ακριβώς ένα αντικείμενο από τα X, Y, Z. Ενα 3-διάστατο ταίριασμα (matching) είναι ένα υποσύνολο του T, δηλαδή ένα συνολο από τριάδες που δεν έχουν κοινά στοιχεία μεταξύ τους. Αυτο σημαίνει ότι για οποιεσδήποτε 2 τριάδες του ταιριάσματος, (x 1, y 1, z 1 ) και (x 2, y 2, z 2 ), έχουμε x 1 x 2, y 1 y 2, z 1 z 2. Θελουμε να αποφασίσουμε αν υπάρχει ένα ταίριασμα με n τριάδες, δηλαδή ένα ταίριασμα που να καλύπτει όλα τα στοιχεία από τα X, Y, Z. Το 3DM είναι ένα από τα γνωστά NP-πλήρη προβλήματα. Δώστε μια απλή αναγωγή από το 3DM στο SAT, και μια από το 3DM στο SET COVER. Απάντηση. [Καρόζος, Μιχολιά, Φιλιππίδου] Set Cover (SC): There exists a universe U of n elements, as in Figure 1, and a collection of subsets C = {S 1, S 2,..., S m } where S i U with 1 i m and an integer k describing the minimum number of subsets that can cover the universe, such that C k. 3 Dimensional Matching (3DM): There exist 3 disjoint sets, X, Y, Z of n nodes each and T a subset that consists of n triples (x, y, x) such that x X, y Y, z Z. A 3 Dimensional Matching M T is a matching where for any two distinct triples (x 1, y 1, z 1 ) M and (x 2, y 2, z 2 ) M no node of the same set is taken twice x 1 x 2, y 1 y 2, z 1 z 2. Transformation: In order to create a transformation of the Set Cover problem that relates directly to the 3DM, we consider that each disjoint set X, Y, Z consists of n nodes each and the total number of nodes in the matching graph is 3n. To this purpose, we build a universe of 3n elements, as in Figure 2, and every triple (x i, y i, z i ) of the matching containing three distinct nodes, will be mapped to a subset S i with three elements of the universe in each subset, i {1, 2,..., n}. If we also take into account, an instance where the number of subsets equals to the number of triples k = n, then this Set Cover connects directly to 3DM. Reduction: Let us assume, a "yes" instance of the 3DM matching: The number of matches with disjoint elements that cover all points are M = n triples of (x i, y i, z i ), with i {1, 2,..., n} that cover the whole number of nodes 3n. If we set n = k, then the union of the k 6
three-element subsets S i of the Set Cover problem will gives us the whole universe of 3n elements. Let us assume, a "yes" instance of the Set Cover: There is a number of k subsets S i, i {1, 2,..., n} and the union of these subsets, gives us the universe of 3n elements. If we set k = n, and represent each subset S i with a matching M i of n triples (x i, y i, z i ) then the union of the matches results to the whole number of nodes 3n. However, we also need to prove that each node is present exactly once in every matching. This happens indeed, due to the fact that the total number of nodes is 3n and the matches contain three elements each, so the number of matches is bounded by 3n/3 = n. Thus, we cannot have more than n matches in total, and since we have exactly n, no element can be taken twice. Figure 1: Universe of n elements. Figure 2: Universe of 3n elements. Πρόβλημα 6. Απάντηση. [Ονοματεπώνυμα γραφέων] 7
Figure 3: Disjoint sets X,Y,Z. Figure 4: 3 Dimensional Matching. 8