账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Py算fib二分递归解的时间复杂度是?
    31
    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次
    可怎么大数时候跟矩阵法实测时间差那么多
    什么地方隐藏着高复杂度

    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • Py算fib二分递归解的时间复杂度是O(2^n)。这是因为每次递归调用都会产生两个新的递归调用,所以总的函数调用次数是n次,每次函数调用的时间复杂度是O(1)。因此,总的函数调用时间复杂度是O(2^n)。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部