python index函数时间复杂度_递归函数时间复杂度的计算

你被一个坏的(又名)误导了没有用“n的定义。此外,您似乎假定append是摊销的O(n)。不是,而是摊销的。在

考虑一下在列表l上花费T(l)的操作。在new=[]

for e in ls:

if type(e) == list:

new.append(deep_copy(e))

else:

new.append(e)

return new

^{pr2}$

这是正义的T(l) = O(len(l)) * [T(lᵢ) or O(1)] + O(1)

请注意,因为T(lᵢ) or O(1)依赖于lᵢ的类型和{}的类型,所以我们不能像普通方法一样解决这个递归问题。在

我们的递归可以在非正方形甚至非矩形数组上工作。这意味着我们不能仅仅在n中用列表的长度n参数化它。在

相反,我们可以用不同的量来参数化它。在

我们知道递归将总共遍历N个元素。这意味着我们会有[

T(l₁) +

T(l₂) +

T(l₃) +

T(l₄) +

...

] + O(1)

这是正义的[

[T(l₁₁) + T(l₁₂) + T(l₁₃) + T(l₁₄) + ... + O(1)] +

[T(l₂₁) + T(l₂₂) + T(l₂₃) + T(l₂₄) + ... + O(1)] +

[T(l₃₁) + T(l₃₂) + T(l₃₃) + T(l₃₄) + ... + O(1)] +

[T(l₄₁) + T(l₄₂) + T(l₄₃) + T(l₄₄) + ... + O(1)] +

...

] + O(1)

是什么[

[T(l₁₁) + T(l₁₂) + T(l₁₃) + T(l₁₄) + ...] +

[T(l₂₁) + T(l₂₂) + T(l₂₃) + T(l₂₄) + ...] +

[T(l₃₁) + T(l₃₂) + T(l₃₃) + T(l₃₄) + ...] +

[T(l₄₁) + T(l₄₂) + T(l₄₃) + T(l₄₄) + ...] +

...

] + O(1) + T(len(l))

也就是说,递归地展开[

[[[[...[O(1) + O(1) + ...]...]]]] +

[[[[...[...]...]]]] +

[[[[...[...]...]]]] +

[[[[...[...]...]]]] +

...

] + O(1) + O(len(l)) +

+ O(len(l₁)) + ... + O(len(l₄)) + ... +

+ O(len(l₁₁) + ... + O(len(l₄₄)) + ... +

+ O(len(l₁₁₁) + ...

+ ...

第一部分(在[]s中)添加到O(N)。第二个是列表长度的总和。在

显然,列表的长度之和至少等于基本级别项的总数。但是,我们不能仅仅用基本级项目的数量作为答案,比如[[[...[[[[1]]]...]]]

但一个相当的项目将被复制。在

所以我们的答案是O(sum(number of items in each list, including all sublists))

那么为什么不在n或N中参数化呢?为什么只是一盒文字?在

好吧,那是因为这就是你所需要的,你所能给予的。如果你有另一个定义,比如:The array is of dimensions (x₁, x₂, x₃, ..., xₙ).

你可以用变量(O(Σx + Πx))来求解。但问题并不是这么说的。在

注意,正如前面所建议的,O(nⁱ⁺¹)对于具有i维的(n, n, n, ..., n)维的东西并不十分合适。它应该是O(nⁱ + i)。在

现在,我确实做了一些很奇怪的事。我没有写O(nⁱ + i)=O(nⁱ)。在

当你有两个变量时,通常(但不总是)值得考虑的情况是只有一个很大。通常是O(nⁱ) > O(i),但是如果你可以有n和{},那么{}和{}。在

基本上,O(nⁱ + i) = O(nⁱ)当且仅当您希望它时。如果大小写n = 1,i large很重要,则包括+ i。否则,不要

通过设置i=1和计时,我们可以快速测试功率是i,而不是{}:SETUP="

def deep_copy(ls):

new=[]

for e in ls:

if type(e) == list:

new.append(deep_copy(e))

else:

new.append(e)

return new

"

python -m timeit -s "$SETUP" -s "x = [0] * 10**5" "deep_copy(x)"

python -m timeit -s "$SETUP" -s "x = [0] * 10**6" "deep_copy(x)"

给予10 loops, best of 3: 20.8 msec per loop

10 loops, best of 3: 209 msec per loop

如我所说,当长度增加10时,花费的时间增加10倍意味着线性成本。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值