Processing math: 100%
CS @ JMU Links

Homework 1: Asymptotic Analysis Solutions

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:

  1. 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,
  2. 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;
}
  1. 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.
  2. 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;
}
  1. 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.
  2. 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;
}
  1. 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.)
  2. 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.

  1. What is the largest input size nA you can compute on machine A in 60 seconds?
  2. What is the largest input size nB you can compute on machine B in 60 seconds?
  3. 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=375.

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=3150.

Finally, notice that 8n3A=600 and 8n3B=1200. Thus 8n3B=1200=2600=2(8n3A). Solving for nB we get that n3B=2n3AnB=32nA(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.