Ππογπαμμαηιζμόρ Ι (ΗΥ120) Δηάιεμε 10: Ταμηλόκεζε Πίλαθα Αλαδήηεζε ζε Ταμηλνκεκέλν Πίλαθα
Ππόβλεμα Δίλεηαη πίλαθαο t από Ν αθεξαίνπο. Ζεηνύκελν: λα ηαμηλνκεζνύλ ηα πεξηερόκελα ηνπ πίλαθα ζε αύμνπζα αξηζκεηηθή ζεηξά: i : 0<=i<N-1 => data[i] <= data[i+1] Μηα ιύζε (ηαμηλόκεζε θπζαιίδαο bubble sort): Αξρίδνληαο από ην 1ν ζηνηρείν θαη θηάλνληαο κέρξη ην Νν ζηνηρείν ηνπ πίλαθα, βξίζθνπκε ην ζηνηρείν κε ηελ κηθξόηεξε ηηκή θαη αληαιιάζζνπκε ηελ ηηκή ηνπ κε ηελ ηηκή ηνπ 1νπ ζηνηρείνπ. Επαλαιακβάλνπκε ηε δηαδηθαζία, αξρίδνληαο από ην 2ν ζηνηρείν, κεηά αξρίδνληαο από ην 3ν ζηνηρείν θιπ κέρξη θαη ην Ν-1ν ζηνηρείν. 2
i 3 data ηαξινομημένα ζηοισεία πεπιοσή πος δεν έσει ηαξινομηθεί ακόμα θέζη όπος θα αποθηκεςηεί η μικπόηεπη ηιμή πος θα βπεθεί ζηα data[i] data[n-1]
/* ηαμηλόκεζε πίλαθα */ int data[n]; /* πίλαθαο κε Ν αθεξαίνπο */ int i,j; /* κεηξεηέο βξόγρωλ */ int min; /* ζέζε ηνπνζέηεζεο κηθξόηεξνπ ζηνηρείνπ */ int tmp; /* βνεζεηηθή κεηαβιεηή γηα αληαιιαγή ζέζεο */ 4 /* αξρηθνπνίεζε πίλαθα t κε ζηνηρεία */ for (i=0; i<n; i++) { min = i; for (j=i+1; j<n; j++) { if (data[j] < data[min]) { min = j; if (min!= i) { tmp = data[i]; data[i] = data[min]; data[min] = tmp; Ανταλλαγή τιμών 2 μεταβλητών (swap)
Ππόβλεμα Δίλεηαη πίλαθαο t από Ν αθεξαίνπο, ηα πεξηερόκελα ηνπ νπνίνπ είλαη ηαξινομεμένα. Ζεηνύκελν: Να βξεζεί ε ζέζε όπνπ έρεη απνζεθεπζεί κηα ηηκή ζηνλ πίλαθα (εθόζνλ ππάξρεη) Δειαδή γηα κηα ηηκή v, λα βξεζεί ε ηηκή i: i!=ν => t[i]==v i=n => j : 0<=j<N : t[j]!=v 5 Εμεηάδνπκε δύν «θιαζηθέο» ιύζεηο ζεηξηαθή αλαδήηεζε δπαδηθή αλαδήηεζε (κε δηρνηόκεζε)
Σειπιακή αναδήηεζε Αξρίδνπκε από ην πξώην ζηνηρείν ηνπ πίλαθα data[pos], pos=0, πνπ έρεη (εμ νξηζκνύ) ηελ κηθξόηεξε ηηκή θαη εθηεινύκε ζε βξόρν ηηο εληνιέο 2 έωο 5. Αλ pos==n, δειαδή ν πίλαθαο δελ έρεη ζηνηρείν data[pos], ηόηε ηειεηώζακε (δελ ππάξρεη ζηνηρείν κε ηηκή val). Δηαθνξεηηθά, αλ data[pos]==val, ηόηε ηειεηώζακε (αθνύ βξήθακε ην ζηνηρείν κε ηηκή val). Δηαθνξεηηθά, αλ data[pos]>val, ηόηε πάιη ηειεηώζακε (είλαη ζίγνπξν όηη δελ ππάξρεη ζηνηρείν κε ηηκή val). Δηαθνξεηηθά, (ηζρύεη data[pos]<val), ηόηε επαλαιακβάλνπκε ηελ δηαδηθαζία από ην 2 γηα ην επόκελν ζηνηρείν (pos=pos+1). 6 Χξεηάδνληαη θαηά κέζν όξν «ηάμε κεγέζνπο» Ν/2 βήκαηα ζύγθξηζεο.
0 pos Ν-1 7 data πεπιοσή πίνακα πος έσει ήδη ελεγσθεί: 0<=j<pos:data[j]<val ζηοισεία ππορ έλεγσο επόμενο ζηοισείο ππορ έλεγσο
/* ζεηξηαθή αλαδήηεζε ζε ηαμηλνκεκέλν πίλαθα */ int data[n]; /* πίλαθαο κε Ν αθεξαίνπο */ int pos; /* ηξέρνπζα ζέζε */ int val; /* ηηκή ζηνηρείνπ πνπ αλαδεηνύκε */ 8... /* αξρηθνπνίεζε & ηαμηλόκεζε πίλαθα data */ for (pos=0; pos<n; pos++) { if (data[pos] >= val) { break; if (pos == N) { printf("not found\n"); else { if (data[pos]!= val) { printf("not found\n"); else { printf("found at position %d\n", pos);
/* ζεηξηαθή αλαδήηεζε ζε ηαμηλνκεκέλν πίλαθα */ int data[n]; /* πίλαθαο κε Ν αθεξαίνπο */ int pos; /* κεηαβιεηή βξόγρνπ */ int val; /* ηηκή ζηνηρείνπ πνπ αλαδεηνύκε */ 9... /* αξρηθνπνίεζε & ηαμηλόκεζε πίλαθα t */ for (pos=0; (pos<n) && (data[pos]<val); pos++) { if (pos == N) { printf("not found\n"); else if (data[pos]!= val) { printf("not found\n"); else { printf("found at position %d\n", pos); η ζύμβαζη εκηέλεζηρ ηος && εγγςάηαι όηι δεν θα επισειπηθεί ππόζβαζη t[i] όηαν ηο i θηάζει ηο όπιο Ν ηος πίνακα
Δςαδική αναδήηεζε Θέηνπκε ηα όξηα αλαδήηεζεο beg=0 θαη end=n-1. Αξρίδνπκε από ην κεζαίν ζηνηρείν ηνπ πίλαθα t[m], όπνπ m = (beg+end)/2. Αλ t[m] == v, ηειεηώζακε. Αλ t[m] < v, ζπλερίδνπκε κε ηνλ (κηζό) ππνπίλαθα πνπ έρεη ζηνηρεία κε μεγαλύηεπερ ηηκέο ηνπ t[m] δειαδή ζέηνπκε beg = m+1 (θαη πίζω ζην 2). Αιιηώο (t[m] > v), ζπλερίδνπκε κε ηνλ (κηζό) ππνπίλαθα πνπ έρεη ζηνηρεία κε μικπόηεπερ ηηκέο ηνπ t[m] δειαδή ζέηνπκε end = m-1 (θαη πίζω ζην 2). Αλ beg > end ηειεηώζακε (ε ηηκή v δελ ππάξρεη). Χξεηάδνληαη «ηάμε κεγέζνπο» log 2 N βήκαηα. 10
0 beg m end Ν-1 11 data πεπιοσή πος έσει αποκλειζθεί : 0<=i<beg: data[i]<val πεπιοσή ππορ έλεγσο επόμενο ζηοισείο ππορ έλεγσο πεπιοσή πος έσει αποκλειζθεί : end<=i<n: data[i]>val
/* δπαδηθή αλαδήηεζε ζε ηαμηλνκεκέλν πίλαθα */ int data[n]; /* πίλαθαο κε Ν αθεξαίνπο */ int beg,end; /* όξηα αλαδήηεζεο [beg,end) */ int m; /* ζέζε κεζαίνπ ζηνηρείνπ */ int val; /* ηηκή ζηνηρείνπ πνπ αλαδεηνύκε */ 12... /* αξρηθνπνίεζε & ηαμηλόκεζε πίλαθα t */ beg = 0; end = N-1; while (beg <= end) { m = (beg+end)/2; if (data[m] == val) { break; else { if (data[m] < val) { beg = m+1; /* (data[m] > val) */ else { end = m-1; if (beg > end) { printf("not found\n"); else { printf("found at position %d\n", m);
Σύγκπιζε 13 # ζηνηρείωλ κ.ν βεκάηωλ κέγηζηα βήκαηα πίλαθα ζεηξηαθήο αλαδ. δπαδηθήο αλαδ. Ν Ν/2 log N 100 50 7 1.000 500 10 1.000.000 500.000 20 1.000.000.000 500.000.000 30 Η δηαθνξά γίλεηαη ηεπάζηια γηα κεγάιεο ηηκέο ηνπ Ν.