如何解决Python-如何计算此递归函数的时间复杂度?
我想尽我所能解决塔漏斗问题,并计算每种方法的时间复杂度(仅用于自我练习)。 解决方法之一是:
def is_hopable(arr):
if len(arr) < 1 or arr[0] == 0:
return False
if arr[0] >= len(arr):
return True
res = False
for i in range(1,arr[0]+1):
res = res or is_hopable(arr[i:]) # This line
return res
我知道递归时间复杂度计算的一般概念,但是我无法分析注释行(在for循环内)。通常,我用T(n) = C + T(that line)
计算时间复杂度,并用一般表达式(例如T(nk))将其降低,直到达到基本情况并可以用n表示k,但是for循环的时间复杂度是多少? ?
解决方法
for
循环的复杂度可能高达O(n^2)
,因为循环的每次迭代(最多n次迭代)都会执行一个切片arr[i:]
,该切片返回{{1 }}中没有前arr
个元素i
。考虑到这一点,总体时间为O(n)
。
提到的上限很紧。
示例:O(n^3)
替代形式:arr = [n-1,n-2,n-3,...,1,1]
用于所有arr[i] = n - 1 - i
,i
和0 <= i < n - 1
,其中arr[n-1] = 1
是n
的长度。
计算基本运算量(避免使用常量)的重复性可以表示为:
简化求和:
评估(展开)较小的T项并搜索下限:
使用从arr
到1
的平方和的formula:
由于T(n)的下界是3的多项式,我们发现问题运行时间的这种情况是n
,证明问题(Ω(n^3)
)的上限很紧
旁注:
如果将原始数组和当前索引用作参数,则O(n^3)
循环的运行时间将为for
,总时间为O(n)
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。