CSE 373 Homework #2: Algorithm Analysis


Category: You will Instantly receive a download link for .zip solution file upon Payment


5/5 - (4 votes)

1. (4 points) Show that the function log2(9N) is O(log2N). You will need to use the definition
of O(f(n)) to do this. In other words, find values for c and n0 such that the definition of BigOh holds true as we did with the examples in lecture. For full credit, show the steps you took
to arrive at your c and n0.
2. (6 points) (adapted from Weiss 2.1) Order the following functions by growth rate:
, N log N, 2/N, 2N
, 92, N2 log N, N!, N1.5,
, log N, N log (N2
), 4logN
, N
Indicate which functions grow at the same rate. Recall that a function f(N) grows at the same
rate as function g(N) if f(N) = Θ(g(N)).
3. (8 points) (from Weiss 2.2) You do not need to prove an item is true (just saying true is
enough for full credit), but you must give a counter example in order to demonstrate an item
is false if you want full credit. To give a counter example, give values for T1(N), T2(N), and
f(N) for which the statement is false.
Suppose T1(N) = O(f(N)) and T2(N) = O(f(N)). Which of the following are true?
a. T1(N) + T2(N) = O(f(N))
b. T1(N) – T2(N) = o(f(N))
c. T1(N) / T2(N) = O(1)
d. T1(N) = O(T2(N))
4. (10 points) (adapted from Weiss 2.7) Give the Big-Oh for each of the following code
excerpts. For parts (a) – (c), verify your Big-Oh doing a precise algorithm analysis, using
summations and reducing to closed forms as demonstrated in class. You may want to refer to
section 1.2.3 in the book for series formulas. For full credit, show your work of how you
used summations to reduce to closed form. For part (d), give a brief explanation as to how
you came up with your Big-Oh.
sum = 0;
for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { sum++; sum++; } } b) sum = 0; for (i = 1; i <= n; i++) { for (j = 1; j <= 3 * i; j++) { sum++; } for (k = 1; k <= 100000; k++) { sum++; } } c) sum = 0; for (i = 1; i <= n; i++) { for (j = 1; j <= i * i; j++) { sum++; } } d) sum = 0; for (i = 1; i <= n; i++) { for (j = 1; j <= i * i; j++) { if (j % i == 0) { for (k = 1; k <= j; k++) { sum++; } } } } 5. (12 points) (a) Write the following Java method (your code should probably be under twenty lines): public static int firstNonSmallerIndex(int[] array, int value) The method takes in an array in sorted order and a value, and returns the smallest possible index of an element that is equal to or larger than the given value (or -1 if the value is larger than the max). Your method must run in O(log N) time provided the list has few duplicates. Assuming array = {1,2,3,3,3,4,5,5,14,17}, here are some example calls: Method call Return value firstNonSmallerIndex(array, 3) 2 firstNonSmallerIndex(array, 4) 5 firstNonSmallerIndex(array, -1) 0 firstNonSmallerIndex(array, 23) -1 firstNonSmallerIndex(array, 15) 9 Hint: Your code will look similar to binary search. Once you have found one non-smaller index, it doesn't mean that it is the first non-smaller index. In other words, you should keep on searching until you are sure you have found the first non-smaller index. (b) After implementing your method in Java and ensuring that it is correct, run timing tests on your method with arrays of different sizes. Use the method createRandomSortedArray (shown later) and System.nanoTime() (see http://docs.oracle.com/javase/6/docs/api/java/lang/System.html#nanoTime%28%29) to help you create random sorted arrays and run your timing tests. Answer the following questions: • What array sizes did you choose and why? • What were the runtimes of each array size? • Did your runtimes increase as you expected according to the Big-Oh of your algorithm? Why or why not? For part (a), your firstNonSmallerIndex method should be found in a class named FirstNonSmaller and should be saved in a file named FirstNonSmaller.java. Turn in FirstNonSmaller.java electronically by submitting it to the turn-in link on the homework webpage. For part (b), you can save the code/methods you use to do your timing tests in FirstNonSmaller.java–we will not grade your timing code. However, we will grade your answers to the questions above. Save your answers in a file named README.txt and also submit that file using the same turn-in link on the homework webpage. import java.util.*; .... public static int[] createRandomSortedArray(int size) { Random rand = new Random(); int[] array = new int[size]; for (int i = 0; i < size; i++) { // pick random numbers (subtract a bit so that some // are negative) array[i] = rand.nextInt(size * 3) - size / 4; } Arrays.sort(array); return array; }