Recursion 递归函数的算术复杂性
这是我的功能。这是一个简单的问题,我只是对答案没有信心Recursion 递归函数的算术复杂性,recursion,complexity-theory,asymptotic-complexity,Recursion,Complexity Theory,Asymptotic Complexity,这是我的功能。这是一个简单的问题,我只是对答案没有信心 int calcul( int n) { if(n=1) return 1; else return calcul(n/2) + 1; } 现在,要了解复杂性,我需要: T(n)=T(n/2)+O(1) T(n/2)=T(n/4)+O(1) T(1)=O(1) 现在,加上方程,我得到 T(n)=O(1)+O(1) 那么最终的答案是什么呢?每次执行函数一次,您可以将n除以2,即log n次
int calcul( int n) {
if(n=1)
return 1;
else
return calcul(n/2) + 1;
}
现在,要了解复杂性,我需要:
T(n)=T(n/2)+O(1)
T(n/2)=T(n/4)+O(1)
T(1)=O(1)
现在,加上方程,我得到
T(n)=O(1)+O(1)
那么最终的答案是什么呢?每次执行函数一次,您可以将
n
除以2
,即log n
次
所以你得到了O(logn)
编辑:
一个数n
的对数(以2为底)是2
的幂,必须提高才能得到n
也就是说,2^(logn)=n
,其中^
表示指数化
现在,计算logn
近似值的一种简单方法是将n
除以2
,而n>1
如果你把k
分了几次,你会得到n<2^k
由于k-1
分割仍然产生n>1
,因此也有n>=2^(k-1)
对
2^(k-1)的每个成员取对数,每次执行函数一次,可以将n
除以2
,即logn
次
所以你得到了O(logn)
编辑:
一个数n
的对数(以2为底)是2
的幂,必须提高才能得到n
也就是说,2^(logn)=n
,其中^
表示指数化
现在,计算logn
近似值的一种简单方法是将n
除以2
,而n>1
如果你把k
分了几次,你会得到n<2^k
由于k-1
分割仍然产生n>1
,因此也有n>=2^(k-1)
在2^(k-1)的每个成员上取对数,该算法与
因此,您可以阅读详细的解释,为什么它是O(log(n))
该算法与
所以,你可以阅读详细的解释,为什么它是O(log(n))
我建议你熟悉主定理。在这种情况下,a=1,b=2,f=O(1)。因为f=Theta(1)=Theta(n^(log_2(1)log^k n)=Theta(log^k n)对于k=0,我们是定理的第二种情况,T(n)=Theta(log^(k+1)n)=Theta(log n)
非常方便的定理,在比较其他算法和进行其他类型的分析时非常有用。我建议熟悉主定理。在这种情况下,a=1,b=2和f=O(1)。因为f=Theta(1)=Theta(n^(log_2(1)log^k n)=Theta(log^k n)对于k=0,我们是定理的第二种情况,T(n)=θ(log^(k+1)n)=θ(log n)
非常方便的定理,在比较其他算法和进行其他类型的分析时非常有用。问题是每次输入被2除,直到满足条件。例如n/2,n/4,n/8…n/n
假设您的输入是8,那么这个日志8的基数是3。
所以O(logn)。常数不应该被计算
希望有帮助。问题是每次输入都被2除,直到满足条件。例如n/2,n/4,n/8…n/n
假设您的输入是8,那么这个日志8的基数是3。
所以O(logn)。常数不应该被计算
希望有帮助。O(1)表示上限不取决于输入的大小。如果将两个不取决于输入大小的时间相加,则会得到另一个不取决于输入大小的时间。因此O(1)+O(1)=O(1)-这对于函数来说是不正确的!O(1)表示上限不取决于输入的大小。如果将两个不取决于输入大小的时间相加,则得到另一个不取决于输入大小的时间。因此O(1)+O(1)=O(1)-这对于函数来说是不正确的!谢谢你的回答,你能再详细一点吗,我没有得到n乘2和日志n之间的链接。再次感谢!谢谢你的回答,你能再详细一点吗,我没有得到n乘2和日志n之间的链接。再次感谢!