170 likes | 290 Views
Searching Algorithms. The Search Problem. 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 of the value in the data. e.g., return index = 2. The Search Problem.
E N D
The Search Problem Problem Statement: Given a set of data e.g., int [] arr = {10, 2, 7, 9, 7, 4}; and a particular value, e.g., intval = 7; Find the first index of the value in the data. e.g., return index = 2
The Search Problem 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
Linear Search Algorithm # Input: Array D, integer key # Output: first index of key in D, # or -1 if not found For i = 0 to last index of D: if D[i] equals key: return i return -1
Linear Search for Phone Numbers # 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
Exercise • 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.
What happens if our array is huge? • Imagine finding a particular word on the Web (approximately 100,000,000,000 documents) • Linear search would take a long time • Two common faster search techniques are: • Indexing (used on the Web and in databases) • Binary search • We’ll discuss binary search because it’s simpler, but you can learn about indexing in later CIS classes
An Example Search Problem • 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’. • 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.
Binary Search: Normal Phone Book Use • 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.
Binary Search Example 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
You guessed it: Exercise • Implement a binary search method in your Business class
How much faster is binary search? • Way, way faster • Assuming the array is already sorted • But precisely how much?
Arrays.binarySearch 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);
Binary Search: What you should know • The requirements for it to work (array is 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 algorithm for it • Advantages and Disadvantages compared with linear search • How to use Arrays.binarySearch()
Exercise • Modify your Business class so that the Arrays.sort() method will work on it • What are the two things you need to do? • Declare that the class implements the Comparable interface • Implement the compareTo() method • Make it sort the Businesses according to phone number