这是正确的时间复杂度吗?

问题描述

我这样做是为了解决 leetcode 问题之一,但我不确定我的算法的复杂度是多少。

variable = False
try:
    if request.form['variable'] == '1':
       variable = True
except:
    pass

由于递归发生了n次并且循环是O(n),我觉得应该是O(n^2)。那是对的吗?如果不是,你能解释一下原因吗?

解决方法

以下是一些事实:

  • 该方法在输入 n-1 上递归调用自身。
  • 该方法产生称为 look-and-say sequence 的序列。
  • 结果字符串的长度随基数 λ 呈指数增长,其中 λ = 1.303577269034... 为 Conway's constant,因此长度为 O(λ^n)
  • 循环是字符串长度的二次方(因为重复的字符串连接),所以我们有 O((λ^n)^2) = O((λ^2)^n) 用于循环。

因此我们可以推导出以下递推关系:

T(0) = 1
T(n) = T(n-1) + O((λ^2)^n)

这个关系的渐近行为由下式给出

T(n) ∈ Θ((λ^2)^n) = Θ(1.6993^n)

如果您使用 StringBuilder 而不是进行邪恶的重复字符串连接,您可以将其归结为 Θ(λ^n),这对于这个问题也是渐近最优的。