You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于两种Tribonacci实现的时间复杂度及优劣的技术问询

求解Tribonacci数的两种实现:时间/空间复杂度分析与对比

1. 迭代数组版的复杂度确认

你的第一个迭代版本代码如下:

class Solution:
    def tribonacci(self, n: int) -> int:
        if n == 0:
            return 0
        elif (n == 1) or (n == 2):
            return 1
        else:
            memo = [0,1,1]
            for i in range(3,n+1):
                memo.append(memo[-1] + memo[-2] + memo[-3])
            print(memo)
            return memo[-1]

你判断的**时间复杂度O(n)**是完全正确的:

  • 循环从3到n共执行n-2次,每次循环内的数组追加、三数相加都是O(1)的常数操作,总时间与n线性相关。
  • 空间复杂度为O(n),因为需要维护一个长度为n+1的数组存储所有中间结果。

2. 递归记忆化版的复杂度澄清

你的第二个递归记忆化版本代码:

class Solution:
    def tribonacci(self, n: int) -> int:
        memo = {}

        def tribonacci_helper(n):
            if n == 0:
                return 0
            elif n == 1 or n == 2:
                return 1

            if n not in memo:
                memo[n] = tribonacci_helper(n-1) + tribonacci_helper(n-2) + tribonacci_helper(n-3)

            return memo[n]

        return tribonacci_helper(n)

你混淆了无记忆化递归和带记忆化递归的差异:

  • 如果没有memo字典,每次计算n都会触发n-1、n-2、n-3的递归调用,形成指数级的调用树,此时时间复杂度确实是O(3^n)。
  • 但你的代码中加入了memo缓存,每个n值只会被计算一次:计算完成后存入字典,后续再遇到直接读取缓存值。总共需要计算的n值是0到n,共n+1个,每个计算仅需O(1)的加法操作,因此总时间复杂度为O(n),ChatGPT的结论是正确的。
  • 空间复杂度方面:memo字典占用O(n)空间,加上递归调用栈的深度为O(n)(计算n需逐层递归到base case),总空间复杂度为O(n)。

3. 两个版本的优劣对比

  • 时间效率:两者时间复杂度均为O(n),但迭代版的实际运行效率更高——递归存在函数调用的额外开销,而迭代是直接循环执行,无调用栈的额外消耗。
  • 空间效率:
    • 迭代版当前实现为O(n),但可以优化为O(1):无需存储所有中间值,仅用三个变量滚动更新前三个数即可。
    • 递归记忆化版固定为O(n),且当n过大时(如n>1000),Python的默认递归深度限制会触发栈溢出错误,而迭代版无此问题。
  • 可读性:递归版更贴合Tribonacci的数学定义,代码逻辑直观;迭代版逻辑清晰,但需要手动处理循环和数组更新逻辑。

内容的提问来源于stack exchange,提问作者code_omelette

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:02:09