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之间的链接。再次感谢!