Java 3个嵌套for循环的大O? public int循环(int[]数组1){ int结果=0; for(int i=0;i
我试图找到计算算术运算次数的复杂度函数。我知道复杂性类应该是O(n^3),但我在计算步骤时遇到了一些麻烦 到目前为止,我的推理是我计算的算术运算数是8,那么复杂度函数就是8n^3吗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
任何正确方向的指导都将不胜感激,谢谢 如果我们能同意以下是一大步:
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;
}