Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 我不知道';我不理解这个算法';时间复杂度_Algorithm_Performance_Time Complexity - Fatal编程技术网

Algorithm 我不知道';我不理解这个算法';时间复杂度

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,这是可以的

在我做的一个练习中,发现一个复杂度为: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
,这是可以的

现在假设
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:由您决定。你也可以离开他们,因为其他人可能有同样的问题。