以下功能的时间复杂度是多少?
void function(int n){
for(int i=0; i<n; i++){. //n times
for(int j=i ; j< i*i; j++){ // n*n times
if(j%i == 0){
for(int k=0; k<j; k++){ // j times = n * n times.
++counter;
}
}
}
}
}
书上写着O(n^5)
。但我无法理解为什么书没有考虑j%i
。 k
循环基于此确定。你能说清楚吗?
答案 0 :(得分:1)
让我们考虑你怀疑的代码部分:
for(int j=i ; j< i*i; j++)
{
if(j%i == 0)
{
for(int p=0; p<j; p++){
++counter;
}
}
让我们分析这部分代码。
对于每i
j%i==0
,只要j
是i
的倍数, i, 2i, 3i, .... i*i // upto i*i only,since j<i*i
就为真,即
j
现在,对于每个O(j)
,内部复杂度为O(n*n^3)
。
这部分代码的复杂性是:
因此,总体复杂度= O(n^4)
= function.php
答案 1 :(得分:1)
实际上函数在时间O(n ^ 4)中运行,因为if
条件每n个循环只发生一次。请参阅下面的精确分析。
void function (int n) {
for(int i=0; i<n; i++) {
// Runs a total of n times
for(int j=i; j< i*i; j++) {
// Runs a total of (n^3 - n)/3 = O(n^3) times
if(j%i == 0) {
// Runs a total of (n^2 - n)/2 = O(n^2) times
for(int k=0; k<j; k++) {
// Runs a total of (3n^4 - 10n^3 + 9n^2 - 2n)/24 = O(n^4) times
++counter;
}
}
}
}
}