GESP 四级 · GESP 202512 C++ 四级 第 13 题

选择题 · 答案 B · 考点:时间复杂度分析

← 整套速查表 GESP 四级 全部真题

题目

给定如下算法,其时间复杂度为( )。

bool f(int arr[], int n, int target) {
    for (int i = 0; i < n; i++) {
        int sum = 0;
        for (int j = 0; j < n; j++) {
            if (i & (1 << j)) {
                sum += arr[j];
            }
        }
        if (sum == target) return true;
    }
    return false;
}
答案:B

考点

时间复杂度分析

解题思维

答案B。在循环中遍历数组并累积结果时,注意累加变量的初始值和每次循环的更新方式。

常见错误

for循环体可能一次都不执行!这是和while循环一样的"先判断后执行"机制。

详细解析(节选)

【考点】时间复杂度|循环嵌套

GESP四级算法模块第3章,考查基础循环嵌套复杂度分析。命题人用双层循环卡住只会算单层或误判指数级的考生,这是入门算法的必考门槛。时间复杂度是算法分析的核心,必须熟练掌握基本循环的阶乘关系。

双层循环嵌套,内层循环执行次数恒为n,外层循环执行n次,总操作量≈n×n。通法:数清楚每层循环的迭代次数,相乘即得阶乘级复杂度。若外层循环次数随i变化(如for(int i=0;i<n;i++)),则需累加内层次数,形成更复杂的复杂度。

选项D最阴险,看到1<<j就误判为指数级,但内层循环次数仍固定为n。若只背结论,容易把位运算当成复杂度倍增的钩子。实际上,位运算只是条件判断,不改变循环次数。命题人喜欢在细节处埋雷,考生必须分清循环次数和条件判断。

若把内层循环改为for(int j=0;j<i;j++),复杂度仍为O(n^2);若改成for(int j=0;j<(1<<i);j++),则变O(2^n)。刷题前先问自己:循环次数到底是多少?如果循环次数是指数级,那么总复杂度就是指数级乘以n,即O(n·2^n)。但本题内层循环次数固定为n,所以是O(n^2)。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断