Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
1
Πολυπλοκότητα Αλγορίθμων
ΓΕ0170 -Αλγόριθμοι και Προηγμένες Προγραμματικές Τεχνικές Πολυπλοκότητα Αλγορίθμων Νίκος Αθανάσης
2
Λύση της Άσκησης Ανοίξτε το αρχείο ATMSimulation.py από τον φάκελο του μαθήματος
3
fruits = ['apple', 'pear', 'banana', 'kiwi', 'apple', 'pineapple']
print ("Fruits are: {}".format(fruits)) print ("How many fruits are there? {}".format(len(fruits))) print ("How many grapes are there? {}".format(fruits.count('grape'))) print ("First two fruits are: {}".format(fruits[0:2])) fruits.reverse() print ("Fruits reversed:", end = " ") print(fruits) fruits.append('grape') fruits.insert(1, "grape fruit") print ("Appending grape and inserting grape fruit at place 1. Fruits now are: {}".format(fruits)) fruits.sort() print ("Fruits sorted: {}".format(fruits)) forest_fruits = ['strawberries', 'raspberries', 'blueberries'] print ("Forest fruits:", end = " ") print(forest_fruits) fruits.extend(forest_fruits) print ("Extending fruits with forest fruits:", end = " ") fruits.remove("apple") print ("Removing apple. Fruits are: {}".format(fruits)) # Πώς θα διαγράψουμε όλα τα apples? print ("Fruits seperated with \",\":") for fruit in fruits: print(fruit,end=',')
4
fruits = ['apple', 'banana', 'kiwi', 'apple']
print(fruits) print("len={}".format(len(fruits))) while (fruits.count("apple")!=0): fruits.remove("apple") print ("Removing apple. Fruits are: {}".format(fruits)) print("Banana is located at position:{}".format(fruits.index("banana"))) name = input("Name:") if not name.startswith("N"): print("{} does not start with \"N\"".format(name)) else: print("{} starts with \"N\"".format(name)) if name.endswith("s"): print("{} ends with \"s\"".format(name)) print("{} does not end with \"s\"".format(name))
5
vec = [-4, -2, 0, 2, 4] vec2 = [x*2 for x in vec] print (vec2) vec3 = [x for x in vec if x >= 0] print(vec3) vec4 = [abs(x) for x in vec] print(vec4) names = [' nick dimitriou', ' jack zahariou', ' maria anastasiou '] names2= [name.strip() for name in names] print (names2) vec5 = [(x, x+1) for x in range(6)] print(vec5) list_sentence = ['this','is','a','sentence'] list_sentence = ' '.join(list_sentence)+"." print(list_sentence)
6
Επαναλήψεις names = ['Nick', 'Jack', 'Jim'] for name in names:
print(name) print() for i, v in enumerate(names): print(i, v) LastNames = ['Athanasis', 'Dimitriou', 'Zahariou'] for n, l in zip(names, LastNames): print('Name: {0}.\tLast name: {1}.'.format(n, l))
7
Κατοπτρικές φράσεις def katoptriki(s): s = s.replace(' ', '')
size = len(s) cnt = 0 i = 0 while i < size: if s[i] == s[-1-cnt]: i +=1 cnt+=1 else: return False return True print (katoptriki("νιψον ανομηματα μη μοναν οψιν")) Κατοπτρικές φράσεις
8
Αντιστροφή λέξεων σε φράση
def rev_word(s): words = [] s_split = s.split(' ') cnt = 0 for i in range(len(s_split)): word = s_split[-1-cnt] if len(word)>0: words.append(word) cnt +=1 #return words return " ".join(words) print (rev_word("nik athanasis")) def rev_word2(s): words = [] length = len(s) i = 0 while i < length: if s[i]!=' ': word_start = i while i < length and s[i]!=' ': i += 1 words.append(s[word_start:i]) words = reversed(words) return " ".join(words) print (rev_word2("nik athanasis")) Αντιστροφή λέξεων σε φράση
9
Συμπίεση του AAAABBBBCCCCCDDEEE σε A4B4C5D2E3
def compress(s): r = "" l = len(s) if l == 0: return "" if l == 1: return s + "1" cnt = 1 i = 1 while i < l: if s[i] == s[i - 1]: cnt += 1 else: r = r + s[i - 1] + str(cnt) i += 1 return r print compress("AAAABBBB") Εντοπίστε και διορθώστε το σφάλμα κατά την εκτέλεση
10
Tuples (πλειάδες): μη μεταβλητά αντικείμενα, (πιθανώς) διαφορετικών τύπων
t1 = ("a","b", 1) t2 = , 'hello!' t3 = t1,t2, (1, 2, 3, 4, 5) Οι λίστες είναι mutable (μεταβλητά αντικείμενα) και περιέχουν στοιχεία ίδιου τύπου Οι πλειάδες είναι μη μεταβλητά αντικείμενα (immutable) και μπορεί να είναι διαφορετικών τύπων
11
Παράδειγμα t1 = 12345, 54321, "hello1!" t2 = (12345, 54321, "hello1!")
print (t1 == t2) t2 = (12345, 54321, "hello2!") u = t1, t2, (1, 2, 3, 4, 5), "hello3", 1,2,3 print(u) print(u[1]) x = u[1] print(x[2]) #t1[0] = 0000 TypeError: 'tuple' object does not support item assignment #x[2] = "hello4" TypeError: 'tuple' object does not support item assignment
12
Sets (σειρές): Μη διατεταγμένα στοιχεία, ίδιου τύπου, χωρίς διπλότυπες εγγραφές
fruits = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'} print("Fruits:{}".format(fruits)) print("Fruits sorted:{}".format(sorted(fruits))) has_orange = 'orange' in fruits print("Has orange:{}".format(has_orange)) a = set('abcdd') print(a) b = set('abcce') print(b) c = a-b print(c) mylist = [1,2,3] mylistset = set(mylist) print("mylistset:{}".format(mylistset)) mylist2 = ["a","b","c"] mylistset2 = set(mylist2) print("mylistset2:{}".format(mylistset2)) c = mylistset2-mylistset #Εκτελέστε το πολλές φορές και δείτε τί συμβαίνει!
13
Dictionaries (λεξικά)
Αντί να χρησιμοποιούν ως δείκτη έναν αριθμό, χρησιμοποιούν ένα key tel = {'nick': , 'jim': } print ("Telephones:{}".format(tel)) print ("Telephone of nick:{}".format(tel['nick'])) dict([("nick", ), ("jim", )]) dict(nick= , jim= ) print ("Telephone of Jim:{}".format(tel['jim'])) tel['sofia'] = del tel['jim'] tel['nick'] = tel['antonis'] = keys_list = list(tel.keys()) print ("Telephone keys:{}".format(keys_list)) Περισσότερα στο DictionaryExample.py στο φάκελο του μαθήματος
14
Αναγραμματισμοί def anagram(s1,s2): s1 = s1.replace(' ','').lower()
if len(s1) != len(s2): return False dict = {} for letter in s1: if letter in dict: dict[letter] += 1 else: dict[letter] = 1 for letter in s2: dict[letter] -= 1 return True print(anagram('nik ','ink')) Αναγραμματισμοί
15
H Λίστα των HighScores (Nikos, 80) (Dimitris, 78) (Christos, 50) 1 2
1 2 New Game: (Maria, 79) (Nikos, 80) (Maria, 79) (Dimitris, 78) 1 2
16
Υλοποίηση Game Περισσότερα στο αρχείο PlayGame στο φάκελο του μαθήματος
17
Ταξινόμηση Εισαγωγής
18
Υλοποίηση InsertSort Περισσότερα στο αρχείο InsertSort στο φάκελο του μαθήματος
19
Λίστες και καταχώρηση τιμών (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)
20
Λίστες και καταχώρηση τιμών (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")
21
Μερικό άθροισμα 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))
22
Μερικό άθροισμα 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))
23
Διπλά γράμματα 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")
24
Αποτελεσματικότητα Αλγορίθμων
Είναι ο αλγόριθμος Α αποτελεσματικότερος του αλγόριθμου Β; Με άλλα λόγια, επιλύει ο αλγόριθμος Α το πρόβλημα Π σε λιγότερο χρόνο από τον αλγόριθμο Β; Πόσο θα αυξηθεί ο χρόνος εκτέλεσης του αλγόριθμου Α ή, ισοδύναμα, ο χρόνος επίλυσης του προβλήματος Π, εάν διπλασιάσουμε τα δεδομένα εισόδου του Π; Μπορώ να χρησιμοποιήσω τον αλγόριθμο Α, όταν τα δεδομένα εισόδου του προβλήματος Π, που επιλύει ο αλγόριθμος Α, είναι πολύ μεγάλα; Υπάρχει αλγόριθμος (ή, μπορώ να σχεδιάσω έναν) ο οποίος επιλύει το πρόβλημα Π σε δεδομένο χρόνο t;
25
Παράμετροι απόδοσης αλγόριθμου
Χρόνος εκτέλεσης Απαιτούμενοι πόροι, π.χ. μνήμη, ταχύτητα διακίνησης δεδομένων (π.χ. σε κατανεμημένα συστήματα)
26
Πολυπλοκότητα και χρόνος εκτέλεσης αλγορίθμου
Ένας αλγόριθμος με μικρό χρόνο εκτέλεσης θα λέμε ότι έχει μικρή πολυπλοκότητα χρόνου, ενώ αντίθετα ένας με μεγάλο χρόνο εκτέλεσης θα λέμε ότι έχει μεγάλη πολυπλοκότητα. Εμπειρική Προσέγγιση (posteriori) Θεωρητική Προσέγγιση (priori)
27
Εμπειρική Πολυπλοκότητα
start_time = time( ) run _algorithm() # record the ending time end_time = time( ) # compute the elapsed time elapsed = end_time − start_time Περισσότερα στο αρχείο Complexity στο φάκελο του μαθήματος
28
Θεωρητική Πολυπλοκότητα
H θεωρητική πολυπλοκότητα καθορίζει μαθηματικά το χρόνο (και άλλες παραμέτρους) που απαιτεί ο αλγόριθμος, συναρτήσει του μεγέθους των εξεταζόμενων εισόδων του. Το πλεονέκτημα της θεωρητικής προσέγγισης για τον υπολογισμό της αποτελεσματικότητας ενός αλγόριθμου είναι ότι: δεν εξαρτάται από τον Η/Υ, δεν εξαρτάται από την γλώσσα προγραμματισμού, δεν εξαρτάται από τις ικανότητες του προγραμματιστή.
29
Ασυμπτωτική ανάλυση Θέλουμε να συγκρίνουμε πόσο γρήγορα ο χρόνος εκτέλεσης αυξάνεται, όχι να συγκρίνουμε τους χρόνους εκτέλεσης αφού αυτοί εξαρτώνται από τους πόρους του συστήματος Αφού θέλουμε να συγκρίνουμε το χρόνο εκτέλεσης για διαφορετικά μεγέθη εισόδου, μας ενδιαφέρει η αύξηση του χρόνου εκτέλεσης σε σχέση με τα δεδομένα εισόδου Καθώς τα δεδομένα (n) αυξάνονται, μας ενδιαφέρει η συμπεριφορά του αλγορίθμου όταν τα δεδομένα (n) γίνονται πάρα πολύ μεγάλα (Ασυμπτωτική ανάλυση)
30
Ασυμπτωτική ανάλυση
31
Παραδείγματα πολυπλοκότητας
O(1) (σταθερή πολυπλοκότητα): Εύρεση του τηλεφώνου στον τηλεφωνικό κατάλογο αν γνωρίζουμε τη σελίδα και το όνομα που ψάχνουμε O(n) (γραμμική): Βρείτε όλα τα άτομα που το τηλέφωνό τους περιέχει το ψηφίο «9» O(n): Με δεδομένο ένα τηλέφωνο, βρείτε το όνομα στο οποίο αντιστοιχεί O(log n): Με δεδομένο ένα όνομα, βρείτε το τηλέφωνο του στον τηλεφωνικό κατάλογο (δυαδική αναζήτηση) O(n log n): Ταξινομήστε τις σελίδες του καταλόγου σε αλφαβητική σειρά, κοιτάζοντας το πρώτο όνομα σε κάθε σελίδα και τοποθετώντας κάθε σελίδα στην κατάλληλη θέση
32
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) Τι πολυπλοκότητα έχει?
33
Ασυμπτωτική ανάλυση
34
Αλγοριθμική ανάλυση Πίνακας αλγοριθμικής ανάλυσης
Μέγεθος δεδομένων προβλήματος (n) και συνολικές πράξεις που απαιτούνται για διαφορετικούς αλγορίθμους Πίνακας αλγοριθμικής ανάλυσης Μέγιστο μέγεθος δεδομένων 1’’ ’ h Μέγιστο μέγεθος δεδομένων προβλήματος (n) που μπορεί να λυθεί σε συγκεκριμένο χρονικό διάστημα για διαφορετικούς αλγόριθμους
35
Αλγοριθμική ανάλυση Αλγόριθμος Νέο μέγεθος
Αλγόριθμος Νέο μέγεθος Εάν χρησιμοποιήσω έναν υπολογιστή 256 φορές γρηγορότερο, ποιο είναι το μέγιστο μέγεθος προβλήματος που μπορεί να λυθεί στον ίδιο χρόνο;
36
Συμβολισμοί πολυπλοκότητας
Την πολυπλοκότητα την εκφράζουμε με τη βοήθεια ειδικών συμβολισμών: Ο, Ω, Θ. Χρησιμοποιούμε το συμβολισμό Ο και το συμβολισμό Ω για να δηλώσουμε ότι η επίδοση ενός αλγορίθμου είναι ασυμπτωτικά φραγμένη από επάνω και από κάτω αντίστοιχα. Με το συμβολισμό Θ δηλώνουμε ότι η επίδοση ενός αλγορίθμου είναι ασυμπτωτικά φραγμένη από επάνω και από κάτω ταυτόχρονα.
37
Συμβολισμός Ο Συμβολισμός Ο. Μία συνάρτηση f(n) λέγεται ότι έχει πολυπλοκότητα της τάξης O(g(n)) και συμβολίζεται με f(n) = O(g(n)) ή με f(n) ∈ O(g(n)), αν υπάρχει μία θετική σταθερά c και μία τιμή n0, έτσι ώστε για κάθε n > n0 να ισχύει η σχέση f(n) < c*g(n).
38
Συμβολισμός Ω Συμβολισμός Ω. Μία συνάρτηση f(n) λέγεται ότι έχει πολυπλοκότητα της τάξης Ω(g(n)) και συμβολίζεται με f(n) = Ω(g(n)) ή με f(n) ∈ Ω(g(n)), αν υπάρχει μία θετική σταθερά c και μία τιμή n0, έτσι ώστε για κάθε n > n0 να ισχύει η σχέση f(n) > c*g(n).
39
Συμβολισμός Θ Συμβολισμός Θ. Μία συνάρτηση 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).
40
Συμβολισμός Ο «Η 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 διότι, τα μικρότερα μέρη τείνουν να μην έχουν σημασία σε μεγάλη κλίμακα
41
Συμβολισμός Ο Μας ενδιαφέρει ο λόγος (ratio) καθώς το μέγεθος των δεδομένων τείνουν στο άπειρο
42
Παραδείγματα Η συνάρτηση 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
43
Παραδείγματα για καλύτερη κατανόηση
44
Παραδείγματα για καλύτερη κατανόηση
45
Παραδείγματα για καλύτερη κατανόηση
46
Η Δομή Δεδομένων: Στοίβα
Μια Δομή Δεδομένων Stack (Στοίβα) είναι μια συλλογή από αντικείμενα που προσθέτονται και διαγράφονται με βάση την αρχή: Τελευταίο μέσα, πρώτο έξω last-in, first-out (LIFO) . Ο χρήστης μπορεί να προσθέτει αντικείμενα στη στοίβα ανά πάσα στιγμή και έχει πρόβαση κάθε φορά στο τελευταίο χρονικά αντικείμενο που προστέθηκε, όπως ακριβώς γίνεται σε μια στοίβα στο νεροχύτη μας. Kάθε πιάτο που πλένεται τοποθετείται στην κορυφή (top) της στοίβας των πιάτων, ενώ για σκούπισμα λαμβάνεται και πάλι το πιάτο της κορυφής. Τα δεδομένα που βρίσκονται στην κορυφή της στοίβας λαμβάνονται πρώτα, ενώ αυτά που βρίσκονται στο βάθος της στοίβας λαμβάνονται τελευταία Όταν θέλουμε να χρησιμοποιήσουμε ένα νέο πιάτο κάνουμε pop (απώθηση) Όταν θέλουμε να προσθέσουμε ένα νέο πιάτο στη στοίβα κάνουμε push (ώθηση)
48
Έλεγχος της στοίβας Δύο είναι οι κύριες λειτουργίες σε μία στοίβα: η ώθηση (push) στοιχείου στην κορυφή της στοίβας, και η απώθηση (pop) στοιχείου από τη στοίβα. Η διαδικασία της ώθησης πρέπει οπωσδήποτε να ελέγχει, αν η στοίβα είναι γεμάτη, οπότε λέγεται ότι συμβαίνει υπερχείλιση (overflow) της στοίβας. Αντίστοιχα, η διαδικασία απώθησης ελέγχει, αν υπάρχει ένα τουλάχιστον στοιχείο στη στοίβα, δηλαδή ελέγχει αν γίνεται υποχείλιση (underflow) της στοίβας.
49
Λειτουργίες Στοίβας S.push(e): Ώθηση (προσθήκη) ενός αντικειμένου στην κορυφή. Ελεγχος υπερχείλισης S.pop(): Απώθηση (διαγραφή) ενός αντικειμένου από την κορυφή της στοίβας. Έλεγχος υποχείλισης S.top(): Επιστρέφει την κορυφή της στοίβας (χωρίς διαγραφή) S.is empty( ): Επιστρέφει True αν η στοίβα δεν περιέχει στοιχεία len(S): Επιστρέφε το μήκος της στοίβας. Λειτουργία Χρόνος εκτέλεσης
50
Λειτουργίες Στοίβας Λειτουργία Επιστρέφει Περιεχόμενα στοίβας
51
Υλοποίηση Στοίβας Μια στοίβα μπορεί να υλοποιηθεί με τη βοήθεια ενός μονοδιάστατου πίνακα. Μια βοηθητική μεταβλητή (top) χρησιμοποιείται για να δείχνει το στοιχείο που τοποθετήθηκε τελευταίο στην κορυφή της στοίβας. Για την εισαγωγή ενός νέου στοιχείου στη στοίβα (ώθηση) αρκεί να αυξηθεί η μεταβλητή top κατά ένα και στη θέση αυτή να εισέλθει το στοιχείο. Αντίθετα για την εξαγωγή ενός στοιχείου από τη στοίβα (απώθηση) εξέρχεται πρώτα το στοιχείο που δείχνει η μεταβλητή top και στη συνέχεια η top μειώνεται κατά ένα για να δείχνει τη νέα κορυφή. Μέθοδος Αντιστοιχία με Python
52
Υλοποίηση Στοίβας Περισσότερα στο αρχείο StackClass στο φάκελο του μαθήματος Ελέγξτε για υποχείλιση στην υλοποίση της StackClass. Γιατί δεν γίνεται έλεγχος για υπερχείλιση;
53
Εφαρμογή στοίβας Αντιστροφή περιεχομένου ενός αρχείου
Περισσότερα στο αρχείο ReverseFile στο φάκελο του μαθήματος
54
Εφαρμογή στοίβας Ταίριασμα παρενθέσεων σε έκφραση
Σωστό: ( )(( )){([( )])} • Σωστό: ((( )(( )){([( )])})) • Λάθος: )(( )){([( )])} • Λάθος: ({[ ])} • Λάθος: ( Έλεγχος εγκυρότητας html αρχείου Περισσότερα στο αρχείο Matching, Matchinghtml στο φάκελο του μαθήματος
55
Η Δομή Δεδομένων: Ουρά Οι ουρές είναι καθημερινό φαινόμενο. Για παράδειγμα, ουρές δημιουργούνται όταν άνθρωποι, αυτοκίνητα, εργασίες, προγράμματα κ.λπ. περιμένουν για να εξυπηρετηθούν. Το θέμα είναι τόσο σημαντικό και με τέτοιες πρακτικές επιπτώσεις, ώστε ένας ιδιαίτερος κλάδος των ΜαθηΜατικών και Πληροφορικής, η Θεωρία Ουρών (Queueing Theory), μελετά τη συμπεριφορά και την επίδοση των ουρών. Σε μία ουρά αναμονής με ανθρώπους, συμβαίνει να εξυπηρετείται εκείνος που στάθηκε στην ουρά πρώτος από όλους τους άλλους (αν και πολύ συχνά στην Ελάδα αυτό δεν ισχύει!
56
Η Δομή Δεδομένων: Ουρά Γραμμή προτεραιότητας
57
Η Δομή Δεδομένων: Ουρά Μια Ουρά είναι μια δομή δεδομένων όπου τα αντικείμενα εισέρσχονται και διαγράφονται με βάση την αρχή 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) της ουράς.
58
Λειτουργίες της Ουράς Λειτουργία Επιστρέφει Περιεχόμενα στοίβας
59
Υλοποίηση Ουράς Η υλοποίηση της ουράς θα μπορούσε να γίνει με τη βοήθεια μιας λίστας. Θα μπορούσαμε να εισάγουμε ένα στοιχείο e καλώντας την append(e) ώστε να εισάγεται στο τέλος της λίστας. Θα μπορούσαμε να κάνουμε εξαγωγή καλώντας την pop(0), ώστε να διαγραφεί το πρώτο στοιχείο της λίστας. Όμως, κάτι τέτοιο θα είχε ως αποτελέσμα να εκτελείται σε κάθε εξαγωγή ένας βρόγχος πολυπλοκότητας O(n) για να συμπληρωθεί το κενό που αφήνει η εξαγωγή του πρώτου στοιχείου Μπορούμε να αντιμετωπίσουμε το παραπάνω πρόβλημα αντικαθιστώντας την τιμή της εξαγωγής με το None και διατηρώντας σε μια μεταβλητή f (front index) την αρχή της ουράς. Έτσι, η εξαγωγή θα γίνεται σε χρόνο O(1). Το πρόβλημα που υπάρχει με την παραπάνω υλοποίηση είναι ότι το μήκος της ουράς μεγαλώνει όσο εισάγονται και εξάγονται στοιχεία. Μπορεί να έχω έτσι μια τεράστια λίστα που όμως διατηρεί λίγα στοιχεία
60
Υλοποίηση Ουράς Για να αντιμετωπίσοπυμε επιτυχώς τα παραπάνω προβλήματα, η ουρά υλοποιείται με μια “κυκλική” λίστα.η οποία έχει σταθερό μέγεθος Ν. Νέα στοιχεία εισάγονται στο τέλος της λίστας και το τελευταίο στοιχείο που έχει εισαχθεί βρίσκεται στη θέση N-1 τότε το επόμενο εισάγεται στη θέση 0 Κατά την εξαγωγή, ο δείκτης f (αρχή της ουράς) αυξάνεται σε f = (f + 1) % N. Για παράδειγμα, αν έχουμε μια λίστα μεγέθους 10 και η αρχή της ουράς είναι στο 7, μια νέα εξαγωγή θα κάνει την αρχή της ουράς να δείχνει στη θέση (7+1) % 10 = 8. Από τη θέση 9 όμως μια νέα εξαγωγή θα δείχνει την κορυφή της ουράς στη θέση (9+1) % 10 = 0
61
Υλοποίηση Ουράς Υλοποίηση της κλάσης Queue με τις παρακάτω μεταβλητές αντικειμένου instance variables. data: μια λίστα συγκερκριμένου μεγέθους που περιέχει τα στοιχεία τη ουράς size: ένας αριθμός που δείχει το τρέχον μέγεθος της ουράς (δηλαδή το μέγεθος της λίστας) front: ο δείκτης προς το πρώτο στοιχείοτης ουράς. Λειτουργία Χρόνος εκτέλεσης Περισσότερα στο αρχείο MyQueue στο φάκελο του μαθήματος
62
Αναζήτηση στοιχείου σε λίστα
Μη ταξινομημένη Ταξινομημένη
63
Ψευδο-κώδικας done ← ψευδής position ← 0 i ← 0
Όσο (done=ψευδής) και (i<n) επανάλαβε Αν table[i]=key τότε done ← αληθής position ← i αλλιώς i ← i+1 Τέλος_αν Τέλος_επανάληψης
64
Ψευδο-κώδικας – Ταξινομημένη Λίστα ΤΣΙΩΤΑΚΗΣ
done ← ψευδής position ← 0 i ← 0 Όσο (done=ψευδής) και (i<n) επανάλαβε Αν table[i]=key τότε done ← αληθής position ← i αλλιώς i ← i+1 Τέλος_αν Τέλος_επανάληψης
65
Διαδική αναζήτηση - ΤΣΙΩΤΑΚΗΣ
66
Διαδική αναζήτηση
67
Ψευδο-κώδικας - Διαδική αναζήτηση
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.