Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
ΔημοσίευσεΑρκάδιος Λύτρας Τροποποιήθηκε πριν 6 χρόνια
1
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Eισαγωγή στον προγραμματισμό Αναζήτηση και Ταξινόμηση Διδάσκων: Ν. Μαμουλής
2
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς.
3
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Αναζήτηση και Ταξινόμηση Χειμερινό Εξάμηνο 2014
4
Αναζήτηση και Ταξινόμηση
Βασικές λειτουργίες σε προγράμματα. Αναζήτηση (searching): Βρες ένα ζητούμενο στοιχείο σε μια δοθείσα ακολουθία στοιχείων. Ταξινόμηση (sorting): Ταξινόμησε μια δοθείσα ακολουθία στοιχείων. Οι περισσότερες μοντέρνες γλώσσες προγραμματισμού έχουν υλοποιημένες αυτές τις λειτουργίες σαν συναρτήσεις (ή μεθόδους). Εμείς θα μάθουμε κάποιους αλγορίθμους και πως υλοποιούνται στην Python.
5
Έτοιμες συναρτήσεις αναζήτησης στην Python
Η μέθοδος index() επιστρέφει τη θέση ενός στοιχείου σε μια ακολουθία. Αν το στοιχείο υπάρχει πολλές φορές, τότε επιστρέφει την πρώτη θέση. >>> s = 'abcdefab' >>> s.index('b') 1 >>> l = [1,2,3,4,5,6,1,2,3,4,5] >>> l.index(3) 2 >>> l.index(99) Traceback (most recent call last): File "<pyshell#42>", line 1, in <module> l.index(99) ValueError: 99 is not in list Η μέθοδος find() έχει παρόμοια συμπεριφορά, αλλά ισχύει μόνο για αλφαριθμητικά. Η μέθοδος get() «ψάχνει» σε λεξικά.
6
Συνάρτηση αναζήτησης Άσκηση: γράψτε μια συνάρτηση search_list, η οποία παίρνει σαν όρισμα μια λίστα και ένα στοιχείο και επιστρέφει την πρώτη θέση του στοιχείου στη λίστα αν το στοιχείο υπάρχει -1 αλλιώς. def search_list(l, x): for i in range(len(l)): if x == l[i]: return I return -1 if x in l: return l.index(x) >>> l = [1,2,3,4,5,6,1,2,3,4,5] >>> search_list(l, 4) 3 >>> search_list(l, 99) -1
7
Συνάρτηση αναζήτησης Άσκηση: γράψτε μια συνάρτηση search_list2, η οποία παίρνει σαν όρισμα μια λίστα και ένα στοιχείο και επιστρέφει όλες τις θέσεις του στοιχείου στη λίστα. def search_list2(l, x): pos = [] for i in range(len(l)): if x == l[i]: pos.append(i) return pos >>> l = [1,2,3,4,5,6,1,2,3,4,5] >>> search_list2(l, 4) [3, 9] >>> search_list2(l,99) []
8
Γραμμική αναζήτηση Οι search_list, search_list2 υλοποιούν τη γραμμική αναζήτηση (linear search), όπου κοιτάμε ένα-ένα τα στοιχεία της ακολουθίας μέχρι να βρούμε το στοιχείο (ή τα στοιχεία) που ψάχνουμε. Η γραμμική αναζήτηση δεν προϋποθέτει τίποτα σχετικά με την οργάνωση των στοιχείων στην ακολουθία ο απλούστερος δυνατός τρόπος αναζήτησης συγκρίνει όλα τα στοιχεία της ακολουθίας με το στοιχείο προς εύρεση χρήσιμος για μικρές, μη ταξινομημένες ακολουθίες.
9
Δυαδική αναζήτηση Μπορούμε να εφαρμόσουμε δυαδική αναζήτηση (binary search), αν η ακολουθία μας είναι ταξινομημένη. Π.χ. ψάχνουμε το στοιχείο key στη λίστα lst Βασική ιδέα: mid = len(lst)/2 (το μεσαία θέση στη λίστα) αν lst[mid] == key τότε το βρήκαμε! αν lst[mid] > key τότε ψάχνουμε στο 1ο μισό της λίστας αν lst[mid] < key τότε ψάχνουμε στο 2ο μισό της λίστας ψάχνουμε αναδρομικά.
10
Δυαδική αναζήτηση def binarysearchrec(lst, key, low, high):
if low>high: return -1 else: mid=(low+high)//2 if key==lst[mid]: return mid elif key<lst[mid]: return binarysearchrec(lst, key, low, mid-1) return binarysearchrec(lst, key, mid+1, high) [1,2,3,4,5,6,9,10,15,20] key = 4 «βασική» περίπτωση 1: δεν βρέθηκε low = 0, high = 9 mid = 4, lst[mid]=5 «βασική» περίπτωση 2: βρέθηκε! [1,2,3,4,5,6,9,10,15,20] low = 0, high = 3 mid = 1, lst[mid]=2 [1,2,3,4,5,6,9,10,15,20] low = 2, high = 3 mid = 2, lst[mid]=3 [1,2,3,4,5,6,9,10,15,20] low = 3, high = 3 mid = 3, lst[mid]=4 return 3
11
Δυαδική αναζήτηση def binarysearchrec(lst, key, low, high):
if low>high: return -1 else: mid=(low+high)//2 if key==lst[mid]: return mid elif key<lst[mid]: return binarysearchrec(lst, key, low, mid-1) return binarysearchrec(lst, key, mid+1, high) [1,2,3,4,5,6,9,10,15,20] key = 11 low = 0, high = 9 mid = 4, lst[mid]=5 [1,2,3,4,5,6,9,10,15,20] low = 5, high = 9 mid = 7, lst[mid]=10 [1,2,3,4,5,6,9,10,15,20] low = 8, high = 9 mid = 8, lst[mid]=15 [1,2,3,4,5,6,9,10,15,20] low = 8, high = 7 return -1
12
Δυαδική αναζήτηση Η δυαδική αναζήτηση είναι πολύ γρήγορη.
Σε κάθε αναδρομή, το εύρος της ακολουθίας που εξετάζουμε μειώνεται στο μισό. Άσκηση: πόσες φορές καλείται η συνάρτηση (αναδρομικά) αν η λίστα έχει 1000 στοιχεία; 10 γιατί κάθε φορά ψάχνουμε στο μισό της λίστας από την προηγούμενη φορά. Πόσες φορές καλείται για μια λίστα μήκους n; log2n στη χειρότερη περίπτωση.
13
Δυαδική αναζήτηση Επαναληπτική συνάρτηση
def binarysearch(lst, key, low, high): while low<=high: mid=(low+high)//2 if key==lst[mid]: return mid elif key<lst[mid]: high=mid-1 else: low=mid+1 return -1
14
Ταξινόμηση Στόχος της ταξινόμησης είναι να ανακατατάξει τα στοιχεία μιας ακολουθίας ώστε να εμφανίζονται με σειρά από το μικρότερο στο μεγαλύτερο (η αντίστροφα) Η μέθοδος sort ταξινομεί λίστες της Python Θυμηθείτε ότι τα αλφαριθμητικά και πλειάδες είναι μη μεταβαλλόμενα και στα λεξικά δεν έχει νόημα η ταξινόμηση Η συνάρτηση sorted() επιστρέφει μια ταξινομημένη λίστα απο μια ακολουθία (λίστα, πλειάδα, string) ή λεξικό. Θα δούμε κάποιους αλγορίθμους ταξινόμησης και πως αυτοί υλοποιούνται στην Python.
15
Ταξινόμηση με επιλογή: (selection sort)
Λογική: Βρες το μικρότερο στοιχείο και βάλτο πρώτο, μετά το 2ο μικρότερο και βάλτο 2ο, κ.ο.κ. 64, 25, 12, 22, 11 11, 25, 12, 22, 64 11, 12, 25, 22, 64 11, 12, 22, 25, 64 11, 12, 22, 25, 64
16
Ταξινόμηση με επιλογή: (selection sort)
def SelectionSort(lst): for pos in range(0, len(lst)): # find min starting from pos minpos=FindMin(lst, pos) # swap elements lst[pos],lst[minpos] = lst[minpos],lst[pos] def FindMin(lst, low): minpos=low for i in range(low, len(lst)): if lst[i]<lst[minpos]: minpos=i return minpos
17
Βubble sort Λογική: Συγκρίνουμε το κάθε στοιχείο με το επόμενό του και αλλάζουμε τις θέσεις τους αν δεν είναι στη σωστή σειρά. Μετά το πρώτο πέρασμα το μεγαλύτερο στοιχείο θα είναι τελευταίο στη λίστα. Μετά το 2ο πέρασμα το δεύτερο μεγαλύτερο στοιχείο θα είναι προ-τελευταίο στη λίστα, κ.ο.κ.
18
Βubble sort: [64, 25, 12, 22, 11] πρώτο πέρασμα δεύτερο πέρασμα τρίτο πέρασμα 64, 25, 12, 22, 11 25, 12, 22, 11, 64 12, 22, 11, 25, 64 25, 64, 12, 22, 11 12, 25, 22, 11, 64 12, 22, 11, 25, 64 25, 64, 12, 22, 11 12, 25, 22, 11, 64 το 3ο μέγιστο στοιχείο 12, 11, 22, 25, 64 25, 12, 64, 22, 11 12, 22, 25, 11, 64 25, 12, 64, 22, 11 12, 22, 25, 11, 64 25, 12, 22, 64, 11 12, 22, 11, 25, 64 το 2ο μέγιστο στοιχείο 25, 12, 22, 64, 11 25, 12, 22, 11, 64 το μέγιστο στοιχείο ...
19
Bubble sort def BubbleSort(lst): for i in range(len(lst)): # rounds
for j in range(0,len(lst)-i-1): # i-th round if lst[j]>lst[j+1]: lst[j],lst[j+1] = lst[j+1],lst[j]
20
Insertion sort Λογική: Αρχίζοντας από το 2ο στοιχείο, βάλε το κάθε στοιχείο στη σωστή σειρά σε σχέση με τα προηγούμενά του Τελειώνοντας το ν-στο στοιχείο τα πρώτα ν στοιχεία είναι ταξινομημένα. 2ο στοιχείο 4ο στοιχείο 5ο στοιχείο 64, 25, 12, 22, 11 12, 25, 64, 22, 11 12, 22, 25, 64, 11 25, 64, 12, 22, 11 12, 25, 22, 64, 11 12, 22, 25, 11, 64 12, 22, 25, 64, 11 12, 22, 11, 25, 64 3ο στοιχείο 25, 64, 12, 22, 11 12, 11, 22, 25, 64 25, 12, 64, 22, 11 11, 12, 22, 25, 64 12, 25, 64, 22, 11
21
Insertion sort def InsertionSort(lst):
for i in range(1,len(lst)): # 2nd, 3rd, etc. pos = i #swap with previous element while smaller while pos>0 and lst[pos]<lst[pos-1]: lst[pos],lst[pos-1] = lst[pos-1],lst[pos] pos = pos-1
22
Merge sort Λογική: Ταξινόμησε αναδρομικά το πρώτο μισό και το δεύτερο μισό της λίστας και μετά «συγχώνευσε» τα δύο μισά σε μια ταξινομημένη λίστα. MergeSort(64, 5, 25, 12, 22, 11) αναδρομικές κλήσεις MergeSort(64, 5, 25) MergeSort(12, 22, 11) 5, 25, 64 11, 12, 22 merge 5 11 12 22 25 64
23
Merge sort def MergeSort(lst):
if len(lst)<=1: # base case: already sorted return lst else: # recursive case mid = (len(lst))//2 lst1 = MergeSort(lst[:mid]) # sort first half lst2 = MergeSort(lst[mid:]) # sort second half outl = [] # merged list to be returned i = j = 0 # pointers to positions of sorted halves while i<len(lst1) and j<len(lst2): if lst1[i]<=lst2[j]: outl.append(lst1[i]) i += 1 else: outl.append(lst2[j]) j += 1 outl.extend(lst1[i:]) # add remainders outl.extend(lst2[j:]) return outl
24
Άλλοι αλγόριθμοι ταξινόμησης
Heap sort: βέλτιστος χρόνος στη χειρότερη περίπτωση (όπως και ο merge sort). Quick sort: βέλτιστος χρόνος στην πράξη. Counting/Bucket sort: βέλτιστος χρόνος σε ειδικές περιπτώσεις. Λεπτομέρειες και ανάλυση στο μάθημα: «Δομές Δεδομένων».
25
Τέλος Ενότητας
26
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Ιωαννίνων» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.
27
Σημειώματα
28
Σημείωμα Ιστορικού Εκδόσεων Έργου
Το παρόν έργο αποτελεί την έκδοση 1.0. Έχουν προηγηθεί οι κάτωθι εκδόσεις: Έκδοση 1.0 διαθέσιμη εδώ.
29
Σημείωμα Αναφοράς Copyright Πανεπιστήμιο Ιωαννίνων, Διδάσκων: Ν. Μαμουλής. «Εισαγωγή στον Προγραμματισμό. Αναζήτηση και Ταξινόμηση». Έκδοση: Ιωάννινα Διαθέσιμο από τη δικτυακή διεύθυνση:
30
Σημείωμα Αδειοδότησης
Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά Δημιουργού - Παρόμοια Διανομή, Διεθνής Έκδοση 4.0 [1] ή μεταγενέστερη. [1]
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.