求下述函数的最坏情况时间复杂度(大O表示法)并说明原因
分析test函数的最坏情况运行时间(大O表示法)
先直接给结论:这个函数的最坏情况运行时间是 O(n)。下面一步步拆解原因:
首先把代码规整一下方便分析(假设缺失的变量声明补全,内部省略的操作都是O(1)的基础操作):
void test(int n) { int counter = 0; for(int i=0; i<5000; ++i){ counter += i; // 第一个内层循环 for(int j=0; j<n; ++j){ // 此处为O(1)的操作 } // 第二个内层循环 for(int k=0; k<i; ++k){ // 此处为O(1)的操作 } } }
接下来拆解每一部分的时间开销:
- 外层循环:这是固定的5000次迭代,不管输入规模n的值是多少,这个循环的次数都是常数,不会随n变化。
- 第一个内层循环:每次外层循环都会执行n次,总操作次数是
5000 * n。在大O表示法中,常数系数会被忽略,所以这部分的时间复杂度是O(n)。 - 第二个内层循环:迭代次数跟着i变化,i从0到4999,总次数是等差数列求和:
0 + 1 + 2 + ... + 4999 = (4999 * 5000)/2,这是一个固定的常数(约1250万次),不管n怎么变化,这部分的操作数都不会改变,属于O(1)的量级。
大O表示法核心关注的是随着输入规模增长时的性能趋势,我们只需要看占主导地位的项。这里O(n)的项会随着n的增大持续增长,而O(1)的常数项和外层的常数循环次数都不会影响这个趋势。因此整个函数的最坏情况时间复杂度就是O(n)。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

