note[6]
例:求以下错误的二分代码的平均时间复杂度。 来源
$1 \le s \le n \le 10^4$ 。
#include<bits/stdc++.h>
using namespace std;
int l=1,r=10000,mid;
int main()
{
int n; cin>>n; r=n;
int s,cnt=0; cin>>s;
while(l<=r)
{
++cnt;
mid=(l+r)/2;
if(mid==s) break;
else if(mid>s) r=mid-1;
else ++l; // here is wrong
}
printf("%d\n",cnt);
return 0;
}
解:
首先不难发现最坏有 $T(n) = O(n)$
考虑正常的分析。
可以发现最右边的那个东西有个 $\frac{n^2}{n} = n$ 的大小
所以已经有个 $O(n)$ 了,因此平均复杂度为 $O(n)$ 。
说实话我感觉有点怪怪的,但是答案是这个。有待研究。