Difference between revisions of "CIS 3020 Part 7"

From In The Wings
Jump to navigation Jump to search
Line 80: Line 80:
 
1
 
1
 
6
 
6
======
+
 
143
 
</pre>
 
|}
 
===Comparison===
 
* some might argue that the second method is ~3.7 times as expensive
 
* And, even if it is O(log N), it will be slower than the first method
 
* Let's look at values to see if this is true...
 
  
 
======
 
======

Revision as of 11:10, 26 April 2007

Complexity

  • When computing O(), we are concerned with big values of n
  • With big values, constants become ignorable
  • Consider the two exponential functions we developed
  • Let's count all operations (arithmetic, assignment, references, comparisons, etc.) the same with calls counting 20.

Exponentiation, O(N)

public int expt(int b, int n) {
  int result;
  if (n<=0) {
    result = 1;
  } else {
    result = b * expt(b, n-1);
  }
  return result;
}

2
1
3
3

28

2
========
39

Exponentiation, O(log N)

public int expt(int b, int n) {
  return fastExpt(b,n);
}

private int fastExpt(int b, int n) {
  int result;
  if (n<=0) result = 1;
  else if (even(n)) result = square(fastExpt(b, n/2));
    else result = b * fastExpt(b, n-1);
  return result;
}

private int square(int x) {
  return (x * x);
}

private boolean even(int x) {
  return (x % 2 == 0);
}

2
23


2
1
6
67
28
2


1
4


1
6


======
143

Exponentiation, O(log N)

public int expt(int b, int n) {
  return fastExpt(b,n);
}

private int fastExpt(int b, int n) {
  int result;
  if (n<=0) result = 1;
  else if (even(n)) result = square(fastExpt(b, n/2));
    else result = b * fastExpt(b, n-1);
  return result;
}

private int square(int x) {
  return (x * x);
}

private boolean even(int x) {
  return (x % 2 == 0);
}

2
23


2
1
6
67
28
2


1
4


1
6
======
143

Comparison

  • some might argue that the second method is ~3.7 times as expensive
  • And, even if it is O(log N), it will be slower than the first method
  • Let's look at values to see if this is true...

==

143

|}

Comparison

  • some might argue that the second method is ~3.7 times as expensive
  • And, even if it is O(log N), it will be slower than the first method
  • Let's look at values to see if this is true...

Exponentiation, O(log N)

public int expt(int b, int n) {
  return fastExpt(b,n);
}

private int fastExpt(int b, int n) {
  int result;
  if (n<=0) result = 1;
  else if (even(n)) result = square(fastExpt(b, n/2));
    else result = b * fastExpt(b, n-1);
  return result;
}

private int square(int x) {
  return (x * x);
}

private boolean even(int x) {
  return (x % 2 == 0);
}

2
23


2
1
6
67
28
2


1
4


1
6
======
143