Java fnB中大O符号的执行时间是多少?

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的时间复

我有两个函数,我需要在大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的时间复杂度可以认为是O(n^2),因为它有两个嵌套的
for
循环。但是,由于条件
i
fnA
的运行时间是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;
}