ΠΟΛΛΑΠΛΑΣΙΑΣΜΟΣ (συνέχεια)
Πολλαπλασιασμός: μπορούμε καλύτερα; Διαισθητικά, επειδή ο πολλαπλασιασμός φαίνεται να απαιτεί άθροιση περίπου n πολλαπλασίων μιας από τις εισόδους, και δεδομένου ότι κάθε πρόσθεση απαιτεί γραμμικό χρόνο, φαίνεται οι n 2 bit λειτουργίες να μη γίνεται να μειωθούν Παραδόξως: μπορούμε να κάνουμε πολύ καλύτερα!
αλγόριθμος Χρησιμοποιούμε (1) την τεχνική διαίρει και βασίλευε (divide and conquer) 1. Σπάμε το πρόβλημα σε υποπροβλήματα που αποτελούν μικρότερου μεγέθους στιγμιότυπα του δοσμένου προβλήματος 2. Αναδρομικά λύνουμε τα υποπροβλήματα 3. Συνδυάζουμε κατάλληλα τις λύσεις τους για να πάρουμε τη λύση του αρχικού προβλήματος Φανταστείτε ότι έχω να πλύνω μια στολή που αποτελείται από πουκάμισο, γιλέκο και παντελόνι και (2) το θεώρημα του Gauss bc + ad = (a + b)(c + d)-ac-bd
αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, y και ζητείται το x*y Χωρίζουμε τους x, y στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Τότε:
αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, y και ζητείται το x*y Χωρίζουμε τους x, y στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Αν x = 10110110 τότε xl = 1011 και xr = 0110 και x = 1011*2 4 + 0110 Τότε:
αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, y και ζητείται το x*y Χωρίζουμε τους x, y στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Αν x = 10110110 τότε xl = 1011 και xr = 0110 και x = 1011*2 4 + 0110 Τότε: Γραμμικός χρόνος: Ο(n)
αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, y και ζητείται το x*y Χωρίζουμε τους x, y στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Αν x = 10110110 τότε xl = 1011 και xr = 0110 και x = 1011*2 4 + 0110 Τότε: Γραμμικός χρόνος: Ο(n) Xρόνος: 4*T(n/2) Συνολικός χρόνος: 4*Τ(n/2)+O(n)=O(n 2 ) με τη γνωστή τεχνική πολλαπλασιασμού
αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, y και ζητείται το x*y Χωρίζουμε τους x, y στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Αν x = 10110110 τότε xl = 1011 και xr = 0110 και x = 1011*2 4 + 0110 Τότε: Γραμμικός χρόνος: Ο(n) Xρόνος: 3*T(n/2) Συνολικός χρόνος: 3*Τ(n/2)+O(n) O(n 1.59 ) με χρήση της τεχνικής του Gauss
αλγόριθμος ΑΛΓΟΡΙΘΜΟΣ ΓΙΑ ΠΟΛΛΑΠΛΑΣΙΑΣΜΟ ΜΕ ΧΡΗΣΗ ΤΗΣ ΤΕΧΝΙΚΗΣ ΔΙΑΙΡΕΙ ΚΑΙ ΒΑΣΙΛΕΥΕ
Κάθε πρόβλημα διαιρείται σε 3 υποπροβλήματα Η αναδρομική διαδικασία k=0 Τελικά: 3 k υποπροβλήματα, μεγέθους το καθένα n/2 k : χρόνος 3 k *Ο(n/2 k )= (3/2) k *O(n) k=logn
αλγόριθμος (τεχνική διαίρει και βασίλευε) Δεδομένα: 2 ακέραιοι a και b με n ψηφία ο καθένας Ζητούμενο: γινόμενο a επί b Παράδειγμα: 1980 = a x 2315 = b ---------------- 9900 1980 5940 + 3960 ---------------- 4583700 = a x b Με βάση τον αλγόριθμο για πολλαπλασιασμό που είδαμε ήδη και απαιτεί χρόνο O(n 2 )
αλγόριθμος (τεχνική διαίρει και βασίλευε) Διαιρούμε το πρόβλημα: Χωρίζουμε τους ακεραίους στα δύο τους μισά: *10 4 *10 2 *10 0 Ο αλγόριθμος πρέπει να υπολογίσει τα 4 γινόμενα και μετά να τα αθροίσει, δηλ., 15*80+(15*19+23*80)*10 2 +23*19*10 4 = 1200+212500+4370000=4583700 Απαιτούμενος χρόνος: T(n) 4*T(n / 2) + O(n) T(n) = O(n 2 )
αλγόριθμος (τεχνική διαίρει και βασίλευε) Διαιρούμε το πρόβλημα: Χωρίζουμε τους ακεραίους στα δύο τους μισά: Με λίγη εξυπνάδα ο αλγόριθμος μπορεί να υπολογίσει μόνο 3 γινόμενα: x1 = al*bl, x2 = ar*br και x3 = (al + ar)*(bl + br) Αφού: al ar x bl br ------------------------------------------- al bl al br + ar bl ar br x1 x3 - x1 - x2 x2 *10 4 *10 2 *10 0 Αλγόριθμος Karatsuba Τώρα ο αλγόριθμος πρέπει να υπολογίσει 3 γινόμενα: x1, x2, και x3, να υπολογίσει το x3 - x1 - x2, και να αθροίσει: x1*10 4 + (x3 - x1 x2)*10 2 + x2 = 437*10 4 + (3762-437 1200)*10 2 + 1200= 437*10 4 + 2125*10 2 + 1200=4583700 Απαιτούμενος χρόνος: T(n) 3*T(n / 2) + O(n) T(n) O(n 1.59 )
αλγόριθμος (τεχνική al*b*r+ar*bl=(al+ar)*(bl+br)-al*bl-ar*br διαίρει και βασίλευε) Διαιρούμε το πρόβλημα: (al+ar)*(bl+br)=al*bl+al*b*r+ar*bl+ar*br al*b*r+ar*bl=x3-x1-x2 Χωρίζουμε τους ακεραίους στα δύο τους μισά: Με λίγη εξυπνάδα ο αλγόριθμος μπορεί να υπολογίσει μόνο 3 γινόμενα: x1 = al*bl, x2 = ar*br και x3 = (al + ar)*(bl + br) Αφού: al ar x bl br ------------------------------------------- al bl al br + ar bl ar br x1 x3 - x1 - x2 x2 *10 4 *10 2 *10 0 Αλγόριθμος Karatsuba Τώρα ο αλγόριθμος πρέπει να υπολογίσει 3 γινόμενα: x1, x2, και x3, να υπολογίσει το x3 - x1 - x2, και να αθροίσει: x1*10 4 + (x3 - x1 x2)*10 2 + x2 = 437*10 4 + (3762-437 1200)*10 2 + 1200= 437*10 4 + 2125*10 2 + 1200=4583700 Απαιτούμενος χρόνος: T(n) 3*T(n / 2) + O(n) T(n) O(n 1.59 )