我想用尽可能多的方法解决塔式料斗问题,并计算每种方法的时间复杂性(仅用于自我练习)。解决方案之一是:
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(那条线
)计算时间复杂度,并用一般表达式(例如 T(n-k))降低它,直到我达到基本情况并且可以用 n 表示 k,但是 for 循环的时间复杂度是多少?
循环的复杂度可能高达
O(n^2)
,因为循环的每次迭代(最多n次迭代)都会执行一个切片arr[i:]
,该切片返回arr
的副本,而没有第一个i
元素O(n)
。考虑到这一点,总时间是O(n^3)
。
提到的上限是紧的。< br >示例:< code>arr = [n-1,n-2,n-3,...,1,1]
替代形式:< code>arr[i] = n - 1 - i对于所有< code>i,< code>0
由于T(n)下界是3次多项式,我们发现问题运行时间的这种情况是ω(n^3)
证明问题(O(n^3)
)的上界是紧的。
旁注:
如果您使用原始数组和当前索引作为参数,循环的运行时将为
O(n)
,总时间O(n^2)
。
顺便说一句,我试图解决时间复杂性,我找到了O(2^n)。正确吗?
我在考虑如何正确计算这个函数的时间复杂度: 我假设它是 O(n),其中 n 是列表的长度。我们的 while 循环是 O(n),for 循环也是 O(n), 这意味着我们得到了 2*O(n),等于 O(n)。 我说的对吗?
这里是一个递归函数。它遍历字符串映射()。检查()如果等于所需的字符串(),则打印它(),并再次为该执行函数。 停下来没有规则,似乎完全是随机的。这个函数的时间复杂度是如何计算出来的?
如何计算以下函数的时间复杂度? 现在,我知道循环具有O(n)时间复杂度,但在这种情况下,I以更快的速度增长。一次又一次地迭代,我发现,对于每一个第m次迭代,I=m^2。但我仍然不知道如何计算大O。
我已经通过谷歌和堆栈溢出搜索,但我没有找到一个关于如何计算时间复杂度的清晰而直接的解释。 说代码像下面这样简单: 说一个像下面这样的循环: 这将只执行一次。 时间实际上被计算为而不是声明。
我在理解算法的时间复杂性方面有问题。 让我们举第一个例子,用这个算法在二叉搜索树中进行搜索: 那么,如何计算这个时间复杂度呢? null