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

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

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Επαναληπτικές Ασκήσεις Χειµερινό Εξάµηνο 2014

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

Διάλεξη 17η: Ταξινόμηση και Αναζήτηση

Διαδικασιακός Προγραμματισμός

Προγραµµατιστικές Τεχνικές

ΗΥ-150. Ταξινόµηση και Αναζήτηση

Ταξινόμηση με συγχώνευση Merge Sort

Δομές Δεδομένων & Αλγόριθμοι

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Λεξικά Χειµερινό Εξάµηνο 2014

Δομές Δεδομένων & Αλγόριθμοι

Προγραµµατισµός 1 Ταξινόµηση - Αναζήτηση

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων

Προγραμματιστικές Τεχνικές

Εργαστηριακή Άσκηση 1

Merge Sort (Ταξινόμηση με συγχώνευση) 6/14/2007 3:04 AM Merge Sort 1

Ταξινόμηση κάδου και ταξινόμηση Ρίζας Bucket-Sort και Radix-Sort

Αναζήτηση και ταξινόμηση

Διάλεξη 09: Αλγόριθμοι Ταξινόμησης I

Γ7.5 Αλγόριθμοι Αναζήτησης. Γ Λυκείου Κατεύθυνσης

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

ΠΛΗ111. Ανοιξη Μάθηµα 9 ο. Ταξινόµηση. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Λίστες και Πλειάδες Χειµερινό Εξάµηνο 2014

p

ΜΥΥ105: Εισαγωγή στον Προγραμματισμό. Επαναληπτικές Ασκήσεις Χειμερινό Εξάμηνο 2016

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

Δομές Δεδομένων και Αλγόριθμοι

Προγραμματιστικές Τεχνικές

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

ΔΥΑΔΙΚΗ ΑΝΑΖΗΤΗΣΗ & ΤΑΞΙΝΟΜΗΣΗ ΜΕ ΣΥΓΧΩΝΕΥΣΗ

17. Εισαγωγή σε αριθμητικές μεθόδους για μηχανικούς και αλγορίθμους

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 4. Παραδείγματα Ανάλυσης Πολυπλοκότητας Ανάλυση Αναδρομικών Αλγόριθμων

Βασικά Στοιχεία Python 3

1o Φροντιστήριο ΗΥ240

Αλγόριθμοι Ταξινόμησης Μέρος 1

ΠΛΗΡΟΦΟΡΙΚΗ Ι Ενότητα 8: Αναζήτηση και ταξινόμηση

ΠΛΗΡΟΦΟΡΙΚΗ Ι (Python) Ενότητα 4

5. Απλή Ταξινόμηση. ομές εδομένων. Χρήστος ουλκερίδης. Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων

Εργαστήριο 2: Πίνακες

Εισ. Στην ΠΛΗΡΟΦΟΡΙΚΗ. Διάλεξη 7 η. Βασίλης Στεφανής

Δομές δεδομένων (2) Αλγόριθμοι

Ενότητα: Δυαδική Αναζήτηση Σχέδιο Δραστηριότητας: Παιχνίδι: Βρες τον αριθμό

Σημειωματάριο Δευτέρας 13 Νοε. 2017

ΜΥΥ105: Εισαγωγή στον Προγραμματισμό. Ακολουθίες: Λίστες και Πλειάδες Χειμερινό Εξάμηνο 2016

Quicksort. Πρόβλημα Ταξινόμησης. Μέθοδοι Ταξινόμησης. Συγκριτικοί Αλγόριθμοι

Διορθώσεις σελ

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ.

Προχωρημένες έννοιες προγραμματισμού σε C

Δοµές Δεδοµένων. 9η Διάλεξη Ταξινόµηση - Στοιχειώδεις µέθοδοι. Ε. Μαρκάκης

ιαφάνειες παρουσίασης #4

Αλγόριθμοι Ταξινόμησης Bubble Sort Quick Sort. Αντρέας Δημοσθένους Καθηγητής Πληροφορικής Ολυμπιάδα 2012

242 -ΕισαγωγήστουςΗ/Υ

Διάλεξη 04: Παραδείγματα Ανάλυσης

Διαίρει-και-Βασίλευε. Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Διαίρει-και-Βασίλευε 2

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Αναδροµικές Συναρτήσεις Χειµερινό Εξάµηνο 2014

Σχεδίαση Αλγορίθμων -Τμήμα Πληροφορικής ΑΠΘ - Εξάμηνο 4ο

Σχεδίαση και Ανάλυση Αλγορίθμων

Προγραµµατισµός. Αναδροµή (1/2)

Διάλεξη 04: Παραδείγματα Ανάλυσης Πολυπλοκότητας/Ανάλυση Αναδρομικών Αλγόριθμων

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Φ Ρ Ο Ν Τ Ι Σ Τ Η Ρ Ι Ο 1 : ΤΑΞΙΝΟΜΗΣΗ Δ Ρ Ι Τ Σ Α Σ Η Λ Ι Α Σ Υ Π Ο Ψ Η Φ Ι Ο Σ Δ Ι Δ Α Κ Τ Ο Ρ Α Σ

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ταξινόμηση. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Ι (ΗΥ120)

Αξιοποίηση Η/Υ και Πληροφορικής στην Μηχανική

Διδάσκων: Παναγιώτης Ανδρέου

Το εσωτερικό ενός Σ Β

Αλγόριθμοι ταξινόμησης

ιαίρει-και-βασίλευε ημήτρης Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο

Επεξεργασία Ερωτήσεων

3 ΑΝΑ ΡΟΜΗ ΑΝΑΖΗΤΗΣΗ - ΤΑΞΙΝΟΜΗΣΗ. n! = 1*2*3*..(n-1)*n. n! = 1 αν n = 0, = n*(n-1)! αν n > ΑΝΑ ΡΟΜΗ Εισαγωγή

ΠΛΗ111. Ανοιξη Μάθηµα 8 ο. Αναζήτηση. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

ΚΕΦΑΛΑΙΟ 5: Αλγόριθµοι

Επεξεργασία Ερωτήσεων

Ενότητα 1: Εισαγωγή Ασκήσεις και Λύσεις

Εισαγωγή. Γενική Εικόνα του Μαθήµατος. Το εσωτερικό ενός Σ Β. Εισαγωγή. Εισαγωγή Σ Β Σ Β. Αρχεία ευρετηρίου Κατάλογος συστήµατος Αρχεία δεδοµένων

Αλγόριθμοι και Δομές Δεδομένων (Ι) (εισαγωγικές έννοιες)

Πληροφορική 2. Αλγόριθμοι

Σχεδίαση και Ανάλυση Αλγορίθμων

ΕΝΟΤΗΤΑ 6 ΛΙΣΤΕΣ ΠΑΡΑΛΕΙΨΗΣ (SKIP LISTS)

Σημειωματάριο Τετάρτης 18 Οκτ. 2017

Διδάσκων: Παναγιώτης Ανδρέου

11/23/2014. Στόχοι. Λογισμικό Υπολογιστή

Τι είναι αλγόριθμος; Υποπρογράμματα (υποαλγόριθμοι) Βασικές αλγοριθμικές δομές

i : 0<=i<N-1 => data[i] <= data[i+1] 25/10/2009

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ταξινόµηση Mergesort Κεφάλαιο 8. Ε. Μαρκάκης Επίκουρος Καθηγητής

Εργαστήριο 7: Ο αλγόριθμος ταξινόμησης Radix Sort

Ταξινόμηση. Σαλτογιάννη Αθανασία

Αλγόριθμοι Ταξινόμησης Μέρος 2

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Διδάσκων: Παναγιώτης Ανδρέου

Ταξινόμηση. Παύλος Εφραιμίδης. Δομές Δεδομένων Ταξινόμηση 1

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ Η/Υ (ΟΜΑΔΑ ΘΕΜΑΤΩΝ A)

Δομές Δεδομένων & Αλγόριθμοι

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

Εισαγωγή στον δομημένο προγραμματισμό

Εισαγωγή στον Προγ/μό Υπολογιστών

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Εισαγωγή στους Αλγόριθμους

Δοµές Δεδοµένων. 11η Διάλεξη Ταξινόµηση Quicksort και Ιδιότητες Δέντρων. Ε. Μαρκάκης

Transcript:

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

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

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

Συνάρτηση αναζήτησης Άσκηση: γράψτε µια συνάρτηση search_list, η οποία παίρνει σαν όρισµα µια λίστα και ένα στοιχείο και επιστρέφει την πρώτη θέση του στοιχείου στη λίστα αν το στοιχείο υπάρχει -1 αλλιώς def search_list(l, x): for i in range(len(l)): if x == l[i]: return I return -1 >>> l = [1,2,3,4,5,6,1,2,3,4,5] >>> search_list(l, 4) 3 >>> search_list(l, 99) -1 if x in l: return l.index(x) 4

Συνάρτηση αναζήτησης Άσκηση: γράψτε µια συνάρτηση search_list2, η οποία παίρνει σαν όρισµα µια λίστα και ένα στοιχείο και επιστρέφει όλες τις θέσεις του στοιχείου στη λίστα >>> l = [1,2,3,4,5,6,1,2,3,4,5] >>> search_list2(l, 4) [3, 9] >>> search_list2(l,99) [] def search_list2(l, x): pos = [] for i in range(len(l)): if x == l[i]: pos.append(i) return pos 5

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

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

Δυαδική αναζήτηση 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]: «βασική» περίπτωση 1: δεν βρέθηκε «βασική» περίπτωση 2: βρέθηκε! return binarysearchrec(lst, key, low, mid-1) else: return binarysearchrec(lst, key, mid+1, high) [1,2,3,4,5,6,9,10,15,20] key = 4 low = 0, high = 9 mid = 4, lst[mid]=5 [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 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) else: 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 9

Δυαδική αναζήτηση Η δυαδική αναζήτηση είναι πολύ γρήγορη Σε κάθε αναδροµή, το εύρος της ακολουθίας που εξετάζουµε µειώνεται στο µισό Άσκηση: πόσες φορές καλείται η συνάρτηση (αναδροµικά) αν η λίστα έχει 1000 στοιχεία; 10 γιατί κάθε φορά ψάχνουµε στο µισό της λίστας από την προηγούµενη φορά Πόσες φορές καλείται για µια λίστα µήκους n; log 2 n στη χειρότερη περίπτωση 10

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

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

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

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

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

Βubble sort: [64, 25, 12, 22, 11] πρώτο πέρασµα 64, 25, 12, 22, 11 25, 64, 12, 22, 11 25, 64, 12, 22, 11 25, 12, 64, 22, 11 25, 12, 64, 22, 11 25, 12, 22, 64, 11 25, 12, 22, 64, 11 25, 12, 22, 11, 64 το µέγιστο στοιχείο δεύτερο πέρασµα 25, 12, 22, 11, 64 12, 25, 22, 11, 64 12, 25, 22, 11, 64 12, 22, 25, 11, 64 12, 22, 25, 11, 64 12, 22, 11, 25, 64 το 2ο µέγιστο στοιχείο τρίτο πέρασµα 12, 22, 11, 25, 64 12, 22, 11, 25, 64 12, 11, 22, 25, 64 το 3ο µέγιστο στοιχείο... 16

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

Insertion sort Λογική: Αρχίζοντας από το 2ο στοιχείο, βάλε το κάθε στοιχείο στη σωστή σειρά σε σχέση µε τα προηγούµενά του Τελειώνοντας το ν-στο στοιχείο τα πρώτα ν στοιχεία είναι ταξινοµηµένα 2ο στοιχείο 64, 25, 12, 22, 11 25, 64, 12, 22, 11 3ο στοιχείο 25, 64, 12, 22, 11 25, 12, 64, 22, 11 12, 25, 64, 22, 11 4ο στοιχείο 12, 25, 64, 22, 11 12, 25, 22, 64, 11 12, 22, 25, 64, 11 5ο στοιχείο 12, 22, 25, 64, 11 12, 22, 25, 11, 64 12, 22, 11, 25, 64 12, 11, 22, 25, 64 11, 12, 22, 25, 64 18

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 19

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 20

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 21

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