ΗΥ-150 Πξνγξακκατησκόο Ταμηλόκεσε θαη Αλαδήτεσε
To πξόβιεκα ηεο Αλαδήηεζεο Γνζέληνο δεδνκέλσλ, ι.ρ. ζε Πίλαθα (P) Χάρλσ λα βξσ θάπνην ζπγθεθξηκέλν ζηνηρείν (key) Αλ ν πίλαθαο δελ είλαη ηαμηλνκεκέλνο Γξακκηθή Αλαδήηεζε (Linear search) Απινύζηεξε δπλαηή Σύγθξηλε ζεηξηαθά θάζε ζηνηρείν ηνπ πίλαθα κε ηελ ηηκή-θιεηδί Φξήζηκν γηα κηθξνύο θαη ΜΗ ηαμηλνκεκέλνπο πίλαθεο int linearsearch(int P[],int apo,int eos,int key) { int i; } for (i = apo; i <= eos; ++i) { if (P[i] == key) return i; } return -1;
To πξόβιεκα ηεο Αλαδήηεζεο Αλ ν πίλαθαο είλαη ηαμηλνκεκέλνο ι.ρ. ηειεθσληθόο θαηάινγνο Μπνξώ λα θάλσ πνιύ πην γξήγνξα ηελ αλαδήηεζε Γπαδηθή Αλαδήηεζε (Binary Search) Σπγθξίλεη ην P[middle] ζηνηρείν κε ην δεηνύκελν key Αλ είλαη ίζα βξέζεθε Αλ key < P[middle], ςάρλεη ζην 1 ν κηζό ηνπ πίλαθα Αλ key > P[middle], ςάρλεη ζην 2 ν κηζό ηνπ πίλαθα Δπαλάιεςε Πνιύ γξήγνξε ρεηξόηεξε πεξίπησζε log 2 (N), Ν # ζηνηρείσλ πίλαθα Πίλαθαο 100 ζηνηρείσλ ρξεηάδεηαη ην πνιύ 7 βήκαηα Πίλαθαο 100.000 ζηνηρείσλ ρξεηάδεηαη ην πνιύ 20 βήκαηα Πίλαθαο 100.000.000 ζηνηρείσλ ρξεηάδεηαη ην πνιύ 27 βήκαηα
Binary Search Υινπνίεζε κε επαλάιεςε int binaryloopsearch(int p[], int searchkey, int low, int high) { int middle; while ( low <= high ) { middle = (low + high ) / 2; } if (searchkey == p[middle]) return middle; else if (searchkey < p[middle] ) high = middle 1; else low = middle + 1; } return -1;
Binary Search Υινπνίεζε κε αλαδξνκή int binarysearch(int p[], int searchkey, int low, int high) { int middle; middle = (low + high ) / 2; if (high < low) return -1; if (searchkey == p[middle]) return middle; else if (searchkey < p[middle]) return binarysearch(p, searchkey, low, middle-1); else return binarysearch(p, searchkey, middle+1,high); } return -1;
To πξόβιεκα ηεο Ταμηλόκεζεο Γνζέληνο δεδνκέλσλ, ι.ρ. ζε Πίλαθα (P) Να γίλεη αλαδηάηαμε ησλ ζηνηρείσλ ηνπ ώζηε λα βξεζνύλ ζε αύμνπζα (ή θζίλνπζα) ζεηξά, δειαδή ηαμηλνκεκέλα 12 31 4 32 134 13 42 1 43 2 1 2 4 12 13 31 32 42 43 134 Λύζε : Υπάξρνπλ δηάθνξνη αιγόξηζκνη πνπ ην πεηπραίλνπλ θαη δηαθνξνπνηνύληαη ζην ππνινγηζηηθό Straight Selection Sort - Bubble Sort : Ο(Ν 2 ) Quick Sort : O(N log N)
Ταμηλόκεζε κε επηινγή
Ταμηλόκεζε κε επηινγή values [ 0 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] 36 24 10 6 12 Φσξίδεη λνετά τνλ πίλαθα σε 2 κέξε: - Ταμηλνκεκέλν - Με ταμηλνκεκέλν Σε θάζε επαλάιεςε βξίσθεη τν κεγαιύτεξν στνηρείν θαη τν αλταιιάσεη κε τν πξώτν τνπ αταμηλόκετνπ ππνπίλαθα.
Ταμηλόκεζε κε επηινγή values [ 0 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] 36 24 10 6 12 U N S O R T E D
Ταμηλόκεζε κε επηινγή values [ 0 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] 12 24 10 6 36 SORTED U N S O R T E D
Ταμηλόκεζε κε επηινγή values [ 0 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] 12 6 24 10 36 6 12 36 SORTED U N S O R T E D
Ταμηλόκεζε κε επηινγή values [ 0 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] 12 6 106 24 10 36 24 SORTED U N S O R T E D 12 36
Ταμηλόκεζε κε επηινγή values [ 0 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] 12 6 10 24 SORTED U N S O R T E D 36
Ταμηλόκεζε κε επηινγή values [ 0 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] 10 6 12 24 36 UNSORTED S O R T E D
Ταμηλόκεζε κε επηινγή values [ 0 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] 10 6 12 24 36 UNSORTED S O R T E D
Ταμηλόκεζε κε επηινγή values [ 0 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] 6 10 12 24 36 S O R T E D
Ταμηλόκεζε κε επηινγή: Απαξίζκεζε ζπγθξίζεσλ (ππνινγηζηηθό θόζηνο) values [ 0 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] 6 10 12 24 36 4 compares for values[4] 3 compares for values[3] 2 compares for values[2] 1 compare for values[1] = 4 + 3 + 2 + 1
Selection sort void selectionsort(int arr[], int n) { int i, j, minindex, tmp; for (i = 0; i < n - 1; i++) { minindex = i; for (j = i + 1; j < n; j++) if (arr[j] < arr[minindex]) minindex = j; if (minindex!= i) { tmp = arr[i]; arr[i] = arr[minindex]; arr[minindex] = tmp; } } }
QSort: Χεπδνθώδηθαο QSort(Πίλαθαο Π, δείθηεο Α, δείθηεο Τ) Ταμηλνκεί ηνλ ππνπίλαθα Π[Α] έσο Π[Τ] Αλ Α Τ, επέζηξεςε Γηαθνξεηηθά, Γηάιεμε έλα ζηνηρείν ηνπ πίλαθα (pivot), έζησ ην κεζαίν Λ = Π[(Α+Τ)/2] Βξεο ηελ ζέζε Θ ηνπ Λ πνπ ζα έρεη ζηελ ηειηθή ηαμηλόκεζε Μεηέθεξε ηα ζηνηρεία ηνπ Π[Α] έσο θαη Π[Τ] έηζη ώζηε: Π[Φ] Λ, αλ Φ < Θ Π[Φ] > Λ, αλ Φ > Θ QSort(Π, Α, Θ-1) QSort(Π, Θ+1, Τ)
Qsort void qsort(int v[], int left, int right) { int i, last; if(left >= right) return; swap(v, left, (left + right)/2); last = left; for (i = left+1; i <= right; i++) if (v[i] < v[left]) swap(v, ++last, i); swap(v, left, last); qsort(v, left, last-1); qsort(v, last+1, right); } void swap(int v[], int i, int j) { int temp; temp = v[i]; v[i] = v[j]; v[j] = temp; }