Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 3个嵌套for循环的大O? public int循环(int[]数组1){ int结果=0; for(int i=0;i_Java_Big O_Complexity Theory - Fatal编程技术网

Java 3个嵌套for循环的大O? public int循环(int[]数组1){ int结果=0; for(int i=0;i

Java 3个嵌套for循环的大O? public int循环(int[]数组1){ int结果=0; for(int i=0;i,java,big-o,complexity-theory,Java,Big O,Complexity Theory,我试图找到计算算术运算次数的复杂度函数。我知道复杂性类应该是O(n^3),但我在计算步骤时遇到了一些麻烦 到目前为止,我的推理是我计算的算术运算数是8,那么复杂度函数就是8n^3吗 任何正确方向的指导都将不胜感激,谢谢 如果我们能同意以下是一大步: result+=j*j*array1[k]+array1[i]+array1[j] 然后我们将其称为递增结果 这里调用了多少次递增结果?(日志n) for(int k=1;k

我试图找到计算算术运算次数的复杂度函数。我知道复杂性类应该是O(n^3),但我在计算步骤时遇到了一些麻烦

到目前为止,我的推理是我计算的算术运算数是8,那么复杂度函数就是8n^3吗


任何正确方向的指导都将不胜感激,谢谢

如果我们能同意以下是一大步:
result+=j*j*array1[k]+array1[i]+array1[j]
然后我们将其称为递增结果

这里调用了多少次递增结果?(日志n)

for(int k=1;k
让我们称之为loop3。那么这里调用了多少次loop3?(n)

for(int j=0;j
让我们称之为loop2。那么,loop2在这里调用了多少次?(n)

for(int i=0;i

将所有这些值相乘,您将得到答案:)

第一个循环将运行
n
次,第二个循环将运行
n
次,而第三个循环将运行
log(n)
次(基数2)。由于每次都是将
k
乘以2,因此逆操作是获取日志。乘以我们得到了O(n^2 log(n))

,这取决于循环。例如:

for (int i = 0; i < array1.length; i++) {
  // loop 2
}
for(int i=0;i<10;i++){
对于(int j=0;j<10;j++){
对于(int k=0;k<10;k++){
总和+=i*j*k;
}
}
}
复杂度为O(1),因为迭代次数根本不依赖于输入

或者这个:

for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        for (int k = 0; k < 10; k++) {
            sum += i * j * k;
        }
    }
}
for(int i=0;i
是O(n^6),即使存在单个循环

真正重要的是每个循环进行多少次迭代

在您的例子中,很容易看到最内层循环的每个迭代都是O(1)。有多少次迭代?在达到n之前,需要将数字加倍多少次?如果x是迭代次数,我们将在第一个x退出循环,这样k=2^x>n。你能为x解这个问题吗

第二个循环的每次迭代都会这样做,因此第二个循环的成本是迭代次数(这一次更容易计算)乘以内部循环的成本

第一个循环的每次迭代都会这样做,所以第一个循环的成本是迭代次数(也很容易计算)乘以第二个循环的成本


总的来说,运行时是3个数字的乘积。你能找到它们吗?

你确定复杂性是
O(n^3)
?我的意思是,当然,它会在
O(n^3)
中,就像在
O(n!)
中一样,但这并不是最严格的限制。嗯,我的意思是,我们在课堂上被教的方法是计算步数(算术运算),然后计算每个运算需要做多少次,所以我就是这样想出了O(n^3)。但我肯定可能错了。我还遵循了这样一种逻辑,即2个嵌套for循环通常与我目前所做的相比是O(n^2)。仔细考虑一下最里面的
ForUpdate
中的
k=k*2
。啊,好的!这对于复杂性类来说是有意义的。为了计算精确的运算,那么函数就是f(n)=8n^2 log(n)对吗?
for (int j = 0; j < array1.length; j++) {
  // loop 3
}
for (int i = 0; i < array1.length; i++) {
  // loop 2
}
for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        for (int k = 0; k < 10; k++) {
            sum += i * j * k;
        }
    }
}
for (int i = 0; i < n*n*n*n*n*n; i++) {
    sum += i;
}