recursion - 下面算法时间复杂度的解释
问题描述
我有以下算法:
def func(n):
if n <= 1:
return 1
x = 0
for i in range(n ** 2):
if i % 4 == 0:
x += i
return x + func(n//3) + func(n//3) + func(n//3)
复杂度分析为:
$ T(n) = n^2 + 3*T(\frac {n}{3}) + 1 $
我知道复杂性是 $ O(n^2) $,但我的问题是,如果没有递归调用,那么复杂性怎么可能相同?对此有什么直观的解释吗?
解决方案
算法复杂度是最昂贵操作的时间/空间。如果其他操作与它相比成本更低,它们不会影响算法的复杂性。
例如,如果算法在T(n) = n^2 + log(n)
-> O(n)=n^2
since中运行,log(n)
则不会影响,因为随着变量的增加n^2
,它比它低得多。n
即使T(n) = n^2 + 3n^2 = 4n^2
->O(n)=n^2
因为标量4
不会将复杂性提升到另一个量化级别,因为变量 n(最重要和最昂贵的部分)的依赖关系是相等的。
推荐阅读
- reactjs - ModuleNotFoundError:找不到模块:错误:无法解析“/vercel/path0/components”中的“../config”
- java - 我将如何在 golang 中使用来自 java 的 AES/CCM/NoPadding 密码?
- android - 声明的不属于这个 FragmentManager 的目标 Fragment
- python-3.x - 有没有一种方法可以从表单 django 中保存数据?
- php - 使用程序准备语句填充我的下拉菜单
- laravel - 如何在 laravel 8 中运行这条路线
- google-bigquery - 如何通过在 BigQuery 中加入 2 个非嵌套表来创建嵌套表?
- docker - Docker-compose - 模块导入问题
- html - 标签内的 HTML img 仍然不可点击
- javascript - 在 null 和 undefined 比较的情况下内部发生了什么?