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

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

ΜΥΥ105: Εισαγωγή στον Προγραμματισμό

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


Παρουσίαση με θέμα: "ΜΥΥ105: Εισαγωγή στον Προγραμματισμό"— Μεταγράφημα παρουσίασης:

1 ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Αναζήτηση και Ταξινόμηση Χειμερινό Εξάμηνο 2016

2 Αναζήτηση και Ταξινόμηση
Βασικές λειτουργίες σε προγράμματα Αναζήτηση (searching): Βρες ένα ζητούμενο στοιχείο σε μια δοθείσα ακολουθία στοιχείων Ταξινόμηση (sorting): Ταξινόμησε μια δοθείσα ακολουθία στοιχείων Οι περισσότερες μοντέρνες γλώσσες προγραμματισμού έχουν υλοποιημένες αυτές τις λειτουργίες σαν συναρτήσεις (ή μεθόδους) Εμείς θα μάθουμε κάποιους αλγορίθμους και πως υλοποιούνται στην Python

3 Έτοιμες συναρτήσεις αναζήτησης στην 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() «ψάχνει» σε λεξικά.

4 Συνάρτηση αναζήτησης Άσκηση: γράψτε μια συνάρτηση 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

5 Συνάρτηση αναζήτησης Άσκηση: γράψτε μια συνάρτηση 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) []

6 Γραμμική αναζήτηση Οι search_list, search_list2 υλοποιούν τη γραμμική αναζήτηση (linear search), όπου κοιτάμε ένα-ένα τα στοιχεία της ακολουθίας μέχρι να βρούμε το στοιχείο (ή τα στοιχεία) που ψάχνουμε Η γραμμική αναζήτηση δεν προϋποθέτει τίποτα σχετικά με την οργάνωση των στοιχείων στην ακολουθία ο απλούστερος δυνατός τρόπος αναζήτησης συγκρίνει όλα τα στοιχεία της ακολουθίας με το στοιχείο προς εύρεση χρήσιμος για μικρές, μη ταξινομημένες ακολουθίες Μπορούμε να κάνουμε κάτι καλύτερο αν η λίστα μας είναι ταξινομημένη?

7 Δυαδική αναζήτηση Μπορούμε να εφαρμόσουμε δυαδική αναζήτηση (binary search), αν η ακολουθία μας είναι ταξινομημένη. Π.χ. ψάχνουμε το στοιχείο key στη λίστα lst Βασική ιδέα: mid = len(lst)/2 (η μεσαία θέση στη λίστα) αν lst[mid] == key τότε το βρήκαμε! αν lst[mid] > key τότε ψάχνουμε στο 1ο μισό της λίστας αν lst[mid] < key τότε ψάχνουμε στο 2ο μισό της λίστας ψάχνουμε αναδρομικά

8 Δυαδική αναζήτηση 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

9 Δυαδική αναζήτηση 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

10 Δυαδική αναζήτηση Η δυαδική αναζήτηση είναι πολύ γρήγορη
Σε κάθε αναδρομή, το εύρος της ακολουθίας που εξετάζουμε μειώνεται στο μισό Ερώτηση: Μπορώ να βρω ένα τυχαίο αριθμό με 10 ερωτήσεις? Πόσες φορές καλείται για μια λίστα μήκους n; log2n στη χειρότερη περίπτωση Aν έχουμε μια λίστα με 1000 στοιχεία θα κληθεί το πολύ 10 φορές.

11 Δυαδική αναζήτηση Επαναληπτική συνάρτηση def binarysearch(lst, key):
low = 0; high = len(lst) 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

12 Δυαδική αναζήτηση Μια αναδρομική συνάρτηση που επιστρέφει Boolean τιμή. Πως μπορώ να την κάνω να επιστρέφει την θέση? def binarysearchrec2(lst, key): if len(lst) == 0: return False else: mid= len(lst)//2 if key==lst[mid]: return True elif key<lst[mid]: return binarysearchrec2(lst[:mid], key) return binarysearchrec2(lst[mid+1:],key)

13 Δυαδική αναζήτηση Μια αναδρομική συνάρτηση που επιστρέφει Boolean τιμή. Πως μπορώ να την κάνω να επιστρέφει την θέση? def binarysearchrec2(lst, key): if len(lst) == 0: return -1 else: mid= len(lst)//2 if key==lst[mid]: return mid elif key<lst[mid]: return binarysearchrec2(lst[:mid], key) return (mid+1) + binarysearchrec2(lst[mid+1:],key)

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 Ταξινόμηση με επιλογή: (selection sort)
def SelectionSort(lst): for pos in range(0, len(lst)): # find min starting from pos minpos= lst.index(min(lst[pos:])) # swap elements lst[pos],lst[minpos] = lst[minpos],lst[pos]

18 Βubble sort Λογική: Συγκρίνουμε το κάθε στοιχείο με το επόμενό του και αλλάζουμε τις θέσεις τους αν δεν είναι στη σωστή σειρά. Μετά το πρώτο πέρασμα το μεγαλύτερο στοιχείο θα είναι τελευταίο στη λίστα. Μετά το 2ο πέρασμα το δεύτερο μεγαλύτερο στοιχείο θα είναι προ-τελευταίο στη λίστα, κ.ο.κ.

19 Β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 το μέγιστο στοιχείο ...

20 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]

21 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

22 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

23 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 Ποια είναι η βάση της αναδρομής?

24 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 return Merge(lst1,lst2) # merge lists and return def Merge(lst1,lst2): outl = [] # merged list to be returned i = j = 0 # pointers to positions of sorted lists 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

25 Άλλοι αλγόριθμοι ταξινόμησης
Heap sort: βέλτιστος χρόνος στη χειρότερη περίπτωση (όπως και ο merge sort) Quick sort: βέλτιστος χρόνος στην πράξη Counting/Bucket sort: βέλτιστος χρόνος σε ειδικές περιπτώσεις Λεπτομέρειες και ανάλυση στο μάθημα: «Δομές Δεδομένων»


Κατέβασμα ppt "ΜΥΥ105: Εισαγωγή στον Προγραμματισμό"

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


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