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

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Lab 3: Sorted List ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι18/10/2010.
Advertisements

Διακριτά Μαθηματικά ΙI Δυαδικά Δέντρα Αναζήτησης
Εισαγωγή στον Προγραμματισμό, Αντώνιος Συμβώνης, ΣΕΜΦΕ, ΕΜΠ, Slide 1 Εβδομάδα 9: Διανύσματα και λίστες.
Δομές Δεδομένων - Δυαδικά Δένδρα (binary trees)
20 Αυγούστου 2014 ΔΙΑΦΑΝΕΙΑ 1 ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΤΑΞΗ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ (LAYOUT & STYLE)
Τεχνολογία ΛογισμικούSlide 1 Έλεγχος Καταψύκτη (Ada) Τεχνολογία ΛογισμικούSlide 39 with Pump, Temperature_dial, Sensor, Globals, Alarm; use Globals ; procedure.
ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης ΗΥ-150 Προγραμματισμός Ταξινόμηση και Αναζήτηση.
Οσμές στη Σχεδίαση του Λογισμικού (Code Smells) Πρόγραμμα Μεταπτυχιακών Σπουδών στην Εφαρμοσμένη Πληροφορική.
Ντίρλης Νίκος- ΕΤΥ 4ο ΦΡΟΝΤΙΣΤΗΡΙΟ Παρασκευή Β4 1.
Ταξινόμηση και Αναζήτηση
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
Lab 3: Sorted List ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι115/4/2015.
ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 1 Δείκτες σε συναρτήσεις Δείκτης σε συνάρτηση – Περιέχει τη διεύθυνση του κώδικα της συνάρτησης – Ό π ως ένας.
Translation Tips LG New Testament Greek Fall 2012.
HY150Ξενοφών Ζαμπούλης HY150 Ε π ι π λέον στοιχεία της C.
ΗΥ Παπαευσταθίου Γιάννης1 Clock generation.
Week 11 Quiz Sentence #2. The sentence. λαλο ῦ μεν ε ἰ δότες ὅ τι ὁ ἐ γείρας τ ὸ ν κύριον Ἰ ησο ῦ ν κα ὶ ἡ μ ᾶ ς σ ὺ ν Ἰ ησο ῦ ἐ γερε ῖ κα ὶ παραστήσει.
Προσομοίωση Δικτύων 3η Άσκηση Δημιουργία, διαμόρφωση μελέτη σύνθετων τοπολογιών.
Ψηφιακά Παιχνίδια και μάθηση Δρ. Νικολέτα Γιαννούτσου Εργαστήριο Εκπαιδευτικής Τεχνολογίας.
1 Προγραμματισμός Ι Ενότητα 7 : Πίνακες I Αλέξανδρος Τζάλλας Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου.
Μαθαίνω με “υπότιτλους”
Αντισταθμιστική ανάλυση
Εισαγωγή στον Προγ/μό Η/Υ
Ευρετήρια.
Διδάσκων: Δρ. Τσίντζα Παναγιώτα
Αντικειμενοστραφής Προγραμματισμός ΙΙ
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Εισαγωγή στον Προγ/μό Υπολογιστών
Πίνακες Προγραμματισμός Ι
Matrix Analytic Techniques
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C
9 Η Γλώσσα SQL Εισαγωγή – Βασικές Έννοιες Τύποι Δεδομένων
Ενότητα 1 : Εισαγωγικά Στοιχεία της Pascal Αλέξανδρος Τζάλλας
Class X: Athematic verbs II
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Ταξινόμηση Ορισμός: Δοθέντων των στοιχείων a1,a2,… ,an η ταξινόμηση συνίσταται στην αντιμετάθεση της θέσης των στοιχείων ώστε να τοποθετηθούν με μια νέα.
Εισαγωγή στον Προγ/μό Η/Υ
Keystroke-Level Model
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Ευρετήρια Βάσεις Δεδομένων Ευαγγελία Πιτουρά.
Πως μπορούν να μάθουν καλύτερα
Μουσενίκας Δημήτριος Βλάχος Χριστόδουλος
(ALPHA BANK – EUROBANK – PIRAEUS BANK)
Οσμές στη Σχεδίαση του Λογισμικού
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Ενότητα 8 : Πίνακες IΙ Αλέξανδρος Τζάλλας
Ουρά Προτεραιότητας (priority queue)
2 Θεςη και διαταξη 11/9/2018 6:52 πμ ΔΡ. ΧΡΥΣΟΥΛΑ ΠΑΠΑΪΩΑΝΝΟΥ
Πανεπιστήμιο Θεσσαλίας
Εκπαιδευτική ρομποτική
Find: φ σ3 = 400 [lb/ft2] CD test Δσ = 1,000 [lb/ft2] Sand 34˚ 36˚ 38˚
aka Mathematical Models and Applications
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Find: angle of failure, α
Sắp thứ tự.
Find: ρc [in] from load γT=110 [lb/ft3] γT=100 [lb/ft3]
Find: ρc [in] from load γT=106 [lb/ft3] γT=112 [lb/ft3]
Find: σ1 [kPa] for CD test at failure
Δομές Δεδομένων (Data Structures)
Βάλια Τόλιου, Registry Manager for Greece
3Ω 17 V A3 V3.
Variable-wise and Term-wise Recentering
SQL Βάσεις Δεδομένων Ευαγγελία Πιτουρά.
Find: ρc [in] from load (4 layers)
Προοπτικό σχέδιο με 3 σημεία φυγής
CPSC-608 Database Systems
Erasmus + An experience with and for refugees Fay Pliagou.
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C
Class X: Athematic verbs II © Dr. Esa Autero
Μεταγράφημα παρουσίασης:

Αλγόριθμοι Ταξινόμησης – Μέρος 3 Μανόλης Κουμπαράκης Data Structures and Programming Techniques

Ταξινόμηση με Ουρά Προτεραιότητας Θα παρουσιάσουμε τώρα δύο αλγόριθμους ταξινόμησης που χρησιμοποιούν μια ουρά προτεραιότητας για την υλοποίηση τους. Η δομή της ουράς προτεραιότητας και οι υλοποιήσεις της έχουν μελετηθεί διεξοδικά σε προηγούμενες διαλέξεις. Data Structures and Programming Techniques

Data Structures and Programming Techniques #define n 100 /* n gives the number of items */ /* in the array to be sorted */ typedef int KeyType; /* we assume that the type */ /* of keys is int */ typedef KeyType SortingArray[n]; SortingArray A; Data Structures and Programming Techniques

Ο Γενικός Αλγόριθμος Ταξινόμησης με Ουρά Προτεραιότητας void PriorityQueueSort(SortingArray A) { Έστω Q μία αρχικά κενή ουρά αναμονής. Keytype K; Οργάνωσε τα κλειδιά του A σε μια ουρά προτεραιότητας PQ. while (PQ δεν είναι κενή){ Βγάλε το μεγαλύτερο κλειδί K από την PQ. Βάλε το κλειδί K στο τέλος της ουράς Q. } Μετακίνησε τα κλειδιά της Q στον πίνακα A σε αύξουσα σειρά. Data Structures and Programming Techniques

Ταξινόμηση με Ουρά Προτεραιότητας Θα παρουσιάσουμε τώρα δύο συγκεκριμένες υλοποιήσεις του γενικού αλγόριθμου, χρησιμοποιώντας τις δύο αναπαραστάσεις μιας ουράς προτεραιότητας που έχουμε μελετήσει: Αναπαράσταση με αταξινόμητο πίνακα Αναπαράσταση με σωρό (heap) Και οι δύο αναπαραστάσεις θα υλοποιηθούν επιτόπου στον πίνακα A. Data Structures and Programming Techniques

Data Structures and Programming Techniques Η Γενική Μέθοδος Υποπίνακας του A με κλειδιά στην Q Υποπίνακας του A με κλειδιά της PQ A 𝐾 𝑗 𝐾 𝑖 j i Δείκτης στο μεγαλύτερο κλειδί της PQ Δείκτης στο τελευταίο κλειδι της PQ Όριο μεταξύ PQ και Q Data Structures and Programming Techniques

Αντιμετάθεση του A[i] και του A[j] με κλειδιά της PQ Υποπίνακας του A με κλειδιά της Q A 𝐾 𝑖 𝐾 𝑗 j i Δείκτης στο μεγαλύτερο κλειδί της PQ Δείκτης στο τελευταίο κλειδί της PQ Σύνορο μεταξύ PQ και Q Data Structures and Programming Techniques

Mετακίνηση του Συνόρου Μεταξύ PQ και Q Υποπίνακας του A με κλειδιά της PQ Υποπίνακας του A με κλειδιά της Q A 𝐾 𝑖 𝐾 𝑗 j Δείκτης στο κλειδί που ήταν τελευταίο στην PQ Νέο όριο μεταξύ PQ και Q Data Structures and Programming Techniques

Ο Αλγόριθμος SelectionSort (Ξανά!) Data Structures and Programming Techniques

SelectionSort (cont’d) void SelectionSort(SortingArray A) { int i,j,k; KeyType Temp; /* Initially, Q is empty and PQ contains all keys in A, so the index, i, */ /* of the last key in PQ is set to n-1, the index of the last key in A. */ i=n-1; /* While PQ contains more than one key, */ /* identify and move the largest key in PQ into Q */ while (i>0){ /* Let j initially point to the last key in PQ */ j=i; /* Scan remaining positions in 0:i-1 to find largest key, A[j] */ for (k=0; k<i; k++){ if (A[k]>A[j]) j=k; } /* Swap the largest key, A[j], and the last key, A[i] */ Temp=A[i]; A[i]=A[j]; A[j]=Temp; /* Move boundary between PQ and Q downward one position */ i--; Data Structures and Programming Techniques

Σχόλια στον SelectionSort Σε κάθε βήμα, για να βρούμε τη θέση του μεγαλύτερου κλειδιού j στον υποπίνακα PQ, διασχίζουμε τον PQ ενθυμούμενοι την θέση j του μεγαλύτερου κλειδιού μέχρι εκείνη τη στιγμή. Μετά, αντιμεταθέτουμε το το μεγαλύτερο κλειδί A[j]της PQ με το τελευταίο κλειδί A[i]της PQ και μειώνουμε το i κατά 1 ώστε να μετακινήσουμε το σύνορο μεταξύ PQ και Q. Δεν χρειάζεται να κάνουμε κάτι για να οργανώσουμε τα κλειδιά του αταξινόμητου πίνακα A σε μια ουρά προτεραιότητας PQ, επειδή ο A χρησιμοποιείται κατευθείαν ως αναπαράσταση της PQ. Δεν χρειάζεται να κάνουμε κάτι για να μετακινήσουμε τα κλειδιά από την ουρά Q στον πίνακα A σε αύξουσα σειρά, επειδή η Q μεταβάλλεται από ένα άδειο υποπίνακα του A που είναι αρχικά, σε ολόκληρο τον A όταν ο αλγόριθμος τερματίζει. Data Structures and Programming Techniques

Ιδιότητες του SelectionSort Επειδή ο αλγόριθμος SelectionSort αντιμεταθέτει το A[i] με το A[j] για κάθε i από το n-1 μέχρι το 1, εκτελεί 𝑛−1 αντιμεταθέσεις. Ο αριθμός των συγκρίσεων που κάνει ο αλγόριθμος SelectionSort δίνεται από το άθροισμα 𝑛−1 + 𝑛−2 +⋯+2+1= 𝑛 𝑛−1 2 . Άρα η χρονική πολυπλοκότητα του SelectionSort είναι 𝑂 𝑛 2 . Data Structures and Programming Techniques

Data Structures and Programming Techniques HeapSort Θα παρουσιάσουμε τώρα μια δεύτερη εξειδίκευση του γενικού αλγόριθμου ταξινόμησης με ουρά προτεραιότητας. Θα παραστήσουμε την ουρά με ένα σωρό (heap). Θα χρησιμοποιήσουμε την ακολουθιακή αναπαράσταση ενός σωρού ως υποπίνακα A[1:n] ενός πίνακα A[0:n] που ορίζεται στη C με την παρακάτω δήλωση: KeyType A[n+1]; Data Structures and Programming Techniques

Data Structures and Programming Techniques HeapSort Όταν ξεκινάει ο αλγόριθμος, η ουρά προτεραιότητας PQ καταλαμβάνει τον πίνακα A[1:n]. Οργανώνουμε τα στοιχεία της PQ σε σωρό χρησιμοποιώντας τον αλγόριθμο που έχουμε παρουσιάσει σε προηγούμενες διαλέξεις. Στο τέλος της διαδικασίας μετατροπής του πίνακα A[1:n]σε σωρό, το μεγαλύτερο στοιχείο του σωρού βρίσκεται στη θέση A[1]. Τώρα αντιμεταθέτουμε το πρώτο και το τελευταίο κλειδί της PQ δηλαδή το A[1] και το A[n]. Μετά, μετακινούμε προς τα αριστερά κατά μία θέση το σύνορο της PQ με την Q, ώστε η Q τώρα να περιέχει στη τελευταία της θέση το κλειδί που ήταν το μεγαλύτερο κλειδί της PQ νωρίτερα, και η PQ να περιέχει ένα κλειδί λιγότερο. Data Structures and Programming Techniques

Data Structures and Programming Techniques HeapSort Αναδιοργανώνουμε τα στοιχεία της PQ σε σωρό γιατί η εισαγωγή του νέου κλειδιού στη ρίζα μπορεί να έκανε την PQ να μην είναι πλέον σωρός. Όταν τελειώσει η αναδιοργάνωση, το μεγαλύτερο από τα εναπομείναντα κλειδιά της PQ θα έχει μετακινηθεί στη θέση A[1]. Μετά, επανειλημμένα αντιμεταθέτουμε το πρώτο και το τελευταίο κλειδί της PQ, μετακινούμε το σύνορο μεταξύ PQ και Q, και αναδιοργανώνουμε την PQ σε σωρό μέχρι η PQ να περιέχει ένα μόνο στοιχείο. Σ’ αυτό το σημείο, ο πίνακας A είναι ταξινομημένος. Data Structures and Programming Techniques

Data Structures and Programming Techniques HeapSort void HeapSort(SortingArray A) { int i; KeyType Temp; /* Heapify in reverse level order all subtrees except the */ /* subtree containing the root */ for (i=(n/2); i>1; --i) SiftUp(A,i,n); /* Reheapify starting at the root, remove root, put it on */ /* output queue, and replace root with the last leaf in level */ /* order, until heap contains one key */ for (i=n; i>1; --i){ SiftUp(A,1,i); Temp=A[1]; A[1]=A[i]; A[i]=Temp; } Data Structures and Programming Techniques

Data Structures and Programming Techniques HeapSort void SiftUp(SortingArray A, int i, int n) { /* Let i point to the root and let n point to the last leaf in level order */ int j; KeyType RootKey; Boolean NotFinished; /* Let RootKey be the key at the root */ RootKey=A[i]; /* Let j point to the left child of i */ j=2*i; NotFinished=(j<=n); /* SiftUp is not finished if j exists in the tree */ /* Move any larger child that is bigger than the root key upward one */ /* level in the tree */ while (NotFinished){ if (j<n) /* if a right child of i also exists in the tree */ if (A[j+1]>A[j]) j++; /* set j to point to the larger child */ if (A[j]<=RootKey) /* if the larger child is not bigger than the root key, */ NotFinished=false; /* no more keys sift up */ else { A[i]=A[j]; /* move larger child up one level in the tree */ i=j; /* let i point to the larger child j */ j=2*i; /* and let j point to the new left child of i */ NotFinished=(j<=n); /* SiftUp is not finished iff j exists in the tree */ } /* Final placement of the root key */ A[i]=RootKey; Data Structures and Programming Techniques

Data Structures and Programming Techniques Σχόλια Όταν ξεκινάει ο αλγόριθμος HeapSort, όλα τα κλειδιά στον υποπίνακα A[1:n] οργανώνονται σε σωρό. Κατά την αρχική οργάνωση αυτών των κλειδιών σε σωρό στον πρώτο βρόχο for του αλγόριθμου, τα υποδέντρα της PQ επισκέπτονται κατά την αντίστροφη σειρά επιπέδου (reverse level order). Για την ακρίβεια, οργανώνονται σε σωρό μόνο τα μη τετριμμένα υποδέντρα της PQ (δηλαδή αυτά που δεν είναι φύλλα). Το υποδέντρο που αποτελείται από ολόκληρο το δέντρο δεν οργανώνεται σε σωρό στον πρώτο βρόχο for αλλά στο δεύτερο. Ο δεύτερος βρόχος for επίσης αντιμεταθέτει το πρώτο και το τελευταίο κλειδί της PQ, και μετακινεί το σύνορο μεταξύ PQ και Q. Data Structures and Programming Techniques

Data Structures and Programming Techniques Σχόλια Η συνάρτηση SiftUp(A,i,n) είναι μια βοηθητική ρουτίνα η οποία μετατρέπει ένα δέντρο που είναι σχεδόν σωρός σε σωρό, χρησιμοποιώντας μια κυκλική μετάθεση (cyclic shift) κλειδιών ως εξής. Ξεκινάμε από τη ρίζα και μετακινούμαστε προς τα κάτω ακολουθώντας ένα μονοπάτι κατά μήκος του οποίου τα κλειδιά μεγαλύτερα από την ρίζα μετακινούνται προς τα πάνω, ώστε να δημιουργηθεί μια άδεια θέση για την τελική μετακίνηση του κλειδιού της ρίζας. Τα δέντρα στα οποία εφαρμόζεται η SiftUp δεν έχουν την ιδιότητα του σωρού μόνο στη ρίζα τους (ή είναι ήδη σωροί). Data Structures and Programming Techniques

Data Structures and Programming Techniques Σχόλια 3 9 8 5 7 6 2 1 4 Το παραπάνω δυαδικό δέντρο δεν είναι σωρός. Η ιδιότητα του σωρού δεν ισχύει για το κλειδί της ρίζας 3. Data Structures and Programming Techniques

Data Structures and Programming Techniques Σχόλια 9 7 8 5 4 6 2 1 3 Η συνάρτηση SiftUp μετακινεί τα κλειδιά 9, 7 και 4 προς τα πάνω ώστε να δημιουργηθεί μια άδεια θέση για το κλειδί της ρίζας 3. Data Structures and Programming Techniques

Ιδιότητες του HeapSort Έχουμε επίσης αποδείξει ότι η διαδικασία διαγραφής της ρίζας ενός σωρού, η αντικατάσταση της με το τελευταίο κλειδί κατά σειρά επιπέδου, και η αναδιοργάνωση του δέντρου που προκύπτει σε σωρό με 𝑖 κλειδιά χρειάζεται το πολύ log 2 𝑖 αντιμεταθέσεις κλειδιών. Ομοίως, η συνάρτηση SiftUp χρειάζεται log 2 𝑖 +2 μεταθέσεις κλειδιών από ένα κόμβο ή μια προσωρινή μεταβλητή σε ένα άλλο κόμβο ή μεταβλητή. Άρα για να αφαιρέσουμε όλα τα κλειδιά εκτός το τελευταίο από την PQ και να τα μετακινήσουμε στο τέλος της Q, χρειάζεται τουλάχιστον 𝑖=2 𝑛 ( log 2 𝑖 +2) χρόνο. Data Structures and Programming Techniques

Ιδιότητες του HeapSort Ο συνολικός αριθμός συγκρίσεων κλειδιών είναι ένα παρόμοιο άθροισμα φραγμένο από πάνω από την παράσταση 𝑖=2 𝑛 (2 log 2 𝑖 +1) . Γνωρίζουμε ότι 𝑖=1 𝑛 log 2 𝑖 = 𝑛+1 𝑞− 2 (𝑞+1) +2 όπου 𝑞= log 2 (𝑛+1) . Με λίγες πράξεις ανισοτήτων μπορεί να δειχτεί ότι το παραπάνω άθροισμα είναι 𝑂(𝑛 log 𝑛 ). Μια και αυτός είναι ο υπερισχύων χρόνος, ο αλγόριθμος HeapSort τρέχει σε χρόνο 𝑂(𝑛 log 𝑛 ). Data Structures and Programming Techniques

Data Structures and Programming Techniques Μελέτη Thomas A. Standish. Data Structures, Algorithms and Software Principles in C. Addison-Wesley. Section 13.3 R. Sedgewick. Αλγόριθμοι σε C. 3η Αμερικανική Έκδοση. Εκδόσεις Κλειδάριθμος. Κεφ. 9 Data Structures and Programming Techniques