Py算fib二分递归解的时间复杂度是?

发布于 2022-09-08 00:02:42 字数 1461 浏览 15 评论 0

我写的

def recursive_function_cache(func):
     cache = dict()
  
     def wrapper(*args, **kwargs):
         parameters = (tuple.__repr__(args), dict.__repr__(kwargs))
         if parameters not in cache:
             cache.update({parameters : func(*args, **kwargs)})
         return cache.__getitem__(parameters)  #返回缓存的函数值
  
     return wrapper
  
def Fibonacci_sequence_06 (n: int) -> int:  #参数n是表示求第n项Fibonacci数
     assert isinstance(n, int), 'n is an error of non-integer type.'
     @recursive_function_cache
     #@profile
     def Calculate_Fibonacci_sequence (n: int) -> int:
         '返回单项的二分递归解法'
         if n>=3:
             if (n & 1) == 0:  #当n为偶数项
                 one_half_fib_n = Calculate_Fibonacci_sequence(n >> 1)
                 one_half_fib_n_minus_one = Calculate_Fibonacci_sequence((n >> 1) - 1)
                 return ((one_half_fib_n_minus_one << 1) + one_half_fib_n) * one_half_fib_n
             else:  #当n为奇数项
                 return Calculate_Fibonacci_sequence(n >> 1) ** 2 + Calculate_Fibonacci_sequence((n >> 1) + 1) ** 2
         elif n in (1, 2):
             return 1
         elif n==0:
             return 0
  
     if n>=0:
         return Calculate_Fibonacci_sequence(n)
     else:
         return None
  
Fibonacci_sequence_06(10000000)

算第1千万项用了3秒,耗时是矩阵法的100倍
我看时间复杂度是log(n)的。查看是递归调用了59次
可怎么大数时候跟矩阵法实测时间差那么多
什么地方隐藏着高复杂度

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寻找我们的幸福 2022-09-15 00:02:42

时间复杂度确实是log(n)
慢是因为 Python内置的大数运算太慢了
具体见 https://www.jianshu.com/p/9d1...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文