Java 这个算法的时间复杂度是多少
我对竞争性编程和大O符号非常陌生Java 这个算法的时间复杂度是多少,java,algorithm,big-o,Java,Algorithm,Big O,我对竞争性编程和大O符号非常陌生 public void function(int n){ for(int i = n; i > 0; i/=3){ for(int j = 0; j < i; j++){ System.out.println("Hello"); } } } 公共无效函数(int n){ 对于(int i=n;i>0;i/=3){ 对于(int j=0;j0;i/=3){ 对于(int
public void function(int n){
for(int i = n; i > 0; i/=3){
for(int j = 0; j < i; j++){
System.out.println("Hello");
}
}
}
公共无效函数(int n){
对于(int i=n;i>0;i/=3){
对于(int j=0;j
这就是算法。
据我所知,时间复杂度定义了输入数量对运行时间的影响
这里我们举个例子
如果n是10。
外循环运行logn次,内循环运行'i'次
内部循环相对于“i”而不是“n”运行。
所以我在这里有点困惑,时间复杂度是如何计算的。
我想是O(对数n)。如果我错了,请纠正我
它是O(logn)还是O(logn)或(n^2)。
请帮我解决这个问题。
谢谢。在您的代码片段中:
for (int i=0; i < n; i*=3) {
for (int j=0; j < i; j++) {
System.out.println("Hello");
}
}
实际上,它永远不会终止,因为
i=0
而更新是i*=3
所以i
将保持0
,所以我们可以说O(+oo)
假设你的意思是(inti=1…),那么它的O(n)
:
- 外环显然是
因为我们一直在乘以3O(log_3n)
- 内部循环将执行
次,迭代次数为O(log\u 3 n)
,这显然是一个几何级数,通过求解,我们得到了大约(1+3+9+27+…+3^log\u 3(n))
,根据日志规则,它给出了3^log\u 3(n))
,因此这个循环对所有迭代都采用n
,所以总的复杂性是O(n)
O(n)
- 我会尽量用最简单的术语来解释
外部循环将简单地以基数运行log(n)3次
因为,i每次减少3倍。完成的总工作量等于:
n+n/3+n/9+n/27+。。。。n/(3^log(n))
自,n/3+…+n/(3^log(n))将始终小于n
例如,设n=100
然后,100+100/3+100/9+100/27+…=100+(33.3+11.11+3.7+…)
我们可以清楚地看到括号中的术语总是小于100
整个解决方案的总时间复杂度为O(n)。对于您的代码:
for(int i = n; i > 0; i/=3){
for(int j = 0; j < i; j++){
System.out.println("Hello");
}
for(int i=n;i>0;i/=3){
对于(int j=0;j
}
内循环变量j依赖于外循环变量i,因此内循环将决定算法的复杂性。
由于j将在第一次运行时运行“n”次,在第二次运行时运行“n/3”次,依此类推。。因此,您的总复杂性可以计算为
n+n/3+n/9+n/27+.
导致O(n)所以这是一个很好的问题!这是一个需要更多思考才能分析的棘手问题 正如在其他一些答案中正确指出的,外环:
for(int i = n; i > 0; i/=3)
将运行日志(n)次。特别是log_3(n)次,但在大O表示法中,我们通常不担心基数,所以log(n)可以
现在嵌套循环有点棘手:
for(int j = 0; j < i; j++){
for(int j=0;j
乍一看,您可能认为这是一个简单的log(n)循环,但让我们看得更远一点。
在第一次迭代中,它将运行N次,因为i的值是N。下一次迭代将运行N/3次。然后N/9,N/27,N/81等等
如果我们对这个系列求和,很明显它的总数将小于2n。
因此,我们可以得出该算法的复杂度为O(n).代码中似乎有错误。变量i用0初始化,0乘以3将保持为0。它被卡在无限循环中。是的,感谢您指出代码中有一个轻微错误。请查看更新版本@Photon。在您的回答的后面部分,我相信您正在描述内环。我说得对吗?是的,在内环的第一次迭代中完成了n个功,在内环的第二次迭代中完成了n/3,依此类推……事实上,内环的总迭代次数似乎是~n*k/(k-1)(k是日志的基础)一些数学事实:
1+1/3+1/9+…=3/2
是的,我们可以使用GP求和公式得到这个结果。一些数学事实:1+1/3+1/9+…=3/2
for(int j = 0; j < i; j++){