ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ & ΑΛΓΟΡΙΘΜΟΙ ΕΡΓΑΣΤΗΡΙΟ Κωδικός Θ: ΤΠ3001, Κωδικός Ε: ΤΠ3101 (ΜΕΥ/Υ) Ώρες (Θ - Ε): 4-2 Προαπαιτούμενα: Δρ. ΒΙΔΑΚΗΣ ΝΙΚΟΣ
ΕΡΓΑΣΤΗΡΙΟ 3 Sequential & Binary Search Σειριακή & Δυαδική Αναζήτηση
Θεωρία Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 3
Έννοιες 1. Ποιοι παράγοντες επηρεάζουν τον αλγόριθμό αναζήτησης που θα επιλέξουμε 2. Πότε εφαρμόζουμε την σειριακή και πότε την δυαδική αναζήτηση Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 4
Κανόνες 1. Οι παράγοντες που επηρεάζουν τον αλγόριθμο αναζήτησης είναι: 1. Η διακριτότητα των στοιχείων του πίνακα 2. Η ταξινόμηση των στοιχείων του πίνακα 2. Η δυαδική αναζήτηση εφαρμόζεται μόνο όταν ο πίνακας είναι ταξινομημένος 3. Η σειριακή αναζήτηση εφαρμόζεται είτε ο πίνακας είναι ταξινομημένος είτε όχι 4. Προτιμάμε την σειριακή αναζήτηση όταν: 1. Ο πίνακας είναι αταξινόμητος 2. Ο πίνακας είναι μικρός 3. Η αναζήτηση γίνεται σπάνια Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 5
Pseudocode SEQUENTIAL SEARCH PSEUDOCODE while (another student in the list and student not found) if current student name in the list = new student name return found and pointer to student in list else go to next student in the list end while Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 6
Pseudocode BINARY SEARCH PSEUDOCODE Input: ordered list and element to be searched for (the search target) Output: location of search target or 0 if target is not found Algorithm binarysearch(list[], searchtarget) last <-- length(list[]) first <-- 1 // while there are still elements to be searched through while first = last do middle <-- (first + last) / 2 // if current middle value is the search target if list[middle] = searchtarget return middle // if current middle value is less than the search target else if list[middle] < searchtarget first <-- middle + 1 // if current middle value is larger than the search target else last <-- middle - 1 end if end while // return 0 if search target not found return 0 Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 7
/* * To change this template, choose Tools Templates * and open the template in the editor. */ package javaapplication3; /** * * @author Vidakis */ import java.util.arrays; import java.util.scanner; import static java.lang.math.*; public class SequentialSearchArray { public static void main(string... args) { Scanner sc = new Scanner(System.in); int j, k, number, size; boolean found = false; System.out.print("Enter the array size: "); size = sc.nextint(); int[] intarray = new int[size]; Παραδείγματα σε Java Sequential Search for (j=0; j<size; j++) intarray[j] = (int) (random()*100); System.out.println("A " + size + " element int array of random " + "ints between 0 and 99 has been loaded."); System.out.print("Guess one of the numbers: "); number = sc.nextint(); k=0; while (!found && k<size) if (intarray[k]==number) found=true; else k +=1; System.out.println(); if (found) System.out.println("Found in position " + k); else System.out.println("The number is not found"); System.out.println("\nThe random array for verification is:\n"); System.out.println(Arrays.toString(intArray)); Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 8
/* * To change this template, choose Tools Templates * and open the template in the editor. */ package javaapplication3; /** * * @author Vidakis */ public class BinarySearchArray { private long[] a; private int nelems; Παραδείγματα σε Java Binary Search private int recfind(long searchkey, int lowerbound, int upperbound) { int curin; curin = (lowerbound + upperbound) / 2; if (a[curin] == searchkey) return curin; // found it else if (lowerbound > upperbound) return nelems; // can't find it else // divide range { if (a[curin] < searchkey) // in upper half return recfind(searchkey, curin + 1, upperbound); else // in lower half return recfind(searchkey, lowerbound, curin - 1); public BinarySearchArray(int max) { a = new long[max]; // create array nelems = 0; public int size() { return nelems; public int find(long searchkey) { return recfind(searchkey, 0, nelems - 1); public void insert(long value) { int j; for (j = 0; j < nelems; j++) // find where it goes if (a[j] > value) // (linear search) break; for (int k = nelems; k > j; k--) // move bigger ones up a[k] = a[k - 1]; a[j] = value; // insert it nelems++; // increment size Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 9
Παραδείγματα σε Java Binary Search public void display() { for (int j = 0; j < nelems; j++) System.out.print(a[j] + " "); System.out.println(""); public static void main(string[] args) { int maxsize = 100; BinarySearchArray arr = new BinarySearchArray(maxSize); arr.insert(12); arr.insert(20); arr.insert(35); arr.insert(426); arr.insert(54); arr.insert(69); arr.insert(744); arr.insert(87); arr.insert(895); arr.insert(89); arr.insert(8); arr.insert(208); arr.insert(4); arr.insert(617); arr.insert(83); arr.insert(96); arr.display(); // display array int searchkey = 54; // search for item if (arr.find(searchkey)!= arr.size()) System.out.println("Found " + searchkey); else System.out.println("Can't find " + searchkey); Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 10
Παραδείγματα σε C Sequential Search #include<stdio.h> main() { int a[10],i,n,m,c=0; printf("enter the size of an array: "); scanf("%d",&n); printf("enter the elements of the array: "); for(i=0;i<=n-1;i++){ scanf("%d",&a[i]); printf("enter the number to be search: "); scanf("%d",&m); for(i=0;i<=n-1;i++){ if(a[i]==m){ c=1; break; if(c==0) printf("the number is not in the list"); else printf("the number is found"); Copyrights: http://wiki.answers.com/q/sequential_search_program_in_c Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 11
Παραδείγματα σε C Binary Search #include <stdio.h> main() { int n, a[30], item, i, j, mid, top, bottom; printf("enter how many elements you want:\n"); scanf("%d", &n); printf("enter the %d elements in ascending order\n", n); for (i = 0; i < n; i++) { scanf("%d", &a[i]); printf("\nenter the item to search\n"); scanf("%d", &item); bottom = 1; top = n; do { mid = (bottom + top) / 2; if (item < a[mid]) top = mid - 1; else if (item > a[mid]) bottom = mid + 1; while (item!= a[mid] && bottom <= top); if (item == a[mid]) { printf("binary search successfull!!\n"); printf("\n %d found in position: %d\n", item, mid + 1); else { printf("\n Search failed\n %d not found\n", item); Copyrights: http://www.c-program-example.com/2011/09/c-program-forbinary-search.html Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 12
Ασκήσεις για Java Αλλάξτε τον κώδικα του sequential array έτσι ώστε να δημιουργείται ένα array για το αποτέλεσμα του search στο οποίο να καταχωρείτε: Την ελάχιστη τιμή του intarray, Την μέγιστη τιμή του intarray, Και το αποτέλεσμα του search. Αλλάξτε τον κώδικα του binary array έτσι ώστε να: παίρνει την τιμή του search από το πληκτρολόγιο, Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 13
Ασκήσεις για C Αλλάξτε τον κώδικα του sequential array έτσι ώστε να δημιουργείται ένας πίνακας result για τα αποτελέσματα του search. Εντοπίστε (α) την ελάχιστη τιμή, (β) την μέγιστη τιμή και (γ) έναν τυχαίο αριθμό τον οποίο θα δίνετε από το πληκτρολόγιο. Στο πίνακα result θα καταχωρείτε: Την ελάχιστη τιμή του πίνακα a Την θέση της ελάχιστης τιμής του πίνακα a Την μέγιστη τιμή του πίνακα a Την θέση της μέγιστης τιμής του πίνακα a Την θέση του τυχαίου αριθμού ανίχνευσης ή NULL ένα δεν τον βρείτε Τα στοιχεία του πίνακα που θα χρησιμοποιήσετε θα είναι τυχαία και θα τα εισάγετε από το πληκτρολόγιο όπως σας παραπέμπει ο κώδικας. Κατά την διαδικασία debugging του κώδικα σας καλό είναι να εισάγετε το ίδιο σύνολο αριθμών. Θεωρήστε ως δεδομένα στο Binary Search τα παρακάτω: (1 3 7 8 11 16 21 25) Αν αναζητήσουμε την τιμή 3, πόσες φορές θα εκτελεστεί ο αλγόριθμος; Εξηγήστε αναλυτικά Εάν αντιστρέψουμε την ταξινόμηση των δεδομένων ( 25 21 16 11 8 7 3 1) και αναζητήσουμε την τιμή 3, πόσες φορές θα εκτελεστεί ο αλγόριθμος τώρα; Εξηγήστε αναλυτικά Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 14