2017-07-17 341 views
1

我被告知要创建一个基于循环的函数,该函数返回第n个斐波那契数。我已经完成了这个功能,并将其包含在下面。我的任务说“要求函数的运行时间是Θ(n),即函数在n中是线性的”。在我看过的书和我看过的视频中,Big-Theta总是写成Θ(g(n)),并表示为一些不平等。导师拒绝,直到我们把它回答任何相关的问题Big Theta表示法和循环的时间复杂度

这里是我的两个问题:

1)请问我在说我克(n)是5N + 7和Θ是正确的(n)是线性的,因为g(n)是线性的?

2)即使此函数具有线性运行时,我是否还需要担心上限和下限?

int fib(int n) 
{ 
    int fib = 1;         //1 
    int num1 = 0;         //1 
    int num2 = 1;         //1 

    for(int i = 0; i < n; i++)      // 1 + (n+1) + 1 
    { 
      fib = num1 + num2;      //2n 
      num1 = num2;       //1n 
      num2= fib;        //1n 
    } 
    return fib;          //1 
}             //---------------- 
                //5n+7 <- runtime as a function of n 

据我明白就没有上限或下限因为运行时是线性的。

+0

我会小心每个操作分配的实际时间值,因为当一个附加只需要一半在大多数现代CPU的一个周期,一个读/写最多可能需要80 – meowgoesthedog

+0

且不说什么编译器与此代码片段以及它最终的外观。这就是O-notations如此有用的原因,因为它抽象了所有的时间参考和实现细节。您可以构建一个自定义CPU,在一个周期内完成所有操作。但它仍然需要循环“n”次。 – SkryptX

回答

1

1)我说我的g(n)是5n + 7并且Θ(n)是线性的,因为g(n)是线性的吗?

是的,那种。我会劝阻你有史以来名称一定g(n)因为了解,编程语言不是一个数学函数的良好表示。你可以用递归方式编程你的函数,并且有一个完全不同的分析,否则就不可能像你这样做。但保持不变的事实是,您的算法始终满足O(n),并且与Θ(g(n))的比例为g(n) = n

了解O(g(n))Θ(g(n))的区别看这里:What is the difference between Θ(n) and O(n)?

2)我需要担心的上限和下限,即使该功能具有线性运行?

不,你不知道。不在这个算法中。在斐波那契算法中没有更好或更糟的情况,所以它总是以Θ(n)结束。请注意,我使用了Big-Theta而不是O-notation,因为您的运行时间是完全的n而不是最多n

+0

好的!这很有道理! 'O(n)'似乎是一种更坏的情况。所以,如果我想避免听起来像一个博傻我可以说,“5N + 7是'O(N)'也Θ(n)的''因为'O(N)'和'Θ(N)'成正比对彼此”? –

+0

我不会比较'O(n)'和'Θ(n)'。特别'Θ(n)的'不一定必须存在,但如果存在,'为O(n)'是等于'Θ(n)的'(单向!!)因为'Θ(n)的'是一个较强结合比'O(n)'。我认为,该算法具有相同的上限和下限的正比于'N',因此资格大-θ'Θ(n)的'。就这样。 – SkryptX