两个 for 循环的 O(f(n))
O(f(n)) for two for loops
第一个循环会给出 O(n),但第二个循环会永远 运行,不是吗?这是否意味着整体 O(n) 只是 O(n) 还是内部 for 循环算作不仅仅是一个常数?
for (int i=0; i<n; i++) {
for (int j=0; j<=42; j--) {
System.out.println(i+j);
}
}
System.out.println
表示这是Java。
在Java中,int
类型为32位有符号整数类型,取值范围为-2,147,483,648到2,147,483,647。减少已经处于最小值的变量会将其环绕到最大值。
这意味着在变量 j
回绕、变得大于 42
并终止内循环之前,内循环将 运行 迭代 2,147,483,648 次。因此,内部循环不是无限的,如问题中所示,而是有限且恒定的。
由于内循环总是执行这么多步骤,所以它是恒定的,因此 big-o 符号完全由外循环决定。
所以这段代码的 big-o 表示法是 O(n).
如果可以将 compiler/runtime 配置为在您尝试对 int
进行下溢时崩溃,而不是将其回绕,程序将始终崩溃,并且它将设法仅 运行 在内循环结束时崩溃之前外循环的 1 次迭代。因此它将是 O(1)。但是,我了解的不够Java,所以我不知道这是否可行。
如果不是 Java,这应该是在另一种理论编程语言的上下文中,或者被视为纯算法描述,其中 int
实际上没有下限, 然后程序不会终止,实际上 根本没有 大 O 符号。
关于最后一段的更多信息:O-notation, O(∞) = O(1)?。
第一个循环会给出 O(n),但第二个循环会永远 运行,不是吗?这是否意味着整体 O(n) 只是 O(n) 还是内部 for 循环算作不仅仅是一个常数?
for (int i=0; i<n; i++) {
for (int j=0; j<=42; j--) {
System.out.println(i+j);
}
}
System.out.println
表示这是Java。
在Java中,int
类型为32位有符号整数类型,取值范围为-2,147,483,648到2,147,483,647。减少已经处于最小值的变量会将其环绕到最大值。
这意味着在变量 j
回绕、变得大于 42
并终止内循环之前,内循环将 运行 迭代 2,147,483,648 次。因此,内部循环不是无限的,如问题中所示,而是有限且恒定的。
由于内循环总是执行这么多步骤,所以它是恒定的,因此 big-o 符号完全由外循环决定。
所以这段代码的 big-o 表示法是 O(n).
如果可以将 compiler/runtime 配置为在您尝试对 int
进行下溢时崩溃,而不是将其回绕,程序将始终崩溃,并且它将设法仅 运行 在内循环结束时崩溃之前外循环的 1 次迭代。因此它将是 O(1)。但是,我了解的不够Java,所以我不知道这是否可行。
如果不是 Java,这应该是在另一种理论编程语言的上下文中,或者被视为纯算法描述,其中 int
实际上没有下限, 然后程序不会终止,实际上 根本没有 大 O 符号。
关于最后一段的更多信息:O-notation, O(∞) = O(1)?。