You are on page 1of 20

Zabin Visram Room CS115

CS126
Searching
Binary Search
Binary Search
Sequential search is not efficient for large
lists as it searches half the list, on average
Another search algorithm Binary search
Very fast
But can only be performed on ordered lists
Example
If you are looking for you friends number in the
phone book, you may decide to look from half
way , you know the book is ordered
alphabetically therefore if you decide the name is
in the right half you can disregard the left half
throw it away just concentrate on the right half
this way your search is dramatically reduced
only have book o search do the same process
again until eventually u either find the name or
decide its not there binary search is the same
Divide & Conquer technique
When a list is sorted and we have
random access to the list as in an array
or vector implementation
we can take advantage of this
additional structure in our search
methods.
binary search algorithm uses the
Divide & Conquermethod to search
the list
Divide & Conquer technique
First the search item is compared with the
middle element of the list. If the search
item is less than the middle element of the
list, we restrict the search to the first half of
the list; otherwise we search the second
half of the list
Binary Search
Consider a sorted list of length 12
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]
4 8 19 25 34 39 45 48 66 75 89 95
list
Binary Search
Suppose we want to find 75
Entire list is searched compare 75 with middle
element in list, list[5] (which is 39)
Because 75 Is in list [6]..list[11] we restrict
search there
4 8 19 25 34 39 45 48 66 75 89 95
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]
list
Search list
MID
Binary Search
The process is now repeated on the list
[6]..list[11] which is a list of 6
4 8 19 25 34 39 45 48 66 75 89 95
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]
list
Search list
Task - individually
During a binary search , which elements in
the array
4 8 12 14 20 24
Are compared to the target when the target
is a. 2 b.8 c.15
Answer
a. 12 and 4
B. 12, 4 and 8
C. 12, 20 and 14
most of the array is not searched at all ,
saving much time - thus BS algorithm is
very fast.
But how fast ? Counting the comparisons
I.e each time algorithm divides the array in
half - can provide us a measure of the
algorithms efficiency
Binary search Analysis
Suppose we are working with a sorted array
of n integers
Initially first = 0 and (because an array index in
J ava starts at 0 and n denotes the number of
elements in the list(length) then last = n-1
The element midway in an array indexed
from 0 to n-1 is mid = (n 1) / 2.
If the target is less than the value at mid,
then since the array is sorted we can be
certain that the target element is not in the
array from positions mid to n-1. In pseudo
code the idea is:
low = 0; high = n -1;
mid = (low + high) / 2;
if target = array[mid]
then return mid
else
if target < array[mid]
then target is not in range mid .. n-1
discard upper half by setting high = mid 1;
else
target is not in the 0 ..mid range;
discard lower half by setting low = mid + 1;
repeat with new range until possible array is of length 1.
If the lower half of the list 0..mid was discarded by the
above algorithm then the next probe would be at
mid = [(mid+1) + (n-1)] / 2
Binary search Analysis
which is the midpoint of the upper half.
Continuing in this way, unless we find the target, we
halve the list each time until it becomes of size one
and we either have found the target or it was not
present originally.
The complexity of such an algorithm the work
required to complete it given a list of size n initially
is the number of probes that are required. That is,
how many times can a list of size n be halved before
it becomes of size one? Let k be the smallest integer
such that
Binary search Analysis
n / 2^k = 1
Then k = ceiling (log n). Of course,
sometimes the target is found before k
probes. It has been proved that the average
time for a successful search by this method
is approximately log n 1 . So binary search
is O(log n).

A standard binary search method can then be written


publ i c i nt bi nar ySear ch( i nt t ar get ) {
i nt l ow = 0;
i nt hi gh = a. l engt h 1;
i nt mi d;
whi l e ( l ow <= hi gh) {
mi d = ( l ow + hi gh) / 2;
i f ( t ar get == a[ mi d] ) / / mat ch
r et ur n mi d;
el se
i f ( t ar get < a[ mi d] )
/ / sear ch l ow end of ar r ay
hi gh = mi d 1;
el se
/ / sear ch hi gh end of ar r ay
l ow = mi d + 1;
}
r et ur n 1;
}
Binary search Analysis
The above algorithm checks on each
iteration for whether target is at array[mid].
This is relatively unlikely until the sublists
become small
so a refinement of this algorithm involves
omitting that test until the final sublist (of
length one).

Binary Search Vs Linear Search


A sequential search of either a list, an array,
or a chain looks at the first item, the second
item, and so on until it either finds a
particular item or determines that the item
does not occur in the group
Average case of sequential search is O(n)
A binary search of an array requires that the
array be sorted . It looks first at the middle of
the array to determine in which half the
desired item can occur. The search repeats
this strategy on only this half of the array
Binary Search Vs Linear Search
The benefit of binary search over linear
search becomes significant for lists over
about 100 elements.
For smaller lists linear search may be faster
because of the speed of the simple
increment compared with the divisions
needed in binary search.
The general moral is that for large lists
binary search is very much faster than linear
search, but is not worth while for small lists.
Note that binary search is not appropriate
for linked list structures (no random access
for the middle term).
Demonstration
http://www.cosc.canterbury.ac.nz/peopl
e/mukundan/dsal/BSearch.html
in comparison linear search
http://www.cosc.canterbury.ac.nz/people/m
ukundan/dsal/LSearch.html