Download presentation source

Download Report

Transcript Download presentation source

CS100A Lecture 14, 20 October 1998
Linear and Binary Search
Base-2 logarithms
Linear Search: Find (the value of) x is array b.
This description is too vague, for several reasons:
•How are we to indicate that x appears in b?
•What if it appears more than once in b?
•What is to be done if x is not in b?
In general, when approaching a new programming job,
the first task is to make the specification of the job as
precise as possible.
CS100A, Lecture 14, 20
October 1998
1
One way to specify the task:
Write a method that returns the index of the first element
of b that equals x. If x does not occur in b, return b.length.
Example: b = {1, 2, 8, 5, 2, 9} (so b.length = 6)
If x is 1, return 0
If x is 2, return 1
If x is 5, return 3
if x is 3, return 6
// return value i that satisfies: 0<=i<=b.length,
//
x not in b[0..i-1],
//
(i = b.length or x=b[i])
public static int linearSearch (int [ ] b, int x)
Need a loop. It will compare elements of b with x,
beginning with b[0], b[1], …
Invariant: 0<=i<=b.length and x not in b[0..i-1]
0
b
i
b.length
x is not here
CS100A, Lecture 14, 20
October 1998
2
i= 0;
// Inv:
b
0
i
b.length
x is not here
while (
){
}
CS100A, Lecture 14, 20
October 1998
3
// return the value i that satisfies: 0<=i<=b.length,
//
x not in b[0..i-1], and (i = b.length or x=b[i])
public static int linearSearch (int [ ] b, int x) {
int i= 0;
// Inv: 0<=i<=b.length and x not in b[0..i-1],
while (i < b.length && x != b[i])
i= i+1;
return i;
}
Alternative method body
int i= 0;
// Inv: 0<=i<=b.length and x not in b[0..i-1],
while (i < b.length) {
if (x == b[i])
return i;
i= i+1;
}
return i;
}
Worst case, makes up to b.length array comparisons.
CS100A, Lecture 14, 20
October 1998
4
Binary search
Find x in sorted (in ascending order) array b.
Like a search in a telephone directory
Specification. Store an integer in k to truthify:
b[0..k] <= x < b[k+1..b.length-1]
0
b
k
b.length
<= x
>x
means that every value
in here is <= x
means that every value
here is > x
0 1 2 3 4 5 6 7 8
Examples:
b 2 3 3 3 5 6 8 8 9
x 1
2
3
4
5
6
7
8
9
10
k -1
0
3
3
4
5
5
7
8
8
CS100A, Lecture 14, 20
October 1998
5
Binary search
Store an integer in k to truthify
b[0..k] <= x < b[k+1..b.length-1]
0
b
k
<= x
Invariant
0
b
<= x
b.length
>x
k
j
b.length
>x
k=
; j=
;
while (
){
int e =
;
// We know that -1 <= k < e < j <= b.length
if ( b[e] <= x )
else
}
CS100A, Lecture 14, 20
October 1998
6
Binary search
// Given sorted b, return the integer k that satisfies
// b[0..k] <= x < b[k+1..b.length-1]
public static int binarySearch( int [ ] b) {
int k= -1;
int j= b.length;
// Invariant: -1 <= k < j <= b.length and
//
b[0..k] <= x < b[k+1..b.length]
while (k+1 != j) {
int e = (k+j)/2;
// We know -1 <= k < e < j <= b.length
if ( b[e] <= x ) k= e;
else
j= e;
}
return k;
}
CS100A, Lecture 14, 20
October 1998
7
Points about this binary search of a sorted array
• It works when the array is empty (b.length = 0) -return -1.
• If x is in b, finds its rightmost occurrence
• If x is not in b, finds position where it belongs
• In general, it’s faster than a binary search that stops as
soon as x is found. The latter kind of binary search
needs an extra test (x = b[k]) in the loop body, which
makes each iteration slower; however, stopping as
soon as x is found can be shown to save only one
iteration (on the average).
• It’s easy to verify correctness of the algorithm --to see
that it works.
• You should memorize the specification and the
development of the algorithm.
CS100A, Lecture 14, 20
October 1998
8
How fast is binary search?
b.length
no.of iterations
log(b.length+1)
0
= 20 - 1
0
0
1
= 21 - 1
1
1
3
= 22 - 1
2
2
7
= 23 - 1
3
3
15
= 24 - 1
4
4
32767 = 215 -1
15
15
1048575= 220 -1
20
20
j is the “base 2 logarithm of 2j.
m is the base 10 logarithm of 10m.
To search an array of a million entries using linear
search may require a million iterations of the loop.
To search an array of a million entries using binary
search requires only 20 iteration!
Linear search is a linear algorithm; the time it takes is
proportional in the worst case to the size of the array.
Binary search is a logarithmic algoririthm; the time it
takes is proportional in the worst case to the size of the
CS100A, Lecture 14, 20
9
array.
October 1998