Comparing Functions (14 points)
For the following pairs of functions, indicate whether the ?? could be replaced with O, Ω or Θ.
Pr. | f(n) | g(n) | f(n)∈??(g(n)) |
---|---|---|---|
a) | 48n | 2n2+1 | O |
b) | 0.00001n2 | 2210(nlogn) | Ω |
c) | 5n20+n2log2n | n! | O |
d) | 4n | 4log2(2n) | Θ |
e) | 5nlogn | 2n1.5 | O |
f) | 7n1024 | 1.000001n | O |
g) | 2n2logn | 3n | Ω |
Orders of Functions (14 points)
List each of the functions from the previous problem from slowest to fastest growing in a table like the table below (include both the f(n) and g(n) functions). Group the functions by complexity class. Indicate which functions are in the same complexity class (same big-Θ set).
Complexity class | Functions from previous problem. |
---|---|
Θ(n) | 48n, 4n, 4log2(2n), 3n |
Θ(nlogn) | 2210(nlogn), 5nlogn |
Θ(n1.5) | 2n1.5 |
Θ(n2) | 0.00001n2, 2n2+1 |
Θ(n2logn) | 2n2logn |
Θ(n20) | 5n20+n2log2n |
Θ(n1024) | 7n1024 |
Θ(1.000001n) | 1.000001n |
Θ(n!) | n! |
NOTE: You may not need all of the rows in the table above.
Analyzing Java Code (12 points)
For each of the following Java methods, analyze the running time by:
- writing an expression in terms of n for the every-time case analysis T(n) (if it exists) or worst case analysis W(n) (if the every-time case analysis does not exist) for the number of arithmetic operations,
- give the appropriate big-Θ complexity class for your analysis function T(n) or W(n).
Code Listing A
public int A(int[] array) {
int result = 25;
int i = array.length;
while (i > 1) {
if (array[i-1] < 0) { // 1 op
return 0;
}
for (int j = 0; j < array.length; j++) {
result += 1;
result += 3 * array[j];
} // 4 operations per iteration, 4n per iteration of outer loop
i = i / 2; // 1 op
// So this loop does 2 + 4n operations each iteration
} // This occurs (log n + 1) times, though we are flexible if you got (log n)
return result;
}
- Give your equation for T(n) or W(n) (which did you choose and why)? W(n)=(logn+1)(4n+2)=4nlogn+4n+2logn+2. We used W(n) because there is no every-case time complexity since the if statement in the loop exits the method early in the event that
array[i-1] < 0
. - Give the Θ complexity class: Θ(nlogn)
Code Listing B
public int B(int[] array1) {
int result = 0;
for (int i = 0; i < array1.length / 2; i++) {
result += array1[i] * 2;
} // 4 ops per iteration plus one extra divide, n/2 iterations, total : 4n/2 + 1 = 2n + 1
for (int j = array1.length-1; j >= 0; j--) {
result += array1[j] * 3;
} // 3 ops per iteration, plus one extra for initialization of j, so 3n + 1
return result;
}
- Give your equation for T(n) or W(n) (which did you choose and why)? T(n)=5n+2. Every-time case because loop iteration count doesn’t depend on input values.
- Give the Θ complexity class: Θ(n)
Code Listing C
public int C(int[] array1) {
int result = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1.length; j++) {
for (int k = 1; k < array1.length; k = k * 2) {
result += j * j * array1[k] + array1[i] + array1[j];
} // 6 ops per iteration, log n + 1 iterations: 6log n + 6 total
} // 6log n + 7 ops per iteration, n iterations, 6 n log n + 7 n total
} // 6 n log n + 7n + 1 ops per iteration, n iterations, 6n^2 log n + 7n^2 + n ops total
return result;
}
- Give your equation for T(n) or W(n) (which did you choose and why)? T(n)=6n2logn+7n2+n (Every-time since it doesn’t depend on the values of array1, just the length.)
- Give the Θ complexity class: Θ(n2logn).
How much faster? (6 points)
Suppose you have an algorithm that performs T(n)=8n3 arithmetic operations on an input of size n. Suppose you have two machines, machine A and machine B. Machine A performs 10 arithmetic operations per second, while machine B performs 20 arithmetic operations per second.
- What is the largest input size nA you can compute on machine A in 60 seconds?
- What is the largest input size nB you can compute on machine B in 60 seconds?
- Write an equation describing the relationship between nA and nB.
The easiest way to solve this is to recognize that if machine A runs 10 ops per second and we run it for 60 seconds, then it will have performed 600 ops. Thus we are asking for what value of nA is 8n3A=600. Solving for nA we get nA=3√75.
If machine B runs in 20 ops per second, and we run it for 60 seconds, then it performs 1200 ops. Thus 8n3B=1200. Solving for nB we get nB=3√150.
Finally, notice that 8n3A=600 and 8n3B=1200. Thus 8n3B=1200=2∗600=2(8n3A). Solving for nB we get that n3B=2n3A⇒nB=3√2nA≈(1.26nA). In other words, if we double the speed of our machine, the size of the problem we can solve in a fixed time frame only increases by a factor of 1.26.