algorithm - 何时何地使用哪种渐近符号
问题描述
我已经通过这个 Big-Oh 的解释,了解了两个循环的复杂性, big theta 和 big-oh 之间的区别,也通过了这个问题。
我知道我们不能说 Big-oh 是最坏的情况,Omega 是最好的情况,而 theta 是平均情况。Big-oh 有自己的最佳、最差和平均情况。但是我们如何发现任何特定算法都属于 Big-oh、Big-theta 或 Big-Omega。或者我们如何检查是否有任何算法属于所有这些。
解决方案
函数 f(n) 是函数 g(n) 的 Big-Oh,写为 f(n) = O(g(n)),如果存在正常数 c 和自然数 n0 使得对于 n > n0 , f(n) <= c * g(n)。函数 f(n) 是 g(n) 的 Big-Omega,写作 f(n) = Omega(g(n)),当且仅当 g(n) = O(f(n))。函数 f(n) 是函数 g(n) 的 Theta,写作 f(n) = Theta(g(n)),当且仅当 f(n) = O(g(n)) 和 f(n ) = 欧米茄 (g(n))。
为了证明任何免费,您可以通过展示一些功能是其他一些功能的 Big-Oh 来做到这一点。在一般情况下,要证明一个函数是另一个函数的 Big-Oh 是一个难题。任何形式的数学证明都可能有所帮助。与基本案例的直觉相结合的归纳证明并不少见。基本上,猜测 c 和 n0 的值,看看它们是否有效。其他选项包括选择两者中的一个并为另一个计算出合理的值。
请注意,一个函数可能不是任何其他函数的 Big-Theta,如果其从上方和下方的最紧密边界是具有不同渐近增长率的函数。但是,我认为通常可以肯定的是,大多数函数都将是相当简单的 Big-Oh,并且通常从这个角度看待的所有函数在最好的情况下至少是恒定时间的 - Omega(1)。
推荐阅读
- spring - 为什么在 Spring Cloud Data Flow 中启动后没有销毁任务?
- android - 为什么从可调用云函数抛出的错误不会在失败侦听器上触发?
- c# - UWP:MediaCapture 音频流中断/恢复状态
- batch-file - 午夜后的时间设置不正确
- java - Spring Boot 注册表单测试 - NullPointerException
- c# - 按键控制按钮菜单在按键保持 Unity C# 时循环
- c - 尝试声明 int 数组时数组声明失败
- unity3d - JoinRandomRoom 没有加入 2 个玩家的同一个房间?
- docker - 如何通过 Nginx(反向代理)+ Nginx(Docker)+ Vue.js(Docker)通过 URL 子目录访问 vue.js
- kotlin - 无法在 kotlin 中创建抽象类 Random 的实例