algorithm - 使用 log n 递归大 o
问题描述
这个函数的大 O 是什么:
def foo(n):
if (n <= 1):
return 0
else:
return n + foo(n/2) + foo(n/2)
我认为它可能是 O(2^logn) 因为在每个调用中,还有另外两个调用,并且 n 除以 2 直到它达到 1,因此是 logn。
解决方案
是的,它是O(2 logn ),它实际上等同于O(n)。
你可以分析如下:
T(n) = 1 + 2T(n/2)
= 1 + 2(1 + 2T(n/4)) = (2²-1) + 2²T(n/4)
= (2²-1) + 2²(1 + 2T(n/8)) = (2³-1) + 2³T(n/8)
...
= (2 logn - 1) + 2 logn
= (n-1) + 2n
= O(n)
这可能是一个令人惊讶的结果,但是一个测量n和调用次数之间的分数的片段foo
说明了这种时间复杂度:
let counter;
function foo(n) {
counter++;
if (n <= 1)
return 0;
else
return n + foo(n/2) + foo(n/2);
}
for (let n = 1; n < 100000; n*=2) {
counter = 0;
foo(n);
console.log(counter/n);
}
推荐阅读
- java - java中的材质按钮?
- c# - 为什么我的 IOCompetionCallback 从未在我的 IO 完成端口上执行?
- javascript - 反向事件监听器
- reactjs - Storybook 无法读取未定义的属性“displayName”
- python - OperationalError: (pymysql.err.OperationalError) (1129, "IP' 由于许多连接错误而被阻止;使用 'mysqladmin flush-hosts' 解除阻止")
- rust - Serde-yaml 结构列表
- android - currentBackStackEntry?.savedStateHandle?.getLiveData 在尝试向后移动数据时未收到有关更改的通知
- mysql - 将计算列添加到 mySQL 表
- audiokit - AppleSequencer 导出 m4a 格式文件错误 使用 Audiokit 时?
- git - 什么是散列在:git hash-object abc.txt?