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次,对吗?