algorithm - 如何找到以下递归代码的时间复杂度?
问题描述
如何推导以下程序的运行时复杂度?
public void function(int n){
if(n==1) return;
for(int i=0;i<n;i++){
function(i)
}
}
function(4);
我的理解是,
T(n) = n(T(n-1));
T(n-1) = (n-1)(T(n-2))
T(n-2) = (n-2)(T(n-2))
替换n(T(n-1))
为后续扩展后,
T(n) = n((n-1)((n-2)(T(n-2))))
这基本上不过是
n*(n-1)*(n-2)...1 = n!
但是,在不同的帖子中,我发现这2^n
不是n!
。如果我错过了什么,谁能解释我?
解决方案
T(n) = n T(n-1)
确实会O(N!)
- 但它是错误的递归关系function
。
循环从i = 0
to运行i = n-1
,这意味着递归调用是function(0)
, function(1)
, function(2)
... , function(n-1)
. 因此递归关系为:
T(n) = T(0) + T(1) + T(2) + ... + T(n-1)
有一个巧妙的技巧可以帮助您解决这个问题。考虑 中的术语T(n-1)
并将扩展写在 的旁边T(n)
:
T(n) = T(0) + T(1) + T(2) + ... + T(n-3) + T(n-2) + T(n-1)
------
T(n-1) = T(0) + T(1) + T(2) + ... + T(n-3) + T(n-2)
看看这是怎么回事?从另一个中减去一个,只剩下带下划线的项T(n-1)
:
T(n) - T(n-1) = T(n-1)
T(n) = 2 T(n-1)
这种递归的替代形式现在可以用与以前相同的方式求解:
T(n) = 2^2 T(n-2)
= 2^3 T(n-3)
= 2^4 T(n-4)
= ...
= O(2^n)
qed
推荐阅读
- php - Php Yii2 上传 base64 图像失败并带有 file_put_contents
- python - 本地主机端口即使在杀死并释放端口后仍在运行
- npm - 发布了一个 npm,但在互联网上无处可见
- r - Mutate while accessing value in list column in a pipe with map and pluck
- python-3.x - 在 pandas 单元格中的列表中查找一个数字,并从第二个 DF 返回相应的字符串值
- python - openCV 模糊图像
- javascript - 仅向来自 Facebook 的访问者展示广告
- javascript - What exactly is regarded as 'document read' in Cloud Firestore?
- visual-studio-code - 范围开放标记仅在 VSCode/Textmate HTML 语法中
- mysql - SQL - 嵌套查询优化