Algorithm 我不知道';我不理解这个算法';时间复杂度
在我做的一个练习中,发现一个复杂度为:T(n)=c+2T(n)的算法−(一) 可由 T(n)=c⋅2n,其复杂度为O(2^n)Algorithm 我不知道';我不理解这个算法';时间复杂度,algorithm,performance,time-complexity,Algorithm,Performance,Time Complexity,在我做的一个练习中,发现一个复杂度为:T(n)=c+2T(n)的算法−(一) 可由 T(n)=c⋅2n,其复杂度为O(2^n) 有人知道怎么做吗?对于某些常数c>0,我们有一个递归关系T(n)=c+2*T(n-1)。我们还需要一个边界条件,否则递推不成立。让我们假设T(1)=c 计算前几个值,T(2)=c+2c,T(3)=c+2c+4c,我们很想推测T(n)=c*(2^n-1) 让我们通过对n的归纳来证明这一点。对于基本情况,当n=0时,我们有T(1)=c*(2^1-1)=c*1=c,这是可以的
有人知道怎么做吗?对于某些常数
c>0
,我们有一个递归关系T(n)=c+2*T(n-1)
。我们还需要一个边界条件,否则递推不成立。让我们假设T(1)=c
计算前几个值,T(2)=c+2c
,T(3)=c+2c+4c
,我们很想推测T(n)=c*(2^n-1)
让我们通过对n
的归纳来证明这一点。对于基本情况,当n=0
时,我们有T(1)=c*(2^1-1)=c*1=c
,这是可以的
现在假设T(k)=c*(2^k-1)
对于所有k@blazs的答案似乎是正确的。如果这有助于你理解,那就太好了。这是一个像我这样的视觉学习者的答案
您提供的递归是:T(n)=c+2T(n−1)
- 因此,在递归树的每个节点上,您都执行一个常量工作
c
。假设您在每个节点上所做的工作是恒定的,如果您可以找到树中节点总数的上限,那么您已经找到了复杂性
- 根据您的递归,您有效地将一个大小为n的问题分解为两个大小为n-1的问题。因此,在每一个级别上,树实际上都会增长到上一级别上最大大小的两倍。它是一个深度为n的完全二叉树。2完整二叉树中的节点总数由简单公式(2n-1-1)给出
乘以2,我们得到的节点数与2n-2成正比因此,由递归表示的复杂性为=O(2n)。
一些有用的观点:
一,。在递归树的方法中,算法的复杂度等于树的每一级所做的工作之和。
二,。高度
三,。在数学StackExchange上给出了一个很好的解释
四,。通过解决两个大小为n-1的问题,您可以看到您是如何解决大小为n的问题的。因为每个子问题都要解决多次,所以最终的复杂性是指数级的。如果只解决一次n-1大小的问题,然后将其缓存以供将来查找,会发生什么情况?您将大大降低这个问题的复杂性,从O(2n)降低到O(n)!!这种缓存被称为记忆化,这种只解决一次子问题的方法有一个流行而可怕的名字动态编程尝试在n上进行归纳的前几次迭代。这是一种很好的直观解释——可视化函数的调用树。但从形式上看,这是因为证明高度为n的完全二叉树有许多节点需要对树的高度进行归纳。(当然,在这种情况下,这是一个完全可以接受的论点,因为每个程序员/计算机科学家都应该熟悉有关二叉树的基本事实。)@blazs:在一个完整的二叉树中,不一定需要归纳法来求节点的和。有很多方法。“就我个人而言,我使用几何级数求和的公式来计算节点总数,”他解释道。另外,如果您想了解我在脚注#2中提供的链接,它会使用替换。@blazs:由您决定。你也可以离开他们,因为其他人可能有同样的问题。