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

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
3.4 Στοίβα (stack) (μόνο θεωρία)
Advertisements

Συλλογές, Στοίβες και Ουρές Σε πολλές εφαρμογές μας αρκεί η αναπαράσταση ενός δυναμικού συνόλου με μια δομή δεδομένων η οποία δεν υποστηρίζει την αναζήτηση.
Αλγόριθμοι Αναζήτησης
POINTERS, AGGREGATION, COMPOSITION. POINTERS TO OBJECTS.
-Στοίβα-Ουρά - Πλεονεκτήματα πινάκων -Δομές δεδομένων δευτερεύουσας μνήμης -Πληροφορική και δεδομένα -Παραδείγματα-Προβλήματα ψευδοκώδικα.
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι
ΣΤΟΙΧΕΙΑ ΨΕΥΔΟΚΩΔΙΚΑ ΒΑΣΙΚΕΣ ΔΟΜΕΣ ΒΑΣΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ ΠΙΝΑΚΩΝ
ΔΙΔΑΚΤΙΚΕΣ ΔΥΣΚΟΛΙΕΣ ΣΤΟΥΣ ΠΙΝΑΚΕΣ ΠΕΚ ΠΕΙΡΑΙΑ Α΄φάση Επιμόρφωσης Εκπ/κών κλάδου ΠΕ19 Διδακτική της Πληροφορικής Ρόδος, Νοέμβρης 2007.
TEMPLATES STANDARD TEMPLATE LIBRARY ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ C Evangelos Theodoridis.
ΜΑΘ-3122/106 Προγραμματισμός
Στοίβα & Ουρά Πέμπτη 08/03/2007 Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον Τμήμα: Γ3τεχν. Καθηγητής :Ν. Γιαννακόπουλος ΠΕ19 Ερωτήσεις:
Εισαγωγικές Έννοιες Διδάσκοντες: Σ. Ζάχος, Δ. Φωτάκης Επιμέλεια διαφανειών: Δ. Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο.
Κοντινότεροι Κοινοί Πρόγονοι α βγ θ δεζ η π ν ι κλμ ρσ τ κκπ(λ,ι)=α, κκπ(τ,σ)=ν, κκπ(λ,π)=η κκπ(π,σ)=γ, κκπ(ξ,ο)=κ ξο κκπ(ι,ξ)=β, κκπ(τ,θ)=θ, κκπ(ο,μ)=α.
ΗΥ 150 – ΠρογραμματισμόςΞενοφών Ζαμ π ούλης ΗΥ-150 Προγραμματισμός Αλγόριθμοι και Προγράμματα.
Δυναμική Διατήρηση Γραμμικής Διάταξης Διατηρεί μια γραμμική διάταξη δυναμικά μεταβαλλόμενης συλλογής στοιχείων. Υποστηρίζει τις λειτουργίες: Έλεγχος της.
ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ 2: ΘΕΜΑΤΑ ΘΕΩΡΗΤΙΚΗΣ ΕΠΙΣΤΗΜΗΣ Η/Υ
Ε. ΠετράκηςΣτοίβες, Ουρές1 Στοίβες  Στοίβα: περιορισμένη ποικιλία λίστας  τα στοιχεία μπορούν να εισαχθούν ή να διαγραφούν μόνο από μια άκρη : λίστες.
Στοίβα, Ουρά.
Αλγόριθμοι συνέχεια 2.2.4, 2.2.5,
Ουρά Προτεραιότητας: Heap
ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ
Lists– Λίστες 1. Αυτό-αναφορικές δομές Τα μέλη μίας δομής μπορεί να είναι οποιουδήποτε τύπου, ακόμα και δείκτες σε δομές του ίδιου τύπου. Χρησιμοποιώντας.
2-1 Ανάλυση Αλγορίθμων Αλγόριθμος Πεπερασμένο σύνολο εντολών που, όταν εκτελεστούν, επιτυγχάνουν κάποιο επιθυμητό αποτέλεσμα –Δεδομένα εισόδου και εξόδου.
TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Ουρά Προτεραιότητας (priority queue) Δομή δεδομένων που υποστηρίζει.
Δομές Δεδομένων. Επιλογή δομής δεδομένων Κριτήρια: – Μέγεθος του προβλήματος – Πως θα χρησιμοποιηθεί Ενέργειες που καθορίζουν το κόστος: – Lookup: αναζήτηση/έλεγχος.
ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ 2: ΘΕΜΑΤΑ ΘΕΩΡΗΤΙΚΗΣ ΕΠΙΣΤΗΜΗΣ Η/Υ
Λεξικό, Union – Find Διδάσκοντες: Σ. Ζάχος, Δ. Φωτάκης Επιμέλεια διαφανειών: Δ. Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο.
ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ
Κεφάλαιο 10 – Υποπρογράμματα
Αλγόριθμοι - Τμήμα Πληροφορικής ΑΠΘ - 4ο εξάμηνο1 Ανάλυση Αλγορίθμων b Θέματα: Ορθότητα Χρονική αποδοτικότητα Χωρική αποδοτικότητα Βελτιστότητα b Προσεγγίσεις:
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι
ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ §3.7 ΤΑΞΙΝΟΜΗΣΗ
Ασυμπτωτικός Συμβολισμός
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι13-1 Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Ο αλγόριθμος Dijkstra για εύρεση βραχυτέρων μονοπατιών.
1 ΤΜΗΜΑ ΜΠΕΣ Αλγόριθμοι Αναζήτησης Εργασία 1 Τυφλή Αναζήτηση.
Δομές Δεδομένων 1 Θέματα Απόδοσης. Δομές Δεδομένων 2 Οργανώνοντας τα Δεδομένα  Η επιλογή της δομής δεδομένων και του αλγορίθμου επηρεάζουν το χρόνο εκτέλεσης.
ΚΕΦΑΛΑΙΟ Τι είναι αλγόριθμος
Χρονική Πολυπλοκότητα
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 4-1 Στην ενότητα αυτή θα μελετηθεί η χρήση στοιβών στις εξής εφαρμογές: Αναδρομικές συναρτήσεις Ισοζυγισμός Παρενθέσεων.
Σχεδίαση Αλγορίθμων - Τμήμα Πληροφορικής ΑΠΘ - 4ο εξάμηνο1 Ανάλυση Αλγορίθμων b Θέματα: Ορθότητα Χρονική αποδοτικότητα Χωρική αποδοτικότητα Βελτιστότητα.
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ Διδάσκοντες:Στάθης Ζάχος Νίκος Παπασπύρου
Κεφάλαιο 3ο Δομές Δεδομένων.
Συνδετικότητα γραφήματος (graph connectivity). α β Υπάρχει μονοπάτι μεταξύ α και β; Παραδείγματα: υπολογιστές ενός δικτύου ιστοσελίδες ισοδύναμες μεταβλητές.
Δομές δεδομένων και Αλγόριθμοι Κεφάλαιο 3. Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον Δεδομένα Δεδομένα (data) Δεδομένα (data) –αφαιρετική αναπαράσταση.
ΔΥΑΔΙΚΗ ΑΝΑΖΗΤΗΣΗ & ΤΑΞΙΝΟΜΗΣΗ ΜΕ ΣΥΓΧΩΝΕΥΣΗ. Δυαδική αναζήτηση (Binary search) ΔΕΔΟΜΕΝΟ: ένα μεγάλο αρχείο που περιέχει τιμές z [0,1,…,n-1] ταξινομημένες.
Οι Δομές Δεδομένων Ουρά και Στοίβα
Δυναμικός Κατακερματισμός
ΑΛΓΟΡΙΘΜΟΣ ΠΡΟΒΛΗΜΑ ΑΛΓΟΡΙΘΜΟΣ ΛΥΣΗ
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
9η Διάλεξη Ταξινόμηση Ε. Μαρκάκης
Διδάσκων: Δρ. Τσίντζα Παναγιώτα
Αρχεσ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ ΤΑξη Β΄
Αρχεσ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ ΤΑξη Β΄
ΓΕΜΙΣΜΑ ΜΟΝΟΔΙΑΣΤΑΤΟΥ ΠΙΝΑΚΑ (Άσκηση 1)
Μανασσάκης Βασίλης Καθηγητής Πληροφορικής
Μονοδιάστατοι πίνακες
ΣΤΟΙΒΑ.
Σειριακή ή Γραμμική Αναζήτηση 1.Μοναδικό Κλειδί (key)
ENOTHTA 2. ΘΕΜΑΤΑ ΘΕΩΡΗΤΙΚΗΣ ΕΠΙΣΤΗΜΗΣ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΚΕΦΑΛΑΙΟ 2
Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον ΑΕΠΠ
ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΩΝ Η/Υ
Οι Δομές Δεδομένων Ουρά και Στοίβα
Ουρά Προτεραιότητας (priority queue)
Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον ΑΕΠΠ
ΑΣΥΜΠΤΩΤΙΚΗ ΑΝΑΛΥΣΗ & ΠΡΟΣΘΕΣΗ
Πολυπλοκότητα Αλγορίθμων
Δυναμικός Κατακερματισμός
Μανασσάκης Βασίλης Καθηγητής Πληροφορικής
ΠΙΝΑΚΕΣ Δομή ΟΥΡΑΣ (queue)
Μεταγράφημα παρουσίασης:

Πολυπλοκότητα Αλγορίθμων ΓΕ0170 -Αλγόριθμοι και Προηγμένες Προγραμματικές Τεχνικές Πολυπλοκότητα Αλγορίθμων Νίκος Αθανάσης e-mail: athanasis@geo.aegean.gr

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

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

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

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

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

Λίστες και καταχώρηση τιμών (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)

Λίστες και καταχώρηση τιμών (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")

Μερικό άθροισμα 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))

Μερικό άθροισμα 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))

Διπλά γράμματα 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")

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

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

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

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

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

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

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

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

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) Τι πολυπλοκότητα έχει?

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

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

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

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

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

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

Συμβολισμός Θ Συμβολισμός Θ. Μία συνάρτηση 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).

Συμβολισμός Ο «Η 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 + 2017 διότι, τα μικρότερα μέρη τείνουν να μην έχουν σημασία σε μεγάλη κλίμακα

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

Παραδείγματα Η συνάρτηση 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≤ (5+3+2+4+1)n4 = cn4, για c = 15 Η 5n2 +3nlog n+2n+5 is O(n2). Διότι:5n2 +3nlog n+2n+5 ≤(5+3+2+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

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

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

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

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

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

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

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

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

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

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

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

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

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

Η Δομή Δεδομένων: Ουρά Μια Ουρά είναι μια δομή δεδομένων όπου τα αντικείμενα εισέρσχονται και διαγράφονται με βάση την αρχή 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) της ουράς.

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

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

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

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

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

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

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

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

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

Ταξινόμηση

https://www.toptal.com/developers/sorting-algorithms/ https://visualgo.net/sorting

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

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

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

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

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

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

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

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