Maximum Sub Array Sum
Maximum Sub Array Sum
PYTHON
ΑΝΔΡΕΑΣ ΚΟΣΚΙΝΑΣ
1080211
17/3/2023
Το πρόβλημα του Maximum Sub Array Sum, είναι ένα εξαιρετικά γνωστό πρόβλημα στον
τομέα της ανάπτυξης λογισμικού, η βάση του είναι η εύρεση ενός συνεχόμενου υποπίνακα
εντός ενός μεγαλύτερου του οποίου το άθροισμα των στοιχείων του είναι το μέγιστο
δυνατό.
Για την επίλυση του συγκριμένου προβλήματος έχουν αναπτυχθεί πολλές υλοποιήσεις με
διαφορετική αλγοριθμική πολυπλοκότητα, μερικές από αυτές είναι:
Σκοπός της παρούσας εργασίας είναι η ανάλυση και των 4ων αλγορίθμων τόσο στον χρόνο
επίλυσης προβλημάτων πεπερασμένου μεγέθους ,όσο και η εύρεση του μεγίστου δυνατού
μεγέθους που μπορούν να επιλύσουν εντός πεπερασμένου χρονικού διαστήματος 1sec.
Για την ανάλυση υλοποιήθηκαν και οι 4 αλγόριθμοι με χρήση Python, ενώ
συμπεριλήφθηκαν και οι κατάλληλες συναρτήσεις ελέγχου και χρονομέτρησης.
Κώδικας:
Αλγόριθμος O(n^3):
1. Ο πρώτος δείκτης i δείχνει την αρχή της αναζήτησης, μετέπειτα η άθροιση ξεκινάει
να γίνεται από αυτό το στοιχείο μέχρι το τέλος του πίνακα, για αυτή την διάσχιση
υπεύθυνος είναι ο δείκτης j.
2. Αν το αποτέλεσμα της άθροισης είναι μεγαλύτερο από το προηγούμενο τότε η τιμή
του ανατίθεται στην msum.
3. Τα δεδομένα θέσης και το άθροισμα επιστρέφονται στην συνάρτηση ελέγχου.
Ο συγκεκριμένος αλγόριθμος είναι εξίσου απλός. Ο τρόπος λειτουργίας του είναι ο εξής:
1. Ο αλγόριθμος διατρέχει την λίστα μόνο μια φορά, προσθέτοντας κάθε στοιχείο
που βρίσκει, όσο το άθροισμα μεγαλώνει αναθέτει την νέα τιμή για σύγκριση
με την προηγούμενη και το τρέχων index στο “end”.
2. Αν το “tmp” γίνει αρνητικό παραλείπει το τρέχων βήμα και συνεχίζει στο
επόμενο εν σειρά index.
Για την εύρεση του μέγιστου πλήθους αριθμών επεξεργάσιμων εντός πεπερασμένου
χρόνου χρησιμοποιήθηκε επαναληπτική μέθοδος στην οποία λαμβανόταν ένα αρχικό
μέγεθος λίστας, δοκιμαζόταν ο αλγόριθμος και σε περίπτωση που ο χρόνος εκτέλεσης του
ήταν μικρότερος του ζητούμενου αυξανόταν το μέγεθος της λίστας, με αυτό τον τρόπο η
ακρίβεια του υπολογισμού της μέγιστης δυνατής χωρητικότητας του κάθε αλγορίθμου
εντός πεπερασμένου χρόνου ενός δευτερολέπτου βρίσκεται με ακρίβεια τουλάχιστον ενός
δεκαδικού ψηφίου. Σημαντικό κριτήριο της ταχύτητας εκτέλεσης του συγκεκριμένου
τμήματος, είναι η βελτιστοποίηση των μεγεθών τόσο της αρχικής λίστας όσο και του
βήματος αύξησης, οι παράμετροι βελτιστοποιήθηκαν για τον συγκεκριμένο υπολογιστή που
γράφτηκε ο κώδικας.
Αφού η διάσχιση κάθε λίστας στον αλγόριθμο του Kadane έχει πολυπλοκότητα O(n)
Έχουμε 137GFLOP = n => n = 137*10^9 θεωρητικούς αριθμούς.
O(n)
0,25
0,2
0,15
0,1
0,05
0
0 500 1000 1500 2000 2500
0
0 500 1000 1500 2000 2500
O(n^2)
160
140
120
100
80
60
40
20
0
0 500 1000 1500 2000 2500
Για τον αλγόριθμο O(n^3):
O(n^3)
180000
160000
140000
120000
100000
80000
60000
40000
20000
0
0 500 1000 1500 2000 2500
-20000
ΚΟΣΚΙΝΑΣ ΑΝΔΡΕΑΣ
1080211