3.3e - UCSB Computer Science

advertisement
The Complexity of Algorithms:
Selected Exercises
Goal: Introduce computational complexity analysis.
Exercise 10
How much time does an algorithm take for a problem of size n,
if it uses 2n2 + 2n bit operations, each taking 10-9 second?
a)
n = 10: ( 2(10)2 + 210 )10-9 sec
≈ 1.224 *10-6 sec.
b)
n = 20: ( 2(20)2 + 220 )10-9 sec
≈ 1.05 *10-3 sec.
c)
n = 50: ( 2(50)2 + 250 )10-9 sec
≈ 1.13 *106 sec ≈ 13 days.
d)
n = 100: ( 2(100)2 + 2100 )10-9 sec ≈ 1.27 *1021 sec ≈ 4 *1013 years.
Copyright © Peter Cappello
2
Exercise 20
Analyze the worst-case [time] complexity of the program
on the following slide, in terms of the number of
elements in the input array.
(That is, give a O() estimate of the time.)
Copyright © Peter Cappello
3
Method (not compiled)
List<Integer> getBiggersList( int[] intArray )
{
List<Integer> biggers = new LinkedList<Integer>();
int sum = 0;
for ( int item : intArray )
{
if ( item > sum )
biggers.add( item );
sum += item;
}
return biggers;
}
Copyright © Peter Cappello
4
Exercise 20 continued
• Let n = intArray.length.
• The statements outside the for statement complete in
constant time, say c1 sec.
• The body of the for statement executes n times.
• Each iteration of the body takes constant time, say c2 sec.
Only if the List add operation requires constant time (i.e., does not
depend on n).
• Total time, in seconds, is c1 + c2 n, which is O( n ) .
Copyright © Peter Cappello
5
Exponentiation revisited
double x2n( double x, int n )
{
double x2n = 1.0;
for ( int i = 0; i < n; i++ )
x2n *= x;
return x2n;
}
double x2z( double x, int z )
{
return ( z < 0 ) ? 1.0 / x2n( x, -z ) : x2n( x, z );
}
Give a O() estimate for the time to compute x2n as a
function of n.
Copyright © Peter Cappello
6
Program Notes
Consider a faster algorithm for x2n.
(But which continues to ignore underflow/overflow.)
Copyright © Peter Cappello
7
Faster algorithm for x2n
double x2n( double x, int n )
{
double x2n = 1.0, factor = x;
while ( n > 0 )
{
if ( n % 2 == 1 )
x2n *= factor;
n /= 2;
factor *= factor;
}
return x2n;
}
Evaluate the algorithm for n = 21.
Give a O() estimate for the time to compute x2n as a
function of n.
Copyright © Peter Cappello
8
Recursive version of faster algorithm
double x2n( double x, int n )
{
if ( n == 0 )
return 1.0;
return ( ( n % 2 == 0 ) ? 1 : x ) * x2n( x * x, n / 2 );
}
Evaluate x2n( 2.0, 21 ) .
How many times is x2n invoked, as a function of n?
We address this question when we study recurrence relations.
Copyright © Peter Cappello
9
Download