Java 这个算法的大o表示法是什么?

Java 这个算法的大o表示法是什么?,java,time-complexity,big-o,Java,Time Complexity,Big O,对于由循环中N的乘法组成的算法,大o表示法是什么 void testing(int n) { for(int i =0; i<n;i++) { n=n*2; System.out.println("hi"+n); } } 无效测试(int n){ 对于(inti=0;i我尝试在IDE中运行您的代码,发现它是一个无限循环。 算法复杂度仅定义为算法,根据(最常接受的)定义,算法必须终止。当程序不终止时,它不是算法。因此它没有“算法时间复杂度”。

对于由循环中N的乘法组成的算法,大o表示法是什么

void testing(int n) {
    for(int i =0; i<n;i++) {
        n=n*2;
        System.out.println("hi"+n);
    }
}
无效测试(int n){

对于(inti=0;i我尝试在IDE中运行您的代码,发现它是一个无限循环。
算法复杂度仅定义为算法,根据(最常接受的)定义,算法必须终止。当程序不终止时,它不是算法。因此它没有“算法时间复杂度”。

对于我的答案,我会尽量严格

EDIT:忘了说,我们假设每个操作,如比较、赋值和乘法,都有O(1)

简而言之,该算法在大多数情况下都不会终止,因此没有为其定义复杂性。 复杂度是算法成本C的某种上界,表示O(n)复杂度意味着c0。非终止算法的成本是无限的,inf>inf是未定义的

然后,让我们看看为什么您的算法是非终止的:

每次迭代,如果i,我们将继续。但是,每次迭代n将乘以2。在检查循环条件时,我们可以看到i的值与n之间的关系:n=n0x2^i,其中n0n的初始值。
因此,您的算法只会在n0时终止,如果
n
开始为零或负,它将立即结束;这就是O(1)。如果
n
开始为正,它将运行直到
n
溢出,所以我猜…这是一个较慢的O(1)。如果我们假设整数可以任意大,并且
n>0
,那么时间复杂性的概念就不存在了。@WillemVanOnsem我们假设整数可以任意大吗?它实际上会很快溢出。@khelwood:很明显,这都取决于某些假设。例如,如果E将使用<代码> BigInteger < /代码> s,然后添加/减法/乘法不在O(1)中运行。但是如果我们认为int具有固定大小,则严格地说,大量的程序将在O(1)中运行。。例如,因为Java中的数组包含一个具有长度的字段,因此它的大小是有限的,因此求和一个数组最多只能求和2^64个项,因此运行常量。@user2478398这不是为了赋值,只是出于好奇。正如我看到的,如果循环中的n=n/2,它就是o(logn)因为它每次运行时都会使步长变小。所以如果它是乘法,那么每次循环运行时都会增加n。它不是一个无限循环。它将在
n
溢出时结束。您使用了什么
n
?一旦
int
溢出,它会在我的IDE中以
n=1
终止。尝试n=10@Sanjeev Sharma刚刚做了,它不会无限循环
n=10
对我来说,一旦值为
-1610612736
它就会终止,至少当n>=1时是这样。在什么情况下这不会终止?出于时间复杂度的目的,你是否假设没有整数溢出?@Nexevis如果n0>0,这不会终止,正如我