Java 这个算法的时间复杂度是多少

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

我对竞争性编程和大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;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)

  • 外环显然是
    O(log_3n)
    因为我们一直在乘以3
  • 内部循环将执行
    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++){