Searching

advertisement
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
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
1.
Implement a class called Business that
includes fields for name, address, and phone
number, plus a constructor and accessor
methods.
2.
Create a class called YellowPages that stores a
set of Business objects in an array.
3.
Write a LinearSearch method for the
YellowPages class that finds the index of a
Business, given its phone number.
Binary Search
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:
29
Comparison:
-15
left
-7
-6
-2
D[mid] < key
Comparison:
0
8
mid
left
10
D[mid] = key!
29
mid
31
40
right
Binary Search Algorithm
# Input:
# Output:
Sorted Array D, integer key
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]:
right = middle -1
else:
left = middle + 1
return -1
// b/c D is sorted
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?
For an array of size:
Linear search might visit:
Binary search might visit:
24 = 16
16 elements
4+1 = log2(16)+1
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
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
1.
2.

3.
4.
5.
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
Download