algorithm - 理解大 O 表示法 O(2^N)
问题描述
我试图了解以下用于计算斐波那契数列的递归函数如何落在符号 O(2^N) 下。
int fibo(int num)
{
if (num <= 1) return num;
return fibonacci(num - 2) + fibonacci(num - 1);
}
例如,如果我们考虑寻找数字“5”的斐波那契数列,那么 fibo 方法将被调用 15 次。我们怎么说它属于符号 O(2^N)?
fibo(5)
--------------------
/ \
fibo(3) fibo(4)
------------ -------------
/ \ / \
fibo(2) fibo(1) fibo(3) fib0o(2)
---------------- ---------- -------------
/ \ / \ / \
fibo(1) fibo(1) fibo(2) fibo(1) fibo(1) fibo(0)
---------
/ \
fibo(1) fibo(0)
我知道我的问题是微不足道的。请把我当作一个新手,尝试学习 Big-O 表示法。
解决方案
Big Oh 为您提供算法运行时间的上限。也就是说,您必须阅读 O(2^n) 中的 fib(n) 来说明您的算法最多执行 2^n 步才能返回结果。有时,上限不是那么精确(就是这种情况)。你也可以说 fib 在 O(n!) 中,这是另一个上限(一个非常糟糕的上限)。
为了说明算法的精确运行时间,您必须使用 Theta 表示法,在这种情况下,fib 是 Theta(Phi^n),其中 Phi 是黄金分割率。您可以通过归纳来证明这一点。
推荐阅读
- python - 如何使用pickle序列化这个对象?
- javascript - Vue 在移除 DOM 元素后将内联样式转移到下一个元素 [with snippet]
- selenium - 复制硒选项
- php - 如何启动 Laravel 应用程序?
- python - Django 3:不确定为什么我会收到 CSRF 错误
- python - python中变量前的单星号和双星号有什么区别?
- image - 引导 4 类使导航品牌形象仅出现在中及之后
- sql-server - 生成 2 个日期范围之间的周范围
- python - sp_execute_external_script 返回数据集输出的 Python 脚本
- c++ - io_service::run() 在迁移到 boost 1.72 后没有完成