有人可以向我解释如何计算以下递归代码的复杂性:
long bigmod(long b, long p, long m) {
if (p == 0)
return 1;
else
if (p % 2 == 0)
return square(bigmod(b, p / 2, m)) % m;
else
return ((b % m) * bigmod(b, p - 1, m)) % m;
}
答案 0 :(得分:2)
这是 O(log(p)),因为你每次除以2或减去除以2然后除以2,所以最坏的情况是真的需要O(2 * log(p) ) - 一个用于除法,一个用于减法。
请注意,在此示例中,最坏情况和平均情况应该是相同的复杂性。
答案 1 :(得分:2)
如果你想对它更正式,那么你可以写一个递归关系并使用Master定理来解决它。 http://en.wikipedia.org/wiki/Master_theorem
答案 2 :(得分:0)
它在O(log n)
在函数内部没有昂贵的操作(因为我比平方或修改更昂贵。没有循环等),所以我们几乎只计算函数调用。
最好的情况是2的幂,我们需要准确的log(n)调用。
最糟糕的情况是,我们在每次其他通话中都会得到一个奇数。这只能使我们的电话加倍。乘以常数因子,不会渐近变差。 2*f(x) is still O(f(x))
O(logn)
答案 3 :(得分:0)
是o(log(N))base 2,因为除以2