Algorithm 找出算法的复杂性

Algorithm 找出算法的复杂性,algorithm,Algorithm,大家好,我明天有一个算法分析考试,我在网上找到了这个问题。我试图解决它,但我只需要你检查一下我的解决方案是否正确 public class t { public static void main(String[] args) { System.out.println(mystery(7, 6)); } public static int mystery(int a, int b) { if (b == 0) return 0;

大家好,我明天有一个算法分析考试,我在网上找到了这个问题。我试图解决它,但我只需要你检查一下我的解决方案是否正确

 public class t {
      public static void main(String[] args) {
      System.out.println(mystery(7, 6));
      }
      public static int mystery(int a, int b) {
      if (b == 0) return 0; 
      return mystery(a * 2, b / 2) + a;
      }
     }
我的答覆是: 该算法的复杂度为O(logn) 因为每次b都会被减半直到我们到达 终止条件为1。

O(日志n)是错误的,因为没有定义“n”

虽然我知道你的意思是复杂度是O(logb),这是正确的,但你必须引用正确的变量。否则,假设O(logn)表示O(loga)同样正确,这是非常不正确的


此外,停止条件为b=0。

听起来不错。然而,正如Timothy所指出的,您需要注意N的定义。例如,如果N是输入的位数,那么您的算法实际上是O(N)。(一个O(b)算法就是O(2^n))我同意,你有两个变量a和b,你知道在一个O表示法的情况下,你依赖它们,a和b都被假定为无穷大,因为神秘(a,b)可以产生任意数a和b‘任意数’?不,两者都是整数值,因此我怀疑该方法能否为复数系统中存在的其他一些数值生成.5、pi或I,因此要注意语言。作为魔鬼层,还有另一种解决方案,即O(1)如果您在假设尾部递归的情况下查找空间复杂性。@LukaRahne该函数不是尾部递归的,尽管它可以被设置为尾部递归。但是,这不会改变时间复杂度。只需检查一件事,当b=6时,此fxn被调用3次,对吗?