210 likes | 439 Views
Search - CIS 1068 Program Design and Abstraction. Zhen Jiang CIS Dept. Temple University 1050 Wachman Hall, Main Campus Email: zhen.jiang@temple.edu. Table of Contents. Introduction to searching problem Problem statement Linear search algorithm Binary search Binary search algorithm
E N D
Search - CIS 1068 Program Design and Abstraction Zhen Jiang CIS Dept. Temple University 1050 Wachman Hall, Main Campus Email: zhen.jiang@temple.edu
Table of Contents • Introduction to searching problem • Problem statement • Linear search algorithm • Binary search • Binary search algorithm • How much fast is binary search? • Search mechanics in java • Summary
The Search Problem Considering a sequence of characters that are contained in a string e.g., String str= “hello”; and a particular character in another string, e.g., String str2 = “l”; Find 1st appearance of such a character in the original group e.g., return str.indexOf(str2)
Problem Statement Given a set of data e.g., int [] arr = {10, 2, 7, 9, 7, 4}; and a particular value, e.g., int val = 7; Find the first index/position of the value in the data. e.g., return index = 2
Problem Statement, revisited: Input: A set of data (an array, ArrayList, LinkedList, …) A single data element Output: Position of the data element in the data set, or -1 if the element does not appear in the data set
For instance • Price is right (click on this link to try) • To see if you can get the price quickly…
Linear Search Algorithm (p541) # Input: Array D, integer key # Output: first index of key in D, # or -1 if not found # also called sequential search For i = 0 to last index of D: if D[i] equals key: return i return -1
# Input: Array D of Business objects, # phone number key # Output: first index where key’s phone # number matches D, or -1 if not found Business: phone # address name For i:= 0 to end of D: if D[i].phone matches key: return i return -1
Implement a class called Business that includes fields for name, address, and phone number, plus a constructor and accessor methods. • Create a class called YellowPages that stores a set of Business objects in an array. • Write a LinearSearch method for the YellowPages class that finds the index of a Business, given its phone number.
Binary Search • Imagine finding the price among the range up to $100,000,000 • Linear search would take a long time • Random guess is even worse!
Two common search techniques are: • Indexing (used on the Web and in databases) • Imagine flipping through the Yellow Pages, looking for a pizza place near you. • It’s pretty easy – you just flip to the section for ‘P’, then look for ‘Pi’, then ‘Piz’, …, ‘Pizza’. • We can learn about indexing in later CIS classes • Binary search • We’ll discuss binary search because it’s simpler
Now imagine doing the reverse: find the name of a business given just their phone number. • What algorithm will find the number in the phone book? • Answer: you need to use (some version of) linear search! Ugh.
Normally, when you search the phone book, you implicitly use the fact that it’s sorted: The smallest element (alphabetically first element) appears first. Then the next smallest, … Then the biggest (alphabetically last) element. • Binary search does the same thing, and it only works if your data (array) is sorted.
Step 1: Define left and right boundaries for searching Step 2: Define middle of the search region Repeat! Step 3: Compare the middle with our key Find key: Comparison: D[mid] < key Comparison: D[mid] = key!
Binary Search Algorithm # Input: Sorted Array D, integer key # Output: first index of key in D, or -1 if not found left = 0, right = index of last element while left <= right: middle = index halfway between left, right if D[middle] matches key: return middle else if key comes before D[middle]: // b/c D is sorted right = middle -1 else: left = middle + 1 return -1
public static int bs(int [ ] n, int first, int last, int v){ int middle; if (first > last) return -1; middle = (first + last)/2; if(n[middle] = = v) return middle; else if ( n[middle] < v) return bs(n, middle+1, last, v); else return bs(n, first, middle-1, v); }
Find out what will be the print out results of the following program and trace the position (subscript value) of each access of the array n (i.e., the value of variable middle). public class ArrayRecursive { public static void main(String [ ] args){ int [ ] n = {101, 142, 147, 189, 199, 207, 222, 234, 289, 296, 310, 319, 388, 394, 417, 429, 447, 521, 536, 600}; System.out.println( “bs(”+102+“)=”+bs(n, 0, n.length-1, 102)); System.out.println( “bs(”+296+“)=”+bs(n, 0, n.length-1, 296)); System.out.println( “bs(”+289+“)=”+bs(n, 0, n.length-1, 289)); } }
How much faster is binary search? • Way, way faster • Assuming the array is already sorted • But precisely how much?
Java Mechanics in Java The Java class Arrays has numerous helpful methods built in, including a binary search method: public static int binarySearch(int[] a, int key): Searches the specified array of ints for the specified value using the binary search algorithm. Example: int index = Arrays.binarySearch(arr, 29);
Summary • The requirement for it to work (array is pre-sorted) • How to simulate it on an example array • That is, what sequence of indexes are compared with the key for a specific input key? • Write the binary search algorithm for it • Advantages and disadvantages compared with linear search (also called sequential search) • How to use Arrays.binarySearch ( )