Section Analysis of Algorithm with Big Oh Preview of section I. Code demo Binary Search and run CompareSearches.java with Sequential Search II. As a section, count the instructions together III. In teams of two, answer questions 1..4 IV. Go over answers

I. Write method public int binarySearch(Integer[], int n, Integer search) to return the integer index of search or -1 of search is not in the array. Program to run with the method written as a method stub is located here. Run with n = 10,000 50,000 150,000. http://www.cs.arizona.edu/~mercer/Sections/CompareSearches.java

II. Count the instructions. The answer should be a polynomial (several answers are possible depending on how things are counted).

double[] data = { 76.0, 91.0, 100.0, 62.0, 89.0 };

int n = data.length;

int indexOfSmallest = 0;

for (int left = 0; left < n - 1; left++) {

indexOfSmallest = left;

for (int index = left + 1; index < n; index++) { if (data[index] < data[indexOfSmallest]) indexOfSmallest = index; }

double temp = data[left]; data[left] = data[indexOfSmallest]; data[indexOfSmallest] = temp; }

III. In teams of two, answers questions 1..4

1. Sort these functions by order of growth from highest to lowest. Write 1 above the fastest growing function, 2 above the second fastest growing function, and 8 above the slowest growing function. (Note: log24 = 2, log28 = 3 and log216 = 4)

2 n n 3 100*n n 1000 2 10 n 2*n log2n

2. Which term dominates this function when n gets really big, n2, 10n, or 100? ______

n2 + 10n + 100

3. When n=500 in the function above, what percentage of the function is the term 100? _____ Before answering question 4, here is a review of order of magnitudes in increasing growth rates: O(1) O(log n) O(n) O(n log n) O(n2) O(n3) O(2n)

… and some example big-O run times:

O(1) O(log n) O(n) int sum = 0; for(int j = n; j > 0; j = j / 2) for(int j = 1; j <= n; j++) sum += j; sum += j;

O(n2) product O(n) sum for(int r = 0; r < n; r++) for(int j = 1; j <= n; j++) for(int c = 0; c < n; c++) sum += j; sum += a[r][c]; for(int j = 1; j <= 2*n; j++) sum += j;

And some big-O style guidelines

 use highest order term (drop lower order terms)  Drop coefficients and drop constants  Use the tightest upper bound. It could be said that most algorithms run O(2n), a function that grow very fast. But use the tightest upper bound instead.

4. Determine the runtimes of the following loops expressed in big-O notation a. ______d. ______int sum = 0; for(int j = 0; j < n; j++) int n = 1000000; sum++; for(int k = 0; k < n; k++) sum--; b. ______int sum = 0; e. ______for (int j = 0; j < n; j++) for(int j = 0; j < n; j++) for (int k = 0; k < n; k++) System.out.println(x [ j ]); sum += j * k; c. ______for (int j = 0; j < n; j++) f. ______for (int k = 0; k < n; k++) for(int j = 1; j < n; j = 2 * j) for (int l = 0; l < n; l++) sum += j; sum += j * k * l;

IV Go over answers