我被告知要创建一个基于循环的函数,它返回第n个Fibonacci数。我已经完成了这个功能,并将其包含在下面。我的任务是“争辩说函数的运行时间是Θ(n),即函数在n中是线性的。”在我读过的书和我看过的视频中,Big-Theta一直被写成Θ(g(n))并表示为一些不等式。在我们将其转入之前,教练拒绝回答任何有关此问题。
以下是我的两个问题:
1)我是否正确地说我的g(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 :(得分:1)
1)我是否正确地说我的g(n)是5n + 7并且Θ(n)是线性的,因为g(n)是线性的?
是的,有点儿。我不鼓励你永远命名某个stepOne();
function stepOne() {
try {
var buttons = document.querySelectorAll("button.ytd-topbar-menu-button-renderer");
buttons[0].click();
stepTwo();
}
catch(error) {
setTimeout(stepOne, 250);
}
}
function stepTwo() {
try {
buttons = document.querySelectorAll("paper-item.ytd-account-settings");
buttons[0].click();
stepThree();
}
catch(error) {
setTimeout(stepTwo, 100);
}
}
function stepThree() {
try {
buttons = document.querySelectorAll("paper-toggle-button.style-scope.ytd-account-settings");
buttons[0].click();
document.body.click();
}
catch(error) {
setTimeout(stepThree, 100);
}
}
因为理解编程语言不是数学函数的良好表示。您可以以递归方式对函数进行编程,并进行完全不同的分析,或者甚至不可能以您的方式进行。但是保持相同的事实是,您的算法始终满足g(n)
并与O(n)
成比例Θ(g(n))
。
要了解g(n) = n
和O(g(n))
之间的区别,请查看此处:What is the difference between Θ(n) and O(n)?
2)即使此函数具有线性运行时间,我还需要担心上限和下限吗?
不,不。不在此算法中。 Fibonacci算法没有更好或更坏的情况,因此它总是以Θ(g(n))
结束。请注意,我使用了Big-Theta而不是O-notation,因为您的运行时非常Θ(n)
而不是最多 n
。