Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Πολυπλοκότητα Αλγορίθμων

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Πολυπλοκότητα Αλγορίθμων"— Μεταγράφημα παρουσίασης:

1 Πολυπλοκότητα Αλγορίθμων
ΓΕ0170 -Αλγόριθμοι και Προηγμένες Προγραμματικές Τεχνικές Πολυπλοκότητα Αλγορίθμων Νίκος Αθανάσης

2 Λύση της Άσκησης Ανοίξτε το αρχείο ATMSimulation.py από τον φάκελο του μαθήματος

3 H Λίστα των HighScores (Nikos, 80) (Dimitris, 78) (Christos, 50) 1 2
1 2 New Game: (Maria, 79) (Nikos, 80) (Maria, 79) (Dimitris, 78) 1 2

4 Υλοποίηση Game Περισσότερα στο αρχείο PlayGame στο φάκελο του μαθήματος

5 Ταξινόμηση Εισαγωγής

6 Υλοποίηση InsertSort Περισσότερα στο αρχείο InsertSort στο φάκελο του μαθήματος

7 Λίστες και καταχώρηση τιμών (1/2)
list2 = [] list2 = list2 + [1] list2.append(2) print(list2) def method1(): my_list1 = [] for n in range(100000): my_list1 = my_list1 + [n] #print(my_list) def method2(): my_list2 = [] my_list2.append(n)

8 Λίστες και καταχώρηση τιμών (2/2)
def method3(): my_list3 = [n for n in range(100000)] #print(my_list) def method4(): my_list4 = list(range(100000)) method4() print("done 4") method1() print("done 1") method3() print("done 3") method2() print("done 2")

9 Μερικό άθροισμα def average1(S): n = len(S) A = [0]*n
for i in range(n): total = 0 for j in range(i + 1): total += S[j] A[i] = total / (i+1) return A numbers = [1,2,3,4,5] print(average1(numbers))

10 Μερικό άθροισμα def average2(S): n = len(S) A = [0]*n total = 0
for j in range(n): total += S[j] A[j] = total / (j+1) return A numbers = [1,2,3,4,5] print(average2(numbers))

11 Διπλά γράμματα def unique1(S): def unique3(s): for i in range(len(S)):
for j in range(i+1, len(S)): if S[i] == S[j]: return False return True print(unique1("abcd")) print(unique1("abcda")) def unique3(s): chars = [] for let in s: # Check if in list if let in chars: return False else: chars.append(let) return True print(unique3("abcd")) print(unique3("abcda")) Διπλά γράμματα def unique4(s): chars = [] set_s = set(s) if len(set_s) == len(s): return True else: return False print(unique4("abcd")) print(unique4("abcda")) def unique2(S): temp =sorted(S) for i in range(1,len(temp)): if temp[i-1] == temp[i]: return False return True print(unique2("abcd")) print(unique2("abcda")

12 Αποτελεσματικότητα Αλγορίθμων
Είναι ο αλγόριθμος Α αποτελεσματικότερος του αλγόριθμου Β; Με άλλα λόγια, επιλύει ο αλγόριθμος Α το πρόβλημα Π σε λιγότερο χρόνο από τον αλγόριθμο Β; Πόσο θα αυξηθεί ο χρόνος εκτέλεσης του αλγόριθμου Α ή, ισοδύναμα, ο χρόνος επίλυσης του προβλήματος Π, εάν διπλασιάσουμε τα δεδομένα εισόδου του Π; Μπορώ να χρησιμοποιήσω τον αλγόριθμο Α, όταν τα δεδομένα εισόδου του προβλήματος Π, που επιλύει ο αλγόριθμος Α, είναι πολύ μεγάλα;

13 Παράμετροι απόδοσης αλγόριθμου
Χρόνος εκτέλεσης Απαιτούμενοι πόροι, π.χ. μνήμη, ταχύτητα διακίνησης δεδομένων (π.χ. σε κατανεμημένα συστήματα) Γλώσσα Προγραμματισμού

14 Πολυπλοκότητα και χρόνος εκτέλεσης αλγορίθμου
Ένας αλγόριθμος με μικρό χρόνο εκτέλεσης θα λέμε ότι έχει μικρή πολυπλοκότητα χρόνου, ενώ αντίθετα ένας με μεγάλο χρόνο εκτέλεσης θα λέμε ότι έχει μεγάλη πολυπλοκότητα. Εμπειρική Προσέγγιση (posteriori) Θεωρητική Προσέγγιση (priori)

15 Εμπειρική Πολυπλοκότητα
start_time = time( ) run _algorithm() # record the ending time end_time = time( ) # compute the elapsed time elapsed = end_time − start_time Περισσότερα στο αρχείο Complexity στο φάκελο του μαθήματος

16 Θεωρητική Πολυπλοκότητα
H θεωρητική πολυπλοκότητα καθορίζει μαθηματικά το χρόνο (και άλλες παραμέτρους) που απαιτεί ο αλγόριθμος, συναρτήσει του μεγέθους των εξεταζόμενων εισόδων του. Το πλεονέκτημα της θεωρητικής προσέγγισης για τον υπολογισμό της αποτελεσματικότητας ενός αλγόριθμου είναι ότι: δεν εξαρτάται από τον Η/Υ, δεν εξαρτάται από την γλώσσα προγραμματισμού, δεν εξαρτάται από τις ικανότητες του προγραμματιστή.

17 Ασυμπτωτική ανάλυση Θέλουμε να συγκρίνουμε πόσο γρήγορα ο χρόνος εκτέλεσης αυξάνεται, όχι να συγκρίνουμε τους χρόνους εκτέλεσης αφού αυτοί εξαρτώνται από τους πόρους του συστήματος Αφού θέλουμε να συγκρίνουμε το χρόνο εκτέλεσης για διαφορετικά μεγέθη εισόδου, μας ενδιαφέρει η αύξηση του χρόνου εκτέλεσης σε σχέση με τα δεδομένα εισόδου Καθώς τα δεδομένα (n) αυξάνονται, μας ενδιαφέρει η συμπεριφορά του αλγορίθμου όταν τα δεδομένα (n) γίνονται πάρα πολύ μεγάλα (Ασυμπτωτική ανάλυση)

18 Ασυμπτωτική ανάλυση

19 Παραδείγματα πολυπλοκότητας
O(1) (σταθερή πολυπλοκότητα): Εύρεση του τηλεφώνου στον τηλεφωνικό κατάλογο αν γνωρίζουμε τη σελίδα και το όνομα που ψάχνουμε O(n) (γραμμική): Βρείτε όλα τα άτομα που το τηλέφωνό τους περιέχει το ψηφίο «9» O(n): Με δεδομένο ένα τηλέφωνο, βρείτε το όνομα στο οποίο αντιστοιχεί O(log n): Με δεδομένο ένα όνομα, βρείτε το τηλέφωνο του στον τηλεφωνικό κατάλογο (δυαδική αναζήτηση) O(n log n): Ταξινομήστε τις σελίδες του καταλόγου σε αλφαβητική σειρά, κοιτάζοντας το πρώτο όνομα σε κάθε σελίδα και τοποθετώντας κάθε σελίδα στην κατάλληλη θέση

20 def func_constant(values): ''' Prints first item in a list of values.
print (values[0]) func_constant([1,2,3]) def func_lin(lst): ''' Takes in list and prints out all values for val in lst: print (val) func_lin([1,2,3]) def func_quad(lst): ''' Prints pairs for every item in list. for item_1 in lst: for item_2 in lst: print (item_1,item_2) lst = [0, 1, 2, 3] func_quad(lst) def comp(lst): print (lst[0]) midpoint = len(lst)//2 for val in lst[:midpoint]: print (val) for x in range(10): print ("number") lst = [1,2,3,4,5,6,7,8,9,10] comp(lst) Τι πολυπλοκότητα έχει?

21 Ασυμπτωτική ανάλυση

22 Αλγοριθμική ανάλυση Πίνακας αλγοριθμικής ανάλυσης
Μέγεθος δεδομένων προβλήματος (n) και συνολικές πράξεις που απαιτούνται για διαφορετικούς αλγορίθμους Πίνακας αλγοριθμικής ανάλυσης Μέγιστο μέγεθος δεδομένων 1’’ ’ h Μέγιστο μέγεθος δεδομένων προβλήματος (n) που μπορεί να λυθεί σε συγκεκριμένο χρονικό διάστημα για διαφορετικούς αλγόριθμους

23 Αλγοριθμική ανάλυση Αλγόριθμος Νέο μέγεθος
Αλγόριθμος Νέο μέγεθος Εάν χρησιμοποιήσω έναν υπολογιστή 256 φορές γρηγορότερο, ποιο είναι το μέγιστο μέγεθος προβλήματος που μπορεί να λυθεί στον ίδιο χρόνο;

24 Συμβολισμοί πολυπλοκότητας
Την πολυπλοκότητα την εκφράζουμε με τη βοήθεια ειδικών συμβολισμών: Ο, Ω, Θ. Χρησιμοποιούμε το συμβολισμό Ο και το συμβολισμό Ω για να δηλώσουμε ότι η επίδοση ενός αλγορίθμου είναι ασυμπτωτικά φραγμένη από επάνω και από κάτω αντίστοιχα. Με το συμβολισμό Θ δηλώνουμε ότι η επίδοση ενός αλγορίθμου είναι ασυμπτωτικά φραγμένη από επάνω και από κάτω ταυτόχρονα.

25 Συμβολισμός Ο Συμβολισμός Ο. Μία συνάρτηση f(n) λέγεται ότι έχει πολυπλοκότητα της τάξης O(g(n)) και συμβολίζεται με f(n) = O(g(n)) ή με f(n) ∈ O(g(n)), αν υπάρχει μία θετική σταθερά c και μία τιμή n0, έτσι ώστε για κάθε n > n0 να ισχύει η σχέση f(n) < c*g(n).

26 Συμβολισμός Ω Συμβολισμός Ω. Μία συνάρτηση f(n) λέγεται ότι έχει πολυπλοκότητα της τάξης Ω(g(n)) και συμβολίζεται με f(n) = Ω(g(n)) ή με f(n) ∈ Ω(g(n)), αν υπάρχει μία θετική σταθερά c και μία τιμή n0, έτσι ώστε για κάθε n > n0 να ισχύει η σχέση f(n) > c*g(n).

27 Συμβολισμός Θ Συμβολισμός Θ. Μία συνάρτηση f(n) λέγεται ότι έχει πολυπλοκότητα της τάξης Θ(g(n)) και συμβολίζεται με f(n) = Θ(g(n)) ή με f(n) ∈ Θ(g(n)), αν υπάρχουν δύο θετικές σταθερές c1, c2 και μία τιμή n0, έτσι ώστε κάθε για n > n0 να ισχύει η σχέση c1*g(n) < f(n) < c2*g(n).

28 Συμβολισμός Ο «Η f (n) είναι πολυπλοκότητας O(g(n)).”
Εναλλακτικά, “ Η f (n) είναι τάξης (order of) g(n).” Εναλλακτικά, “ f (n) ∈ O(g(n))», f(x) ∈ O(‘άνω άκρο’) σημαίνει ότι η  f «μεγαλώνει όχι γρηγορότερα από" το ‘’ανω άκρο’ Στον συμβολισμό Ο δεν μας ενδιαφέρουν σταθεροί όροι / μη ασυμπτωτικοί όροι Ο αλγόριθμος τάξης 9x² είναι ίδιας τάξης με τον 10x². ο αλγόριθμος τάξης 10x² είναι ίδιας τάξης με τον 10x² - x διότι, τα μικρότερα μέρη τείνουν να μην έχουν σημασία σε μεγάλη κλίμακα

29 Συμβολισμός Ο Μας ενδιαφέρει ο λόγος καθώς το μέγεθος των δεδομένων τείνουν στο άπειρο

30 Παραδείγματα Η συνάρτηση 8n+5 είναι O(n). Αρκεί να βρούμε μια σταθερά c>0, και μια σταθερά no ώστε 8n+5 ≤ cn για κάθε n ≥ n0. Με c = 9 έχω 8n+5<=9n που ισχύει για κάθε n>=5 ή εναλλακτικά με c = 13 έχω 8n+5<=13n που ισχύει για κάθε n>=1 Η 5n4 +3n3+2n2 +4n+1 είναι O(n4). Διότι: 5n4+3n3+2n2+4n+1≤ ( )n4 = cn4, για c = 15 Η 5n2 +3nlog n+2n+5 is O(n2). Διότι:5n2 +3nlog n+2n+5 ≤( )n2 =cn2, για c=15 Η 20n3 +10nlog n+5 είναι O(n3). Διότι: 20n3 +10nlog n+5 ≤ 35n3, για c=35 H 3logn+2 είναι O(logn). Διότι: 3logn+2 ≤ 5logn, για c=5. H 2n+100log n is O(n). Διότι: 2n+100log n≤ 102n, για c= 102

31 Παραδείγματα για καλύτερη κατανόηση

32 Παραδείγματα για καλύτερη κατανόηση

33 Παραδείγματα για καλύτερη κατανόηση

34 Η Δομή Δεδομένων: Στοίβα
Μια Δομή Δεδομένων Stack (Στοίβα) είναι μια συλλογή από αντικείμενα που προσθέτονται και διαγράφονται με βάση την αρχή: Τελευταίο μέσα, πρώτο έξω last-in, first-out (LIFO) Ο χρήστης μπορεί να προσθέτει αντικείμενα στη στοίβα ανά πάσα στιγμή και έχει πρόβαση κάθε φορά στο τελευταίο χρονικά αντικείμενο που προστέθηκε, όπως ακριβώς γίνεται σε μια στοίβα στο νεροχύτη μας. Kάθε πιάτο που πλένεται τοποθετείται στην κορυφή (top) της στοίβας των πιάτων, ενώ για σκούπισμα λαμβάνεται και πάλι το πιάτο της κορυφής. Τα δεδομένα που βρίσκονται στην κορυφή της στοίβας λαμβάνονται πρώτα, ενώ αυτά που βρίσκονται στο βάθος της στοίβας λαμβάνονται τελευταία Όταν θέλουμε να χρησιμοποιήσουμε ένα νέο στοιχείο κάνουμε pop (απώθηση) Όταν θέλουμε να προσθέσουμε ένα νέο στοιχείο στη στοίβα κάνουμε push (ώθηση)

35 Η Δομή Δεδομένων: Στοίβα

36 Έλεγχος της στοίβας Δύο είναι οι κύριες λειτουργίες σε μία στοίβα: η ώθηση (push) στοιχείου στην κορυφή της στοίβας, και η απώθηση (pop) στοιχείου από τη στοίβα. Η διαδικασία της ώθησης πρέπει οπωσδήποτε να ελέγχει, αν η στοίβα είναι γεμάτη, οπότε λέγεται ότι συμβαίνει υπερχείλιση (overflow) της στοίβας. Αντίστοιχα, η διαδικασία απώθησης ελέγχει, αν υπάρχει ένα τουλάχιστον στοιχείο στη στοίβα, δηλαδή ελέγχει αν γίνεται υποχείλιση (underflow) της στοίβας.

37 Λειτουργίες Στοίβας S.push(e): Ώθηση (προσθήκη) ενός αντικειμένου στην κορυφή. Ελεγχος υπερχείλισης S.pop(): Απώθηση (διαγραφή) ενός αντικειμένου από την κορυφή της στοίβας. Έλεγχος υποχείλισης S.top(): Επιστρέφει την κορυφή της στοίβας (χωρίς διαγραφή) S.is empty( ): Επιστρέφει True αν η στοίβα δεν περιέχει στοιχεία len(S): Επιστρέφε το μήκος της στοίβας. Λειτουργία Χρόνος εκτέλεσης

38 Λειτουργίες Στοίβας Λειτουργία Επιστρέφει Περιεχόμενα στοίβας

39 Υλοποίηση Στοίβας Μια στοίβα μπορεί να υλοποιηθεί με τη βοήθεια μιας Python List Μέθοδος Αντιστοιχία με Python Περισσότερα στο αρχείο StackClass στο φάκελο του μαθήματος

40 Εφαρμογή στοίβας Αντιστροφή περιεχομένου ενός αρχείου
Περισσότερα στο αρχείο ReverseFile στο φάκελο του μαθήματος

41 Εφαρμογή στοίβας Ταίριασμα παρενθέσεων σε έκφραση
Σωστό: ( )(( )){([( )])} • Σωστό: ((( )(( )){([( )])})) • Λάθος: )(( )){([( )])} • Λάθος: ({[ ])} • Λάθος: ( Έλεγχος εγκυρότητας html αρχείου Περισσότερα στο αρχείο Matching, Matchinghtml στο φάκελο του μαθήματος

42 Η Δομή Δεδομένων: Ουρά Οι ουρές είναι καθημερινό φαινόμενο. Για παράδειγμα, ουρές δημιουργούνται όταν άνθρωποι, αυτοκίνητα, εργασίες, προγράμματα κ.λπ. περιμένουν για να εξυπηρετηθούν. Το θέμα είναι τόσο σημαντικό και με τέτοιες πρακτικές επιπτώσεις, ώστε ένας ιδιαίτερος κλάδος των ΜαθηΜατικών και Πληροφορικής, η Θεωρία Ουρών (Queueing Theory), μελετά τη συμπεριφορά και την επίδοση των ουρών. Σε μία ουρά αναμονής με ανθρώπους, συμβαίνει να εξυπηρετείται εκείνος που στάθηκε στην ουρά πρώτος από όλους τους άλλους (αν και πολύ συχνά στην Ελάδα αυτό δεν ισχύει!) Γραμμή προτεραιότητας

43 Η Δομή Δεδομένων: Ουρά

44 Η Δομή Δεδομένων: Ουρά Μια Ουρά είναι μια δομή δεδομένων όπου τα αντικείμενα εισέρσχονται και διαγράφονται με βάση την αρχή first-in, first-out (FIFO) principle. Έτσι, τα αντικείμενα εισέρχονται ανά πάσα στιγμή στο τέλος της ουράς ενώ αυτό που είναι στην ουρά το περισσότερο διάστημα μπορεί να διαγραφεί και αποτελεί και το πρώτο στοιχείο της ουράς. Δύο είναι οι κύριες λειτουργίες σε μία ουρά: η εισαγωγή (enqueue) στοιχείου στο πίσω άκρο της ουράς, και η εξαγωγή (dequeue) στοιχείου από το εμπρός άκρο της ουράς. Q.enqueue(e): Προσθήκη του στοιχείου e στο πίσω άκρο της ουράς Q. Q.dequeue( ): Διαγραφή και επιστροφή του πρώτου στοιχείου από το εμπρός άκρο της ουράς Q.first(): Επιστρέφει το πρώτο στοιχείο της ουράς. Q.is empty( ): Επισρτρέφει True εάν η ουρά Q δεν περιέχει κανένα αντικείμενο len(Q): Επιστρέφει τον αριθμό των αντικειμένων της ουράς Η διαδικασία της εξαγωγής πρέπει οπωσδήποτε να ελέγχει αν υπάρχει ένα τουλάχιστον στοιχείο στην ουρά, δηλαδή ελέγχει αν γίνεται υποχείλιση (underflow) της ουράς.

45 Λειτουργίες της Ουράς Λειτουργία Επιστρέφει Περιεχόμενα στοίβας

46 Υλοποίηση Ουράς Η υλοποίηση της ουράς θα μπορούσε να γίνει με τη βοήθεια μιας λίστας. Θα μπορούσαμε να εισάγουμε ένα στοιχείο e καλώντας την append(e) ώστε να εισάγεται στο τέλος της λίστας. Θα μπορούσαμε να κάνουμε εξαγωγή καλώντας την pop(0), ώστε να διαγραφεί το πρώτο στοιχείο της λίστας. Όμως, κάτι τέτοιο θα είχε ως αποτελέσμα να εκτελείται σε κάθε εξαγωγή ένας βρόγχος πολυπλοκότητας O(n) για να συμπληρωθεί το κενό που αφήνει η εξαγωγή του πρώτου στοιχείου Μπορούμε να αντιμετωπίσουμε το παραπάνω πρόβλημα αντικαθιστώντας την τιμή της εξαγωγής με το None και διατηρώντας σε μια μεταβλητή f (front index) την αρχή της ουράς. Έτσι, η εξαγωγή θα γίνεται σε χρόνο O(1). Το πρόβλημα που υπάρχει με την παραπάνω υλοποίηση είναι ότι το μήκος της ουράς μεγαλώνει όσο εισάγονται και εξάγονται στοιχεία. Μπορεί να έχω έτσι μια τεράστια λίστα που όμως διατηρεί λίγα στοιχεία

47 Υλοποίηση Ουράς Για να αντιμετωπίσοπυμε επιτυχώς τα παραπάνω προβλήματα, η ουρά υλοποιείται με μια “κυκλική” λίστα.η οποία έχει σταθερό μέγεθος Ν. Νέα στοιχεία εισάγονται στο τέλος της λίστας και το τελευταίο στοιχείο που έχει εισαχθεί βρίσκεται στη θέση N-1 τότε το επόμενο εισάγεται στη θέση 0 Κατά την εξαγωγή, ο δείκτης f (αρχή της ουράς) αυξάνεται σε f = (f + 1) % N. Για παράδειγμα, αν έχουμε μια λίστα μεγέθους 10 και η αρχή της ουράς είναι στο 7, μια νέα εξαγωγή θα κάνει την αρχή της ουράς να δείχνει στη θέση (7+1) % 10 = 8. Από τη θέση 9 όμως μια νέα εξαγωγή θα δείχνει την κορυφή της ουράς στη θέση (9+1) % 10 = 0

48 Υλοποίηση Ουράς Υλοποίηση της κλάσης Queue με τις παρακάτω μεταβλητές αντικειμένου instance variables. data: μια λίστα συγκερκριμένου μεγέθους που περιέχει τα στοιχεία τη ουράς size: ένας αριθμός που δείχει το τρέχον μέγεθος της ουράς (δηλαδή το μέγεθος της λίστας) front: ο δείκτης προς το πρώτο στοιχείοτης ουράς. Λειτουργία Χρόνος εκτέλεσης Περισσότερα στο αρχείο MyQueue στο φάκελο του μαθήματος

49 Αναζήτηση στοιχείου σε λίστα
Μη ταξινομημένη Περίπτωση Καλύτερη Χειρότερη ΜΟ Το στοιχείο υπάρχει Το στοιχείο δεν υπάρχει Ταξινομημένη Περίπτωση Καλύτερη Χειρότερη ΜΟ Το στοιχείο υπάρχει Το στοιχείο δεν υπάρχει

50 Ψευδο-κώδικας σειριακής αναζήτησης
done ← ψευδής position ← 0 i ← 0 Όσο (done=ψευδής) και (i<n) επανάλαβε Αν table[i]=key τότε done ← αληθής position ← i αλλιώς i ← i+1 Τέλος_αν Τέλος_επανάληψης Να γράψετε μια συνάρτηση που θα υλοποιεί τον αλγόριθμο σειριακής αναζήτησης σε μη ταξινομημένη λίστα Python

51 Ψευδο-κώδικας σειριακής αναζήτησης σε Ταξινομημένη Λίστα
done ← ψευδής position ← 0 i ← 0 Όσο (done=ψευδής) και (i<n) επανάλαβε Αν table[i]=key τότε done ← αληθής position ← i αλλιώς_Αν table[i]>key τότε Τέλος_αν Τέλος_επανάληψης Να γράψετε μια συνάρτηση που θα υλοποιεί τον αλγόριθμο σειριακής αναζήτησης σε ταξινομημένη λίστα Python

52 Διαδική αναζήτηση ΑΡΧ <-- 1 ΤΕΛ <-- 200
ΟΣΟ (ΑΡΧ <= ΤΕΛ) ΚΑΙ (ΒΡΕΘ = ΨΕΥΔΗΣ) ΕΠΑΝΑΛΑΒΕ Μ <-- (ΑΡΧ+ΤΕΛ) DIV 2 ΑΝ Α[Μ] = Χ ΤΟΤΕ ΒΡΕΘ <-- ΑΛΗΘΗΣ ΑΛΛΙΩΣ_ΑΝ Α[Μ] < Χ ΤΟΤΕ ΑΡΧ <-- Μ+1 ΑΛΛΙΩΣ ! A[M] > X ΤΕΛ <-- Μ-1 ΤΕΛΟΣ_ΑΝ ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ Αναζήτηση για το 23 Να γράψετε μια συνάρτηση που θα υλοποιεί τον αλγόριθμο διαδικής αναζήτησης σε ταξινομημένη λίστα Python

53 Διαδική αναζήτηση Συγκρίσεις Στοιχεία που απομένουν για αναζήτηση

54 Ταξινόμηση

55

56 Ταξινόμηση φυσαλίδας (bubblesort)
Η μέθοδος της ταξινόμησης ευθείας ανταλλαγής (straight exchange sort) βασίζεται στην αρχή της σύγκρισης και ανταλλαγής ζευγών γειτονικών στοιχείων, μέχρις ότου διαταχθούν όλα τα στοιχεία. Κάθε φορά γίνονται διαδοχικές προσπελάσεις στον πίνακα και μετακινείται το μικρότερο κλειδί της ακολουθίας προς το αριστερό άκρο του πίνακα.

57 Ταξινόμηση φυσαλίδας (bubblesort)
Η ταξινόμηση φυσαλίδας είναι ο πιο απλός και ταυτόχρονα ο πιο αργός αλγόριθμος ταξινόμησης.

58 Ταξινόμηση bubblesort
1ο “πέρασμα” Εξερευνήστε την οπτικοποίηση της ταξινόμησης στις διευθύνσεις που δόθηκαν παραπάνω Σε κάθε “πέρασμα”, το μικρότερο στοιχείο από τα υπόλοιπα “ανεβαίνει” στην κορυφή

59 Ψευδο-κώδικας ταξινόμησης φυσαλίδας
Για i από 2 μέχρι n Για j από n μέχρι i Αν table[j-1] > table[j] τότε αντιμετάθεσε table[j-1], table[j] Τέλος_αν Τέλος_επανάληψης Τέλος Φυσαλίδα Να γράψετε μια συνάρτηση που θα υλοποιεί τον αλγόριθμο ταξινόμησης φυσαλίδας σε μια λίστα Python

60 Ταξινόμηση επιλογής Η ταξινόμηση επιλογής βελτιώνει την ταξινόμηση φυσαλίδας κάνοντας μια μόνο ανταλλαγή (αντιμετάθεση) για κάθε πέρασμα Βρίσκει το μεγαλύτερο στοιχείο σε κάθε πέρασμα και το τοποθετεί στην κατάλληλη θέση

61 Ταξινόμηση επιλογής Μετά το πρώτο πέρασμα το μεγαλύτερο (ή μιρότερο) στοιχείο είναι στην σωστή θέση. Η διαδικασία αυτή επαναλαμβάνεται μέχρι όλα τα στοιχεία να ταξινομηθούν

62 Ταξινόμηση επιλογής Εξερευνήστε την οπτικοποίηση της ταξινόμησης στις διευθύνσεις που δόθηκαν παραπάνω

63 Ψευδο-κώδικας εύρεσης ελάχιστου
Min <- table[0] Για i από 2 μέχρι n Αν table[i] <min τότε min<-table[i] Τέλος_αν Τέλος_επανάληψης Να γράψετε μια συνάρτηση που θα υλοποιεί τον αλγόριθμο ταξινόμησης επιλογής σε μια λίστα Python


Κατέβασμα ppt "Πολυπλοκότητα Αλγορίθμων"

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google