Someone asked me a brainteaser, and I don’t know; my knowledge slows down after amortized analysis, and in this case, this is O(n).
public int findMax(array) {
int count = 0;
int max = array[0];
for (int i=0; i<array.length; i++) {
if (array[i] > max) {
count++;
max = array[i];
}
}
return count;
}
What’s the expected value of count for an array of size n?
Numbers are randomly picked from a uniform distribution.
Let f(n) be the average number of assignments.
Then if the last element is not the largest, f(n) = f(n-1).
If the last element is the largest, then f(n) = f(n-1) + 1.
Since the last number is largest with probability
1/n, and not the largest with probability(n-1)/n, we have:Expand and collect terms to get:
And f(1) = 0. So:
That is, f(n) is the n_th “Harmonic number”, which you can get in closed form only approximately. (Well, one less than the n_th Harmonic number. The problem would be prettier if you initialized
maxtoINT_MINand just let the loop run, so that f(1) = 1.)The above is not a rigorous proof, since I was sloppy about expected values versus actual values. But I believe the answer is right anyway :-).