You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求分析给定搜索代码的时间复杂度,曾尝试二分法存疑

代码时间复杂度分析与二分法疑问解答

嘿,我来帮你拆解这段代码的时间复杂度,顺便解决你关于二分法的困惑~

时间复杂度结论

这段代码的时间复杂度是 O(log n),它本质上就是一个二分查找的实现,只是写法和常见的“找到目标立即返回”的二分法略有不同,但核心逻辑完全一致。

代码逻辑与复杂度推导

先来看这段代码的核心逻辑:

#include<bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin>>n;
    int a[n]; // 注:C++标准不支持变长数组,建议用vector<int> a(n)替代
    for(int i=0;i<n;i++)
        cin>>a[i];
    int x;
    cin>>x;
    int p=-1;
    int q=n;
    while(p+1<q) {
        int m=(p+q)/2;
        if(a[m]<x)
            p=m;
        else
            q=m;
    }
    cout<<"j";
}
  1. 查找范围的初始化:p=-1、q=n,相当于把初始查找范围设定为数组的整个索引区间 [0, n-1](因为有效区间是 p+1 到 q-1)。
  2. 循环的核心逻辑:每次循环计算中间位置 m=(p+q)/2,通过比较 a[m] 和目标值 x,将查找范围缩小一半:
    • 如果 a[m] < x,说明目标值在 m 的右侧,于是把 p 更新为 m;
    • 否则说明目标值在 m 或其左侧,把 q 更新为 m。
  3. 复杂度推导:每次循环都会将查找范围的长度减半,从初始的 n 缩小到 1 时循环结束,循环次数是 log₂n 级别,因此时间复杂度为 O(log n)。

关于二分法的疑问解答

你提到“尝试用二分法求解,但认为无法通过该方法实现”,其实这段代码就是标准的二分查找变种——它的作用是在有序数组中找到第一个大于等于 x 的元素的位置(循环结束后 q 的值就是这个位置)。这种写法没有直接在找到目标时返回,而是通过不断缩小范围来定位最终位置,本质还是二分法的核心思想:每次排除一半的无效元素,所以时间复杂度依然是对数级的。

内容的提问来源于stack exchange,提问作者ARCHANA YADAV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:00:51