Lab 07 - Recurrences
1. Basic algorithms
1.1 Based on the following code for Bubble-sort, analyze the algorithm's time complexity:
void bubbleSort(int arr[], int n) { int i, j, temp; for(i = 0; i < n - 1; i++) { for(j = 0; j < n - i - 1; j++) { if(arr[j] > arr[j + 1]) { // swap the elements temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }
1.2 Based on the following code for Selection sort, analyze the algorithm's time complexity:
void selectionSort(int arr[], int n) { int i, j, min_idx, temp; for (i = 0; i < n - 1; i++) { min_idx = i; for (j = i + 1; j < n; j++) if (arr[j] < arr[min_idx]) min_idx = j; // swap the min element with the first element temp = arr[min_idx]; arr[min_idx] = arr[i]; arr[i] = temp; } }
2. Simple Recurrences
Consider the following search algorithm of a value v in a sorted array arr:
int search(int arr[], int lo, int hi, int v) { int mid = (lo + hi) / 2; if (arr[mid] == v) return mid; if (lo == hi) return -1; if (arr[mid] > v) return search(arr, lo, mid, v); else return search(arr, mid, hi, v); }
2.1 Determine the recurrence for the search algorithm above.
2.2 Solve the recurrence using the Master Method.
2.3 Solve the recurrence using the Trees Method.
2.4 Solve the recurrence using the Substitution Method.
3. More recurrences
Consider the following modification to 'search' (which may not make sense in practice):
int search(int arr[], int lo, int hi, int v) { if (!is_sorted(arr, lo, hi)) return -1; int mid = (lo + hi) / 2; if (arr[mid] == v) return mid; if (lo == hi) return -1; if (arr[mid] > v) return search(arr, lo, mid, v); else return search(arr, mid, hi, v); }
3.1 In what time can we check if an array is sorted?
3.2 What is the new recurrence for search?
3.3 Solve the recurrence, using all three methods.
4. Atypical situations when solving recurrences
4.1 Substitution method does not work. Solve $ T(n) = 2 T($ $ n \over 2$ $ ) + 1$ .
4.2 Un-balanced trees. Solve via the tree and substitution methods: $ T(n) = T($ $ n \over 4$ $ ) + T($ $ 3n \over 4$ $ ) + n$ .
4.3 Solve $ T(n) = 2 T($ $ n \over 2$ $ ) + n ^ 2$ .
4.4 Look up the Hanoi towers problem. Determine the number of steps necessary to solve it.
4.5 Consider the following algorithm:
int fibo(int n) { if (n <= 1) return n; return fibo(n - 1) + fibo(n - 2); }
Determine its complexity with regard to the size of the input.
4.6 Solve $ T(n) = \sqrt n * T(\sqrt n) + n$ .