棘手的Big-O复杂性 public void foo(int n,int m){ int i=m; 而(i>100){ i=i/3; } 对于(int k=i;k>=0;k--){ 对于(int j=1;j,是的。但是如果你使用大整数,那就不太好了,因为加法和乘法不再是O(1)

棘手的Big-O复杂性 public void foo(int n,int m){ int i=m; 而(i>100){ i=i/3; } 对于(int k=i;k>=0;k--){ 对于(int j=1;j,是的。但是如果你使用大整数,那就不太好了,因为加法和乘法不再是O(1),big-o,asymptotic-complexity,Big O,Asymptotic Complexity,我估计复杂性是O(logn)。 也就是说,作为内循环的产物,外循环的执行次数永远不会超过100次,因此可以省略它 我不确定的是while子句,它是否应该合并到Big-O复杂性中?对于非常大的i值,它可能会产生影响,或者算术运算,不管在什么尺度上,都算作基本运算,可以省略?复杂度为O(logm+logn) while循环执行log3(m)次-一个常量(log3(100))。外部for循环执行固定次数(大约100次),而内部循环执行log2(n)次。而循环是O(logm),因为你一直用m除以3,直到

我估计复杂性是O(logn)。
也就是说,作为内循环的产物,外循环的执行次数永远不会超过100次,因此可以省略它

我不确定的是while子句,它是否应该合并到Big-O复杂性中?对于非常大的i值,它可能会产生影响,或者算术运算,不管在什么尺度上,都算作基本运算,可以省略?

复杂度为O(logm+logn)


while循环执行log3(m)次-一个常量(log3(100))。外部for循环执行固定次数(大约100次),而内部循环执行log2(n)次。

循环是
O(logm)
,因为你一直用
m
除以
3
,直到它小于或等于
100

因为在你的例子中100是一个常数,所以可以忽略它,是的

正如你所说,内部循环是
O(logn)
,因为你将
j
乘以
2
,直到它超过
n

因此,总复杂度为
O(logn+logm)

或者算术运算,不管在什么尺度上,都算作基本运算,可以省略


是的,算术运算通常可以省略。然而,这也取决于语言。这看起来像Java,看起来像是在使用基本类型。在这种情况下,可以考虑算术运算<代码> o(1)< /代码>,是的。但是如果你使用大整数,那就不太好了,因为加法和乘法不再是O(1)

while循环将m的值除以3的因子,因此这样的运算的数量将是log(base 3)m

对于For循环,您可以将操作数视为2个求和-

求和(k=0到i)[求和(j=0到lg n)(1)] 求和(k=0到i)[lg n+1] (lg n+1)(i+1)将是以对数项为主的操作总数

这就是为什么复杂性是O(log(base3)m+lgn)
在这里,lg指的是登录到base 2

+1,用于标记作业和诚实!while计数——是O(log m)@Sekhat:同意,我也给了他+1:)你能解释一下为什么要加O(log(base3)m+lgn)为什么它们不相乘吗?我认为应该是log(base3)m+(log(base3)m*lgn)
public void foo(int n, int m) {
    int i = m;

    while (i > 100) {
        i = i / 3;
    }
    for (int k = i ; k >= 0; k--) {
        for (int j = 1; j < n; j *= 2) {
            System.out.print(k + "\t" + j);
        }
        System.out.println();
    }
}