ΠΟΛΛΑΠΛΑΣΙΑΣΜΟΣ (συνέχεια)
Πολλαπλασιασμός: μπορούμε καλύτερα; Διαισθητικά, επειδή ο πολλαπλασιασμός φαίνεται να απαιτεί άθροιση περίπου n πολλαπλασίων μιας από τις εισόδους, και δεδομένου ότι κάθε πρόσθεση απαιτεί γραμμικό χρόνο, φαίνεται οι n2 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*24 + 0110
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, y και ζητείται το x*y Χωρίζουμε τους x, y στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Τότε: Αν x = 10110110 τότε xL = 1011 και xR = 0110 και x = 1011*24 + 0110 Γραμμικός χρόνος: Ο(n)
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, y και ζητείται το x*y Χωρίζουμε τους x, y στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Τότε: Αν x = 10110110 τότε xL = 1011 και xR = 0110 και x = 1011*24 + 0110 Γραμμικός χρόνος: Ο(n) Xρόνος: 4*T(n/2) Συνολικός χρόνος: 4*Τ(n/2)+O(n)=O(n2) με τη γνωστή τεχνική πολλαπλασιασμού…
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, y και ζητείται το x*y Χωρίζουμε τους x, y στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Τότε: Αν x = 10110110 τότε xL = 1011 και xR = 0110 και x = 1011*24 + 0110 Γραμμικός χρόνος: Ο(n) Xρόνος: 3*T(n/2) Συνολικός χρόνος: 3*Τ(n/2)+O(n)O(n1.59) με χρήση της τεχνικής του Gauss…
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος ΑΛΓΟΡΙΘΜΟΣ ΓΙΑ ΠΟΛΛΑΠΛΑΣΙΑΣΜΟ ΜΕ ΧΡΗΣΗ ΤΗΣ ΤΕΧΝΙΚΗΣ ΔΙΑΙΡΕΙ ΚΑΙ ΒΑΣΙΛΕΥΕ
Κάθε πρόβλημα διαιρείται σε 3 υποπροβλήματα Η αναδρομική διαδικασία k=0 k=logn Τελικά: 3k υποπροβλήματα, μεγέθους το καθένα n/2k: χρόνος 3k *Ο(n/2k)= (3/2)k*O(n)
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος (τεχνική διαίρει και βασίλευε) Δεδομένα: 2 ακέραιοι a και b με n ψηφία ο καθένας Ζητούμενο: γινόμενο a επί b Παράδειγμα: Με βάση τον αλγόριθμο για πολλαπλασιασμό που είδαμε ήδη και απαιτεί χρόνο O(n2) 1980 = a x 2315 = b ---------------- 9900 1980 5940 + 3960 4583700 = a x b
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος (τεχνική διαίρει και βασίλευε) Διαιρούμε το πρόβλημα: Χωρίζουμε τους ακεραίους στα δύο τους μισά: Ο αλγόριθμος πρέπει να υπολογίσει τα 4 γινόμενα και μετά να τα αθροίσει, δηλ., 15*80+(15*19+23*80)*102+23*19*104= 1200+212500+4370000=4583700 Απαιτούμενος χρόνος: T(n) 4*T(n / 2) + O(n) T(n) = O(n2) *104 *102 *100
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος (τεχνική διαίρει και βασίλευε) Διαιρούμε το πρόβλημα: Χωρίζουμε τους ακεραίους στα δύο τους μισά: Με λίγη εξυπνάδα… ο αλγόριθμος μπορεί να υπολογίσει μόνο 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 Τώρα ο αλγόριθμος πρέπει να υπολογίσει 3 γινόμενα: x1, x2, και x3, να υπολογίσει το x3 - x1 - x2, και να αθροίσει: x1*104 + (x3 - x1 – x2)*102 + x2 = 437*104 + (3762 - 437 – 1200)*102 + 1200= 437*104 + 2125*102 + 1200=4583700 Απαιτούμενος χρόνος: T(n) 3*T(n / 2) + O(n) T(n) O(n1.59) *104 *102 *100 Αλγόριθμος Karatsuba
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος (τεχνική διαίρει και βασίλευε) (aL+aR)*(bL+bR)=aL*bL+aL*b*R+aR*bL+aR*bR aL*b*R+aR*bL=(aL+aR)*(bL+bR)-aL*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 Τώρα ο αλγόριθμος πρέπει να υπολογίσει 3 γινόμενα: x1, x2, και x3, να υπολογίσει το x3 - x1 - x2, και να αθροίσει: x1*104 + (x3 - x1 – x2)*102 + x2 = 437*104 + (3762 - 437 – 1200)*102 + 1200= 437*104 + 2125*102 + 1200=4583700 Απαιτούμενος χρόνος: T(n) 3*T(n / 2) + O(n) T(n) O(n1.59) *104 *102 *100 Αλγόριθμος Karatsuba