我一直在研究算法的分析,并且我多次想到要定义算法的时间复杂度,我必须找到算法执行的“相关操作”的数量。然而,至少据我所知,没有一个来源(Cormen,Skiena,Sedgewick ......)提到我如何知道哪些操作实际上是相关的。有什么帮助吗?
答案 0 :(得分:2)
一般来说,你只需计算你在给定环境中关心的操作。
E.g。
fib(n)
{
if(n < 2)
return 1;
return fib(n-1) + fib(n-2)
}
您可以在此代码中找到的操作是:
每个操作都需要一些时间才能执行,但每个操作都执行得非常快(假设输入n
是64位数,程序在“普通”计算机上运行)。因此,这个函数的复杂性必须来自重复调用,尤其不是来自它自己的调用,而是来自调用的数量。所以你计算递归调用并忘记其他操作,知道它们运行得很快,意味着O(1)
(恒定时间)。
您可以忽略某些操作的原因是您根据o
,O
,Θ
,Ω
或ω
来计算复杂性(Landau-Notation),它允许你在asymtotics中计算,其中slwo生长部分和常数不起任何作用。
我认为没有简单的答案如何知道,哪些操作是相关的。有一些简单的例子(比如我给的那个),但总的来说并不容易。然后你必须计算一切可能相关的东西,直到你注意到它不是。