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

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Εισαγωγή στους Αλγόριθμους Ταξινόμησης
Advertisements

Lab 3: Sorted List ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι18/10/2010.
Δομές Δεδομένων - Δυαδικά Δένδρα (binary trees)
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 1 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ (LAYOUT & STYLE)
Αλγόριθμοι Ταξινόμησης
Φροντηστήριο Διαχείριση Περιεχομένου Παγκόσμιου Ιστού και Γλωσσικά Eργαλεία.
Εισαγωγικό Φροντηστήριο Διαχείριση Περιεχομένου Παγκόσμιου Ιστού και Γλωσσικά Eργαλεία.
ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης ΗΥ-150 Προγραμματισμός Ταξινόμηση και Αναζήτηση.
Διαίρει-και-Βασίλευε
Δυναμικη Δεσμευση Μνημης Συνδεδεμενες Λιστες (dynamic memory allocation, linked lists) Πως υλοποιουμαι προγραμματα που δεν γνωριζουμε πριν την εκτελεση.
Γλωσσική Τεχνολογία Εισαγωγικό Φροντιστήριο. Project του μαθήματος  Εργασία 2 ατόμων  Προφορική εξέταση για :  Project (80%)  Θεωρία (20%)  Στο φροντιστήριο.
Ταξινόμηση και Αναζήτηση
Αλγόριθμοι Ταξινόμησης
Διαφάνειες παρουσίασης Πίνακες (συνέχεια) Αριθμητικοί υπολογισμοί Αναδρομή.
Lab 3: Sorted List ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι115/4/2015.
ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 1 Δείκτες σε συναρτήσεις Δείκτης σε συνάρτηση – Περιέχει τη διεύθυνση του κώδικα της συνάρτησης – Ό π ως ένας.
Ταξινόμηση - Sorting.
ΕΙΣΑΓΩΓΙΚΟ ΦΡΟΝΤΙΣΤΗΡΙΟ Διαχείριση Περιεχομένου Παγκόσμιου Ιστού και Γλωσσικά Εργαλεία.
ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Διδάσκοντες:Γιάννης Μαΐστρος Στάθης Ζάχος Νίκος Παπασπύρου
8-1 ΜΑΘΗΜΑ 8 ο Εισαγωγή στους Αλγόριθμους Ταξινόμησης.
Αναζήτηση σε πίνακα Αναζήτηση σε πίνακα που περιέχει ακέραιους αριθμούς.
Α.Ε.Π.Π. ΟΠΤΙΚΟΠΟΙΗΜΕΝΗ ΠΑΡΟΥΣΙΑΣΗ ΤΗΣ ΤΑΞΙΝΟΜΗΣΗΣ ΠΙΝΑΚΑ ΜΕ ΤΗ ΜΕΘΟΔΟ ΤΗΣ ΦΥΣΣΑΛΙΔΑΣ (Bubble Sort) ΙΟΡΔΑΝΗΣ ΣΑΒΒΟΥΛΙΔΗΣ
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
10η Διάλεξη Ταξινόμηση E. Μαρκάκης
Διδάσκων: Δρ. Τσίντζα Παναγιώτα
Αντικειμενοστραφής Προγραμματισμός ΙΙ
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Διδάσκων: Δρ. Τσίντζα Παναγιώτα
Αντικειμενοστραφής Προγραμματισμός ΙΙ
Π Ι Ν Α Κ Ε Σ (arrays) ΤΑΞΙΝΟΜΗΣΗ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Εφαρμογές Υπολογιστών
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Ενότητα Εισαγωγή Είναι εύκολη στη χρήση και στην εκμάθηση.
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Αλγόριθμοι Ταξινόμησης – Μέρος 3
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ & ΑΡΧΕΙΩΝ
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Εισαγωγή στον Προγ/μό Υπολογιστών
Εισαγωγή στον Προγ/μό Η/Υ
ΔΟΜΕΣ ΕΛΕΓΧΟΥ(if-else, switch) και Λογικοί τελεστές / παραστάσεις
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Αρχεσ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ ΤΑξη Β΄
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
«Από τη MicroWorlds Pro στην Python»
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
«Ανάπτυξη εφαρμογής για τη διαχείριση μεθόδων αναζήτησης σε οπτικοποιημένο περιβάλλον»  Μπλάγας Χρήστος.
11η Διάλεξη Ταξινόμηση Quicksort και Ιδιότητες Δέντρων Ε. Μαρκάκης
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Ενότητα 8 : Πίνακες IΙ Αλέξανδρος Τζάλλας
Βελτιστοποίηση και Επεξεργασία Ερωτημάτων
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Πτυχιακή εργασία του Παύλου Παντικάκη (2468)
Αναδρομικές Εξισώσεις και Αφηρημένοι Τύποι Δεδομένων
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Sắp thứ tự.
xBSM meeting, problems with C-line CA
Δομές ροής προγράμματος
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Δομές Δεδομένων (Data Structures)
Ομαδοποίηση αντικειμένων
Αναζήτηση (Εξερεύνηση) Πρώτα σε Πλάτος
Μεταγράφημα παρουσίασης:

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

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

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

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

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

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

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

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

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

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

Δυαδική αναζήτηση Επαναληπτική συνάρτηση 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

Δυαδική αναζήτηση Μια αναδρομική συνάρτηση που επιστρέφει 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)

Δυαδική αναζήτηση Μια αναδρομική συνάρτηση που επιστρέφει 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)

Ταξινόμηση Στόχος της ταξινόμησης είναι να ανακατατάξει τα στοιχεία μιας ακολουθίας ώστε να εμφανίζονται με σειρά από το μικρότερο στο μεγαλύτερο (η αντίστροφα) Η μέθοδος sort ταξινομεί λίστες της Python Θυμηθείτε ότι τα αλφαριθμητικά και πλειάδες είναι μη μεταβαλλόμενα και στα λεξικά δεν έχει νόημα η ταξινόμηση Η συνάρτηση sorted() επιστρέφει μια ταξινομημένη λίστα απο μια ακολουθία (λίστα, πλειάδα, string) ή λεξικό Θα δούμε κάποιους αλγορίθμους ταξινόμησης και πως αυτοί υλοποιούνται στην Python

Ταξινόμηση με επιλογή: (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

Ταξινόμηση με επιλογή: (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

Ταξινόμηση με επιλογή: (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]

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

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

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]

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

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

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

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

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