以下函数计算a ^ b。 假设我们已经有一个prime_list,其中包含所有需要的素数,并从小到大排序。 代码是用python编写的。
def power(a,b):
if b == 0:
return 1
prime_range = int(sqrt(b)) + 1
for prime in prime_list:
if prime > prime_range:
break
if b % prime == 0:
return power(power(a, prime), b/prime)
return a * power(a, b-1)
如何确定其时间复杂度? 附:代码并不完美但是你可以看到这个想法是使用素数来减少算术运算的次数。 我仍然在寻找一个理想的实现,所以如果你想出一些东西请帮忙。 THX!
答案 0 :(得分:1)
最糟糕的情况是for循环是exausted。但在这种情况下,b在下一次递归调用中被除以2。
在最坏的情况下,我们在每个步骤的大约sqrt(b)操作中将b除以因子2,直到b达到1 所以如果我们设定方程式
f(1)= 1且f(n)= f(n / 2)+ sqrt(n)
f(n)=(1 + sqrt(2))(sqrt(2)sqrt(n)-1)
那就是
O(SQRT(b))的