问题描述:
这是今年微软的一道面试题,考究的要点,仍然是我之前博文【面试中的概率问题-数学期望】中提到的数学期望的递归特性。
给定一个数组arr[0..N-1],其中每个元素值均不相同,让你求最小值,一个非常典型的做法是这样的:
int minVal= MAXINT;
for (i = 0;i < N; i ++) {
if (arr[i] < minVal) minVal =arr[i];
}
现在问你,minVal = arr[i]的执行次数的期望是多少?
问题分析:
依旧使用数学期望中的递归特性来解决这个问题。我们令数组元素个数为n时,对应的数学期望为f(n)。
那么f(n)可以进行如下分解:
如果最小值是arr[0],概率为1/n,执行次数为1次
如果最小值是arr[1],概率为1/n,执行次数为1次+f(1)
如果最小值是arr[i],概率为1/n,执行次数为1次+f(i)
…
如果最小值是arr[n-1],概率为1/n,执行次数为1次+f(n-1)
综上f(n) = (1/n)*((1) +(1+f(1)) + (1+f(2)) + … + (1+f(n-1))),化简后为
f(n) = (0+f(1)+f(2)+…+f(n-1))/n+ 1
如果我们令f(0) = 0,那么
f(0) = 0
f(n) = (f(0)+f(1)+f(2)+…+f(n-1))/n+ 1
最终可以得到:f(n) = 1 + 1/2 + 1/3 + … + 1/n
最终答案:
f(n) = 1 + 1/2 + 1/3 + … + 1/n