Search - CIS 1068 Program Design and Abstraction Zhen Jiang CIS Dept. Temple University SERC 347, Main Campus Email: zhen.jiang@temple.edu 3/10/2016 1 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 3/10/2016 2 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) 3/10/2016 3 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 3/10/2016 4 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 3/10/2016 5 For instance Price is right (click on this link to try) To see if you can get the price quickly… 3/10/2016 6 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 3/10/2016 7 # 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: For i:= 0 to end of D: phone # if D[i].phone matches key: address return i name return -1 3/10/2016 8 1. 2. 3. 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. 3/10/2016 9 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! 3/10/2016 10 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 3/10/2016 We’ll discuss binary search because it’s simpler 11 Now imagine doing the reverse: find the name of a business given just their phone number. 3/10/2016 What algorithm will find the number in the phone book? Answer: you need to use (some version of) linear search! Ugh. 12 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. 3/10/2016 13 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: 29 Comparison: D[mid] < key Comparison: -15 -7 left 3/10/2016 -6 -2 0 8 mid left 10 D[mid] = key! 29 mid 31 40 right 14 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 3/10/2016 15 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); } 3/10/2016 16 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)); } } 3/10/2016 17 Implement a binary search method in your Business class 3/10/2016 18 How much faster is binary search? Way, way faster Assuming the array is already sorted For an array of size: Linear search might visit: Binary search might visit: 24 = 16 But precisely how much? 4+1 16 elements 28 = 256 256 elements 8+1 = log2(256)+1 212 = 4096 4096 elements 12+1 = log2(4096)+1 2n = m elements m elements n + 1 = log2(m) + 1 3/10/2016 = log2(16)+1 19 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); 3/10/2016 20 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 ( ) 3/10/2016 21