0% found this document useful (0 votes)
1 views

Maximum Sub Array Sum

Maximim sub array problem
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
1 views

Maximum Sub Array Sum

Maximim sub array problem
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 10

ΣΥΓΚΡΙΣΗ ΑΠΟΔΟΣΗΣ ΑΛΓΟΡΙΘΜΩΝ MAXIMUM SUB ARRAY SUM ΣΤΗΝ

PYTHON

ΑΝΔΡΕΑΣ ΚΟΣΚΙΝΑΣ
1080211
17/3/2023

Περιγραφή του προβλήματος:

Το πρόβλημα του Maximum Sub Array Sum, είναι ένα εξαιρετικά γνωστό πρόβλημα στον
τομέα της ανάπτυξης λογισμικού, η βάση του είναι η εύρεση ενός συνεχόμενου υποπίνακα
εντός ενός μεγαλύτερου του οποίου το άθροισμα των στοιχείων του είναι το μέγιστο
δυνατό.
Για την επίλυση του συγκριμένου προβλήματος έχουν αναπτυχθεί πολλές υλοποιήσεις με
διαφορετική αλγοριθμική πολυπλοκότητα, μερικές από αυτές είναι:

• Αλγόριθμος δοκιμής συνδυασμών, πολυπλοκότητας O(n^3)


• Αλγόριθμος δοκιμής συνδυασμών, πολυπλοκότητας O(n^2)
• Αλγόριθμος Divide and Conquer, πολυπλοκότητας O(nlog(n))
• Αλγόριθμος Kadane, πολυπλοκότητας Ο(n)

Προσέγγιση της ανάλυσης:

Σκοπός της παρούσας εργασίας είναι η ανάλυση και των 4ων αλγορίθμων τόσο στον χρόνο
επίλυσης προβλημάτων πεπερασμένου μεγέθους ,όσο και η εύρεση του μεγίστου δυνατού
μεγέθους που μπορούν να επιλύσουν εντός πεπερασμένου χρονικού διαστήματος 1sec.
Για την ανάλυση υλοποιήθηκαν και οι 4 αλγόριθμοι με χρήση Python, ενώ
συμπεριλήφθηκαν και οι κατάλληλες συναρτήσεις ελέγχου και χρονομέτρησης.
Κώδικας:

Αλγόριθμος O(n^3):

Ο συγκεκριμένος αλγόριθμος είναι εξαιρετικά απλός. Ο τρόπος λειτουργίας του είναι ο


εξής:

1. Ο πρώτος δείκτης i δείχνει την αρχή της αναζήτησης, μετέπειτα η άθροιση ξεκινάει
να γίνεται από αυτό το στοιχείο μέχρι το τέλος του πίνακα, για αυτή την διάσχιση
υπεύθυνος είναι ο δείκτης j.
2. Αν το αποτέλεσμα της άθροισης είναι μεγαλύτερο από το προηγούμενο τότε η τιμή
του ανατίθεται στην msum.
3. Τα δεδομένα θέσης και το άθροισμα επιστρέφονται στην συνάρτηση ελέγχου.

Αποτελέσματα επιδόσεων αλγορίθμου O(n^3):

Πλήθος δεδομένων Χρόνος εκτέλεσης


10 0.48ms
100 2.4ms
1000 2sec
2000 15.75sec
Αλγόριθμος O(n^2):

Ο συγκεκριμένος αλγόριθμος είναι εξίσου απλός. Ο τρόπος λειτουργίας του είναι ο εξής:

1. Ο δείκτης i δείχνει την αρχή της άθροισης.


2. Ο δείκτης j διατρέχει όλα τα στοιχεία τα οποία πρόκειται να αθροιστούν.
3. Στην επόμενη επανάληψη η μεταβλητή tmp μηδενίζεται και η διαδικασία
επαναλαμβάνεται.
4. Αν σε οποιαδήποτε επανάληψη το αποτέλεσμα είναι μεγαλύτερο από το
προηγούμενο ανατίθεται στην μεταβλητή msum, ενώ στις start, end είναι οι δείκτες
της αρχής και του τέλους του maximum sub array

Αποτελέσματα επιδόσεων αλγορίθμου O(n^2):

Πλήθος δεδομένων Χρόνος εκτέλεσης


10 12μs
100 0.346ms
1000 37ms
2000 150ms
Αλγόριθμος O(nlog(n)) Divide and Conquer:

Ο αλγόριθμος πολυπλοκότητας O(nlog(n))είναι αναδρομικός ο τρόπος λειτουργίας του


είναι ο εξής:

1. Όταν καλείτε εκτός από το array το οποίο πρέπει να λειτουργήσει χρειάζεται το


αρχικό και το τελικό index του διανύσματος.
2. Μετέπειτα γίνεται έλεγχος αν τα 2 indexes είναι διαφορετικά.
3. Έπειτα υπολογίζεται το μέσο του διαστήματος.
4. Και στη συνέχεια σπάμε το διάστημα σε μικρότερα υποπροβλήματα.
5. Ο αλγόριθμος crsss_sum είναι υπεύθυνος για την εύρεση του μέγιστου υποπίνακα
εντός των κατακτημένων διαστημάτων.
6. Ο αλγόριθμος crsss_sum έχει πολυπλοκότητα O(n).
Αποτελέσματα O(nlog(n)) Divide and Conquer:

Πλήθος δεδομένων Χρόνος εκτέλεσης


10 25.9μs
100 0.2015ms
1000 2.31ms
2000 4.79ms

Αλγόριθμος O(n) Kadane:

Ο τρόπος λειτουργίας του είναι ο εξής:

1. Ο αλγόριθμος διατρέχει την λίστα μόνο μια φορά, προσθέτοντας κάθε στοιχείο
που βρίσκει, όσο το άθροισμα μεγαλώνει αναθέτει την νέα τιμή για σύγκριση
με την προηγούμενη και το τρέχων index στο “end”.
2. Αν το “tmp” γίνει αρνητικό παραλείπει το τρέχων βήμα και συνεχίζει στο
επόμενο εν σειρά index.

Αποτελέσματα O(n) Kadane’s:

Πλήθος δεδομένων Χρόνος εκτέλεσης


10 6μs
100 13.4μs
1000 97.7μs
2000 192.5μs
Εύρεση μέγιστου πλήθους αριθμών επεξεργάσιμων εντός
πεπερασμένου χρόνου:

Για την εύρεση του μέγιστου πλήθους αριθμών επεξεργάσιμων εντός πεπερασμένου
χρόνου χρησιμοποιήθηκε επαναληπτική μέθοδος στην οποία λαμβανόταν ένα αρχικό
μέγεθος λίστας, δοκιμαζόταν ο αλγόριθμος και σε περίπτωση που ο χρόνος εκτέλεσης του
ήταν μικρότερος του ζητούμενου αυξανόταν το μέγεθος της λίστας, με αυτό τον τρόπο η
ακρίβεια του υπολογισμού της μέγιστης δυνατής χωρητικότητας του κάθε αλγορίθμου
εντός πεπερασμένου χρόνου ενός δευτερολέπτου βρίσκεται με ακρίβεια τουλάχιστον ενός
δεκαδικού ψηφίου. Σημαντικό κριτήριο της ταχύτητας εκτέλεσης του συγκεκριμένου
τμήματος, είναι η βελτιστοποίηση των μεγεθών τόσο της αρχικής λίστας όσο και του
βήματος αύξησης, οι παράμετροι βελτιστοποιήθηκαν για τον συγκεκριμένο υπολογιστή που
γράφτηκε ο κώδικας.

Ενδεικτικό τμήμα κώδικα


Η μέγιστη χωρητικότητα του συστήματος σε FLOPS είναι:

823,7 GFLOPS @ 6 cores.

823,7 GFLOPS / 6 cores ~ = ~ 137 GFLOPS @core.


Για τον αλγόριθμο O(n) Kadane:

Αφού η διάσχιση κάθε λίστας στον αλγόριθμο του Kadane έχει πολυπλοκότητα O(n)
Έχουμε 137GFLOP = n => n = 137*10^9 θεωρητικούς αριθμούς.

Στην πράξη έχουμε 10.500.000.

O(n)
0,25

0,2

0,15

0,1

0,05

0
0 500 1000 1500 2000 2500

Για τον αλγόριθμο O(nlog(n)) Divide and Conquer:

137 GFLOP = nlog2(n) => n = 4,82 * 10^9 θεωρητικούς αριθμούς.

Στην πράξη έχουμε 340.000.


O(nlog(n))
6

0
0 500 1000 1500 2000 2500

Για τον αλγόριθμο O(n^2):

137 GFLOP = n^2 => n = 370.135 θεωρητικούς αριθμούς.

Στην πράξη έχουμε 5.200.

O(n^2)
160

140

120

100

80

60

40

20

0
0 500 1000 1500 2000 2500
Για τον αλγόριθμο O(n^3):

137 GFLOP = n^3 => n = 5.155 θεωρητικούς αριθμούς.

Στην πράξη έχουμε 800.

O(n^3)
180000

160000

140000

120000

100000

80000

60000

40000

20000

0
0 500 1000 1500 2000 2500
-20000

Τελικά οι μέγιστες χωρητικότητες διαμορφώνονται ως εξής:

Αλγόριθμος Θεωρητικά Πειραματικά


O(n^3) 5.155 800
O(n^2) 370.135 5.200
O(nlog(n)) 4,82 * 10^9 340.000
O(n) 137*10^9 10.500.000

ΚΟΣΚΙΝΑΣ ΑΝΔΡΕΑΣ

1080211

You might also like