Java fnB中大O符号的执行时间是多少?
我有两个函数,我需要在大O中找到这两个函数的执行时间,但是我对fnB感到困惑Java fnB中大O符号的执行时间是多少?,java,big-o,Java,Big O,我有两个函数,我需要在大O中找到这两个函数的执行时间,但是我对fnB感到困惑 int fnA(int n){ int sum = 0; for(int i=0; i<n; i++){ for(int j=n; i<j; j=j-2){ sum += i*j; } return sum; } intfna(intn){ 整数和=0; for(int i=0;iBig-O表示法可用于表示算法的时间复杂度或空间复杂度 在您的程序中,函数fnA的时间复
int fnA(int n){
int sum = 0;
for(int i=0; i<n; i++){
for(int j=n; i<j; j=j-2){
sum += i*j;
}
return sum;
}
intfna(intn){
整数和=0;
for(int i=0;iBig-O表示法可用于表示算法的时间复杂度或空间复杂度
在您的程序中,函数fnA的时间复杂度可以认为是O(n^2),因为它有两个嵌套的for
循环。但是,由于条件ifnA
的运行时间是O(n2)
然而,fnB
的运行时间为O(n2logn),因为它有log2n次迭代,每次迭代都需要O(n2)时间(实际上需要O(size2),但是由于size
n
,我们可以将其与O(n2)绑定)
更详细的解释是:
fnA(n)
在外循环中有n
迭代,在内循环中最多有n/2
迭代,这给出了O(n2)上界。由于fnB(n)
的每次迭代调用fnA(size)
,它需要O(size2)==O(n2)(因为大小n
)
现在,fnB(n)
的循环将以下值分配给size
:20,21,22,…,2k,其中2k Big-O表示法是关于计算复杂性,而不是执行时间。对于fnA,它实际上是O(n)。您的内部For循环将永远不会执行。抱歉,我在我的代码中犯了一些错误(int j=0;我把它改为j=n你能指出logn迭代的来源吗,不应该是2^n吗?@stevielol size得到以下值:2^0,2^1,2^2,…,2^k,其中2^k还有一个问题,你如何得到每次迭代都需要O(n^2)时间?很抱歉这个愚蠢的问题question@stevielol这是一个上限。fnA(n)在外循环中有n次迭代,在内循环中最多有n/2次迭代,这给出了O(n^2)的上界。由于fnB的每次迭代调用fnA(大小),它取O(大小^2)=O(n^2)(大小fnA
是O(n^2)
,同意,但fnB
是O(1^2)+O(2)+O(4^2)++O(n^2)
,它减少到O(n^2)
,因为当n
向无穷远处移动时,所有较低的平方变得可以忽略。--例如,如果n=256
,那么logn
是8,那么如果fnB
是O(n^2logn)
,正如你所说的,那么它将是O(n^2*32)
,但那不是真的。我已经编辑了我的代码,现在结果应该不同了。现在时间复杂度是O(n^3)。
int fnB(int n) {
int sum =0;
for(int size = 1; size<n; size=2*size){
sum+=fnA(size);
}
return sum;
}