C 这个算法的时间复杂度更准确的是什么?

C 这个算法的时间复杂度更准确的是什么?,c,algorithm,time-complexity,big-o,C,Algorithm,Time Complexity,Big O,这是我的节目: for(m!=n){ if(m>n) m=m-n; else n=n-m; } 如果我取m=16,n=2,那么循环执行7次。 如果我取m=16,n=12,那么循环执行3次。 如何为该程序提供更准确的时间复杂度,以及计算这种类型算法(其中我们有两个输入)的时间复杂度的过程是什么?假设m,n>0,时间复杂度是O(max(n,m))(或者,等效地,O(n+m)) 理由是: 在每次迭代中,n减少,或者m减少,因此迭代次数不能超过n+m(上

这是我的节目:

 for(m!=n){
   if(m>n)
     m=m-n;
   else 
     n=n-m; 
 }
如果我取m=16,n=2,那么循环执行7次。 如果我取m=16,n=12,那么循环执行3次。
如何为该程序提供更准确的时间复杂度,以及计算这种类型算法(其中我们有两个输入)的时间复杂度的过程是什么?

假设
m,n>0
,时间复杂度是
O(max(n,m))
(或者,等效地,
O(n+m)

理由是:

  • 在每次迭代中,
    n
    减少,或者
    m
    减少,因此迭代次数不能超过
    n+m
    (上限)
  • 我们可以给出一个最坏情况的场景
    n=1
    m=k
    (并且,对称地,
    n=k
    m=1
    ),它精确地给出了
    k
    迭代(下限)

    • 假设你的m和n遵循一定的约束,循环不会进入无限循环。即
      m>0
      n>0
      m=1
      n=0

      如果m>=n

      如果m%n==0,则循环将执行m/n-1次
      
      如果m%n=0
      则循环将执行ceil(m/n)次


      如果m对于时间复杂度没有明确的答案。迭代次数取决于m和n

    • 如果m==n,则循环在1步中退出
    • 如果m==1和n==100,循环将执行100步 所以,如果你保持n不变,继续增加m,你会得到一个循环模式

      下图显示了n=2000和m的迭代次数,范围为1到10000


      你没有证据证明循环会结束

      特别是如果m或n中的任何一个为零,它将永远循环

      因此,时间复杂性是不确定的

      添加约束


      希望这能有所帮助。

      对于
      m=1
      n=0
      来说,时间复杂度似乎是无限的,所以如果不指定更多的约束,那么很难回答。Big-O通常只适用于可以被证明是终止的算法。不要接受无效的输入,就像我想计算非常大的输入的时间复杂度(就像我们通常做的那样)比如n和mIf在任何情况下,某些代码不终止,其复杂度是不确定的。说“忽略无效输入”并不能改变这一点。如果
      m
      n
      是有符号整数类型,并且有相反的符号(例如,一个是正的,另一个是负的),则循环也将有未定义的行为。我投票结束这个问题,因为它正在寻找答案,而答案是不确定的。
      o(m/n)
      可以等于
      o(n)
      ?@deniss这句话正确吗?这看起来很奇怪,因为我们不能说O(1/n)等于O(n)没有不同meanings@newby,
      O(n/m)
      O(n)
      (对于
      n,m>=1
      )中,与
      O(n)
      O(n^2)
      中的含义相同,但我认为该算法不是
      O(n/m)
      。反例是
      n=k,m=k+1
      ,它在第一次迭代后被减少为
      n=k,m=1
      ,并循环
      k+1
      总迭代次数。
      If m<n