嘘~ 正在从服务器偷取页面 . . .

note[6]


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)$ 。

说实话我感觉有点怪怪的,但是答案是这个。有待研究。


文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录