22Υ103 Εισαγωγή Υπολογιστές Ι #Ενότητα 2 Αλγόριθμοι, Δομές Δεδομένων και Πολυπλοκότητα - Εισαγωγή στον προγραμματισμό με τη γλώσσα Python Εβδομάδες 4-5
Αλγόριθμοι / Μέρος Γ Αλγοριθμικές δομές επανάληψης 2
ερώτηση Αν ένας υπολογιστής σήμερα μπορεί να εκτελέσει εκατομμύρια εντολών το δευτερόλεπτο, για να τρέξει ένα πρόγραμμα για ένα δευτερόλεπτο, εγώ πρέπει να γράψω ένα εκατομμύρια εντολές στο πρόγραμμα μου; 3
απάντηση Ηδυνατότητα του υπολογιστή να εκτελέσει πολλές εντολές/ δευτερόλεπτο, στηρίζεται στη δυνατότητα του να εκτελέσει πολλές όμοιες εντολές επαναληπτικά Π.χ. ένας ορθογράφος κειμένου θα ελέγξει μια λέξη και μετά την επόμενη Ένας video player να ζωγραφίσει ένα pixel ενός frame video και μετά το επόμενο 4
Βρόχοι επανάληψης Εντολές επανάληψης μιας ομάδας εντολών πολλές φορές Απαραίτητη ησυνθήκη τερματισμού του βρόχου επανάληψης 1 x = 0 2 while x < 5: 3 print x 4 x = x + 1 5 print "Done." while συνθήκη : εντολή Ποια ηακολουθία εκτέλεσης των εντολών αυτών και ποιο το αποτέλεσμα; 5
Άσκηση: να υπολογίσετε το άθροισμα s=1+2+ +n n = input() i = 0 s = 0 while (i <= n) : s = s + i i = i + 1 print s 6
Άσκηση (Φροντιστήριο Φ7) Να κατασκευάσετε ένα πρόγραμμα (διάγραμμα ροής και python) που υπολογίζει με επαναληπτική διαδικασία σε πόσα χρόνια θα γίνετε εκατομμυριούχος αν έχετε ήδη Χευρώ και τοκίζετε τα χρήματα σας με επιτόκιο Ε% το χρόνο 7
Βρόχος επανάληψης σε διάγραμμα ροής (η συνθήκη στην αρχή ήστο τέλος) Υπολογισμός s=1+2+ +n ΕΝΤΟΛΕΣ read n I 0; s 0 repeat { s s+i i i+1 } until (i>n) print s ΣΥΝΘΗΚΗ 8
Επαναληπτικές δομές Τυπική επαναληπτική δομή ΑΡΧΗ Δομή βρόχου while ΑΡΧΗ ΝΑΙ Κάνε κάτι Θέλεις να συνεχίσεις; ΟΧΙ ΤΕΛΟΣ Θέλεις να το εκτελέσεις; ΝΑΙ Κάνε κάτι ΤΕΛΟΣ ΟΧΙ 9
Τροποποίηση αθροιστή αριθμών ΑΡΧΗ Ζήτησε τα X, Y ΝΑΙ πρόσθεσε X και Y Εμφάνισε το αποτέλεσμα Να συνεχίσω; ΟΧΙ ΤΕΛΟΣ 10
Λύση στην άσκηση answer = "y" while answer == "y": x = float(raw_input(«δώσε 1 ο αριθμό:")) y = float(raw_input(«δώσε 2 ο αριθμό:")) sum = x + y print "Sum:" + str(sum) answer = raw_input(«να συνεχίσω (y/n)? ") print "*** τέλος προγράμματος ***" 11
Άσκηση (μέρος Β, Φροντ. 6) Γράψτε δύο συναρτήσεις hasletters(s) και hasdigits(s) οι οποίες δέχονται σαν παράμετρο μια συμβολοσειρά s και η πρώτη γίνεται true αν υπάρχει κάποιος αλφαβητικός χαρακτήρας στην s και η δεύτερη αν υπάρχει αριθμός στην s. Σημείωση : δες τις συναρτήσεις isalpha() και isdigit(). 12
while true - break Διακοπή βρόχου όταν συμβεί γεγονός while true: userinput = raw_input("enter an integer:") if userinput.isdigit() or \ userinput[0] == "-" and userinput[1:].isdigit(): break else: print "Incorrect input." 13
Βρόχοι επανάληψης με απαρίθμηση (for) for i in range(start,end,step): εντολές Όπου i είναι μεταβλητή απαρίθμησης ηοποία παίρνει τιμές από start, σε end με βήμα step 14
Ισοδυναμία δομών for και while for i in range(start,end,step): εντολές i = start while i < end: # προσοχή < όχι <= εντολές... i = i + step 15
παραδείγματα for i in range (0, 6, 1): print i, #prints 0 1 2 3 4 5 #print the integers from 1 to 15 for i in range(1, 16, 1): print i, 16
for i in range(6): print i, #prints 0 1 2 3 4 5 Θεωρεί range (0, 6, 1) 17
παραδείγματα 18
Αλγόριθμοι: αναπαράσταση διαγράμματος ροής 19
Άσκηση Να γράψετε σε python και διάγραμμα ροής τον αλγόριθμο που υπολογίζει την παρακάτω συνάρτηση με χρήση των εντολών while και for : 0, n 0 F(n)= { n Σ i *(i+1), n > 0 i=1 20
Άσκηση Να περιγράψετε τον αλγόριθμο που υπολογίζει το Α mod (B) υπόλοιπο διαίρεσης του Ααπό το Β. Να περιγράψετε τον αλγόριθμο που υπολογίζει τον μέγιστο κοινό διαιρέτη δύο αριθμών Ακαι Β. Να εκφράσετε τους αλγορίθμους αυτούς με python και διάγραμμα ροής 21
Παράδειγμα Υπόλοιπο Α mod (B) Read A Read B A A-B ΟΧΙ B >= A ΝΑΙ Τύπωσε Α 22
ΑλγόριθμοςΜέγιστου ΚοινούΔιαρέτηδύο αριθμώνα,β. START READ A,B Αλγόριθμος NO YES Μέγιστου A < B Κοινού Z <-- Β Z <-- Α Διαιρέτη (1η έκδοση) A MOD Z <> 0 OR B MOD Z <>0 YES Z <-- Z - 1 NO PRINT "OΜέγιστος ΚοινόςΔιαιρέτης είναι " Z STOP 23
Αλγόριθμος ΜΚΔ (2η έκδοση) temp num1 num1 num2 num2 temp 24
Ακολουθίες δεδομένων Lists Tuples Dictionaries 25
Lists στην Python [ a, b, c ] ages = [12, Γιώργος, 157] print ages[0] #prints 12 ages[1] = -5 #αντικαθιστά το περιεχόμενο της θέσης 1 με την τιμή 5; #ages περιέχει [12, -5, 157] ages[2] = ages[2] 1 #μειώνει την τιμή στη θέση 2 κατά 1; #ages περιέχει [12, -5, 156] 26
lists hives = [16, 2, 105] numhives = len(hives) #περιέχει το μήκος της λίστας hives #numhives == 3 hives[numhives] = 40 #ERROR! 16 0 2 1 105 2 27
lists numbers = [ ] #creates an empty list numbers.append(47) #numbers == [47] numbers.append(10) #numbers == [47,10] numbers.append(-3) #numbers == [47,10,-3] 28
Πώς εισάγουμε 200 ονόματα φοιτητών σε μια λίστα; classlist = [] print ( δώσε ονόματα: ) for i in range(200): name = raw_input( όνομα # + str(i+1) ) classlist.append(name) 29
Πώς διαγράφουμε ένα στοιχείο από τη λίστα; classlist.pop(3) Διαγράφει το στοιχείο #3 της λίστας classlist.remove( nikos ) Διαγράφει το πρώτο στοιχείο της λίστας που έχει αυτή την τιμή 30
Επεξεργασία μιας λίστας με βρόχο for names = [ nikos, george, kostas ] for i in range(len(names)): print "Name " + str(i+1) + ": " + names[i] #prints: Name 1: nikos Name 2: george Name 3: kostas 31
Αναζήτηση αντικειμένου στη λίστα def searchlist(list, item): for i in range(len(list)): if list[i] == item: #found it! return i #at index i! #έξοδος από δω return 1 #δεν βρέθηκε ----------------------------- numbers = [3,7,2,8] index1 = searchlist(numbers, 8) #index1 == 3 index2 = searchlist(numbers, 14) #index2 == -1 32
Ημαθηματική έννοια του πίνακα μπορεί να υλοποιηθεί με list Πώς ορίζεται ένας δισδιάστατος πίνακας; list = [ [2,6,4,7], [1,0,3,2] ] print list[0][2] #prints row 0, column 2 == 4 print list[0] #prints row 0 == [2,6,4,7] 0 1 2 3 0 2 6 4 7 1 1 0 3 2 33
Δισδιάστατη λίστα list = [ [2,6,4], [1,0,3] ] for i in range(2): for j in range(3): print list[i][j], print #αρχίζει την επόμενη γραμμή #τυπώνει: 2 6 4 1 0 3 34
Άλλες μέθοδοι σε list append(x) Add an item to the end of the list; equivalent to a[len(a):] = [x]. extend(l) Extend the list by appending all the items in the given list; equivalent to a[len(a):] = L. insert(i, x) Insert an item at a given position. The first argument is the index of the element before which to insert, so a.insert(0, x) inserts at the front of the list, and a.insert(len(a), x) is equivalent to a.append(x). remove(x) Remove the first item from the list whose value is x. It is an error if there is no such item. pop([i]) Remove the item at the given position in the list, and return it. If no index is specified, a.pop() removes and returns the last item in the list. (The square brackets around the i in the method signature denote that the parameter is optional, not that you should type square brackets at that position. index(x) Return the index in the list of the first item whose value is x. It is an error if there is no such item. count(x) Return the number of times x appears in the list. sort() Sort the items of the list, in place. reverse() Reverse the elements of the list, in place. 35
tuples Τα tuples μοιάζουν με τις λίστες. Ορίζονται σαν ακολουθίες αριθμών χωρισμένων με κόμματα. Ηπρόσβαση σε αυτά είναι γρηγορότερη, αλλά δεν μπορούμε να προσθέσουμε ήνα διαγράψουμε στοιχεία. >>> my_tuple= 1,2,3,4 >>> my_tuple[1:2] (2, 3) 36
dictionaries - Τα λεξικά είναι μη ταξινομημένες λίστες. Κάθε στοιχείο του λεξικού έχει ένα κλειδί για την αναφορά σε αυτό: phonebook = {"Alice": 6943456789, "Boris": 6934456789, "Clarice": 6948896754, "Doris": 6987345678} person = { first name : "Robin", last name : "Hood", occupation : "Scoundrel"} print person["occupation"] # Prints "Scoundrel" person[ last name ] = "of Locksley - Όπως και οι λίστες τα λεξικά μπορεί να περιέχουν άλλα λεξικά ήκαι λίστες. Φυσικά και οι λίστες μπορούν να περιέχουν λεξικά. Τα στοιχεία των λεξικών μπορούν να αλλάξουν και δεν είναι απαραίτητο να είναι του ίδιου τύπου. 37
Άσκηση. Να μεταφερθεί ο αλγόριθμος σε python for ( I = 2 έως 10 ) J 10 While ( J >= I ) {if A[J-1] > A[J] then { X A[J-1] A[J-1] A[J] A [ J] X } J J-1 } Αν οπίνακας Απεριέχει τα στοιχεία (5, 3, 2, 1, 4, 6, 7, 8, 0, -1), ποιο θα είναι το περιεχόμενό του μετά την εκτέλεση του αλγορίθμου της άσκησης; 38
Modules - Οι πιο χρήσιμες συναρτήσεις και κλάσεις τοποθετούνται σε μονάδες (modules), που στην πραγματικότητα είναι αρχεία κειμένου που περιέχουν κώδικα. - Για να χρησιμοποιηθεί ένα module πρέπει να γίνει import. import string x = string.split(y) (Κάνουμε import το module και καλούμε τη συνάρτηση που θέλουμε όνομα_module.όνομα_συνάρτησης) 39
Εξαιρέσεις - Μερικές λειτουργίες (όπως η διαίρεση με το μηδέν ήηανάγνωση από ένα αρχείο που δεν υπάρχει) παράγουν μια συνθήκη σφάλματος ή εξαίρεση. Τότε το πρόγραμμα τελειώνει και εκτυπώνει ένα μήνυμα σφάλματος. Μπορούμε να το αποφύγουμε αυτό με την δομή try/except πρόταση. 40
Πρόταση try/except >>> def divide(x, y):... try:... result = x / y... except ZeroDivisionError:... print "division by zero!"... else:... print "result is", result... finally:... print "executing finally clause" 1. Πρώτα εκτελείται η εντολή try. 2. Αν δεν υπάρχει κανένα σφάλμα ηεντολή except παραλείπεται και εκτελείται ηelse. 3. Τέλος είτε υπάρχει εξαίρεση είτε όχι πριν τελειώσει ηtry εκτελείται ηfinally. 41
Try/except για έλεγχο εισόδου # -*- coding: cp1253 -*- while True: try: x = int(raw_input("δώστε ένα ακέραιο: ")) break except ValueError: print "Παρακαλώ! ακέραιο αριθμό..." 42
αρχεία f1=open(filename,"r") ή f1=file(filename, r ) text = f1.readline() διαβάζει μια γραμμή ενός αρχείου κειμένου text = f1.readlines() διαβάζει όλες τις γραμμές ενός αρχείου κειμένου f1.close() 43
Μέρος Δ. Δυναμικές Δομές Δεδομένων Δομές που καταλαμβάνουν δυναμικά μνήμη, ανάλογα με τον αριθμό στοιχείων που έχουν κάθε στιγμή Συνδεδεμένες λίστες ουρές (queues) σωροί (stacks) δένδρα (trees) 44
Δείκτες (pointers) Μεταβλητές που περιέχουν τη διεύθυνση κάποιας άλλης μεταβλητής Βασικό συστατικό εργαλείο για τη δημιουργία δυναμικών δομών δεδομένων 1001 D1 D2 1 I1 1002 4 I2 45
Συνδεδεμένες λίστες Δομές που απαρτίζονται από σειρά διατεταγμένων στοιχείων, καθένα από τα οποία εκτός από τα κυρίως δεδομένα περιέχει έναν δείκτη προς το επόμενο στοιχείο της λίστας δεδομένα δεδομένα 46
Απλά συνδεδεμένες λίστες 1001 1005 1012 1014 1016 1020 1032 σε γνωρίζω από την κόψη του σπαθιού 47
Συνδεδεμένες Λίστες (συνέχεια) Διπλά συνδεδεμένες λίστες Κυκλικές λίστες 48
Εισαγωγή στοιχείων σε συνδεδεμένη λίστα q p p 49
Διαγραφή στοιχείων από συνδεδεμένη λίστα p p Πώς υλοποιείται ηεισαγωγή και διαγραφή στοιχείων από λίστα στην Python; 50
Ουρές (queues) First In First Out (FIFO) ΣΤΑΣΗ 51
Ουρές (queues) Δυναμικές δομές στις οποίες το πρώτο στοιχείο που εισάγεται είναι και το πρώτο που θα εξαχθεί (First In First Out) Υλοποίηση με πίνακες ήλίστες 5 3 6 4 head tail 52
Ανάκληση στοιχείου από ουρά X= 5 3 6 head head if head=tail then μήνυμα " άδεια ουρά " else { Χ key(head) if (next(head) = NIL then head tail else head next(head) } 4 tail 53
Υλοποίηση ουρών με list της Python >>> queue = ["Eric", "John", "Michael"] >>> queue.append("terry") # Terry arrives >>> queue.append("graham") # Graham arrives >>> queue.pop(0) 'Eric' >>> queue.pop(0) 'John' >>> queue ['Michael', 'Terry', 'Graham'] 54
Σωροί (stacks) Δυναμικές δομές στις οποίες το τελευταίο στοιχείο που εισάγεται είναι και το πρώτο που θα εξαχθεί Last in First Out (LIFO) 55
Σωροί (stacks) Last In First Out Υλοποίηση με πίνακες ήλίστες 12 20 34 6 5 prev Key top next 56
Ανάκληση στοιχείου από σωρό 12 20 34 6 5 if top είναι εκτός κάτω ορίου μνήμης top top then μήνυμα " underflow " else { Χ key (top) (επιστροφή του άνω στοιχείου) next top (ελευθέρωσε το άνω στοιχείο) if prev(top) NIL then top prev(top) else στείλε μήνυμα "άδειος σωρός" } next 57
Υλοποίηση σωρών στην Python >>> stack = [3, 4, 5] >>> stack.append(6) >>> stack.append(7) >>> stack [3, 4, 5, 6, 7] >>> stack.pop() 7 >>> stack [3, 4, 5, 6] >>> stack.pop() 6 >>> stack.pop() 5 >>> stack [3, 4] 58
Δέντρα (trees) Iεραρχικές δομές δεδομένων που θυμίζουν τα οικογενειακά δένδρα Τα στοιχεία του δένδρου λέγονται κόμβοι Ένας κόμβος χωρίς απογόνους λέγεται τερματικός κόμβος ήφύλλο 59
Δεντρα (συνέχεια) Α ρίζα Β Γ Δ Ε Ζ Η Θ Ι Κ φύλλα Δυαδικά δέντρα, κάθε κόμβος έχει το πολύ δύο «παιδιά» right datum left 60
Αναζήτηση σε δυαδικό δένδρο TREE-SEARCH (x, k) if x = NIL ή k = datum (x) then (να επιστραφεί ητιμή k = datum (x) ) else if k < datum (x) then TREE-SEARCH ( left (x), k) else TREE-SEARCH (right (x), k) 61
Φροντιστηριακή Άσκηση Φ5 5.1 Έστω ένας σωρός στον οποίο εκτελούνται διαδοχικά οι εντολές push(5), push(3), pop(), push(7), pop(), push(8), push(9), pop(). Να περιγράψετε βήμα προς βήμα το περιεχόμενο του σωρού. 5.2 Σε ένα φυλλομετρητή να αναφέρετε ένα παράδειγμα χρήσης λειτουργίας του σωρού 5.3 Να περιγράψετε τον αλγόριθμο εισαγωγής στοιχείων σε διπλά συνδεδεμένη λίστα 62
Αρχεία Χώροι μόνιμης φύλαξης δεδομένων Τρόποι προσπέλασης Σειριακή προσπέλαση : Απαιτεί μεγάλο χρόνο αναζήτησης Τυχαία προσπέλαση : Απαιτεί την ύπαρξη κλειδιού, αρχείου ευρετηρίου (index file) 63
Αρχεία (συνέχεια) Αρχεία κατακερματισμού (hashing functions) Τρόπος άμεσης προσπέλασης Μεγάλη ταχύτητα αναζήτησης Αυξημένη πολυπλοκότητα υλοποίησης 64
Άσκηση (Φ5.1) 1. Έστω ότι έχουμε ένα πίνακα που περιέχει στοιχεία μιας ομάδας σπουδαστών με τις βαθμολογίες τους στο μάθημα : Αρ. Μητρώου Επίθετο Όνομα Βαθμός Να ορίσετε την απαραίτητη εγγραφή TAXH που απαιτείται για την αποθήκευση αυτής της πληροφορίας, να ορίσετε στη συνέχεια έναν πίνακα εγγραφών Pinax(50), στον οποίο να εισάγετε τα παραπάνω στοιχεία. Στη συνέχεια να δώσετε τον αλγόριθμο εισαγωγής στοιχείων στον πίνακα. 2. Να δώσετε σε μορφή ψευδοκώδικά τους αλγορίθμους εισαγωγής στοιχείων σε ουρά και σωρό που υλοποιούνται με λίστες 65
Πολυπλοκότητα Ηεκτίμηση του χρόνου εκτέλεσης του αλγορίθμου O(x) order x ως συνάρτηση του μεγέθους του προς επίλυση προβλήματος. Παράδειγμα ποια ηπολυπλοκότητα του αλγορίθμου αναζήτησης ενός ονόματος σε μια ταξινομημένη λίστα με δυαδική αναζήτηση και σειριακή αναζήτηση. 66
Μοντέλα υπολογιστών : ημηχανή Τuring 67
Άσκηση Φ5.2 Να εκφράσετε το θεώρημα μη πληρότητας του Goedel και το θεώρημα της υπολογησιμότητας του Turing. Μελετήστε τις συνέπειες των θεωρημάτων αυτών σε θεωρία αλγορίθμων 68