当前位置: 首页 > 知识库问答 >
问题:

用递推方程求解程序的时间复杂度

习狐若
2023-03-14

我想用递推方程找出程序的时间复杂度。那就是..

int f(int x)
{
if(x<1) return 1;
 else  return f(x-1)+g(x); 
}
int g(int x)
{
if(x<2) return 1;
 else return f(x-1)+g(x/2);
}

我写了它的递推方程,并试图解决它,但它继续变得复杂

T(n) =T(n-1)+g(n)+c
         =T(n-2)+g(n-1)+g(n)+c+c
         =T(n-3)+g(n-2)+g(n-1)+g(n)+c+c+c
         =T(n-4)+g(n-3)+g(n-2)+g(n-1)+g(n)+c+c+c+c
         ……………………….
        ……………………..
        Kth time …..
        =kc+g(n)+g(n-1)+g(n-3)+g(n-4).. .. . … +T(n-k)

Let at kth time input become 1
Then n-k=1
         K=n-1
Now i end up with this..
T(n)= (n-1)c+g(n)+g(n-1)+g(n-2)+g(n-3)+….. .. g(1)

我无法进一步解决它。无论如何,如果我们计算这个程序中函数调用的次数,就可以很容易地看出时间复杂度是指数的,但我想用递归来证明它。怎么能做到呢?

在Anwer 1的解释,看起来正确,类似的工作我做了。

这段代码中最困难的任务是编写它的递归方程。我画了另一张图,我确定了一些模式,我想我们可以从这张图中得到一些帮助,什么可能是递推方程。

And I came up with this equation , not sure if it is right ??? Please help.

T(n) = 2*T(n-1) + c * logn

共有1个答案

皇甫聪
2023-03-14

好的,我想我已经能够证明f(x)=Theta(2^x)(注意时间复杂度是相同的)。这也证明了g(x)=Theta(2^x)f(x)>g(x)>f(x-1)

首先,正如大家所指出的,很容易证明f(x)=Omega(2^x)

现在我们有f(x)<=2f(x-1)+f(x/2)的关系(因为f(x)>g(x))

我们将说明,对于足够大的x,存在一些常量k>0,这样

f(x)<=k*H(x),其中H(x)=(2+1/x)^x

这意味着f(x)=Theta(2^x),就像h(x)=Theta(2^x),这本身就来自于h(x)/2^x->sqrt(e)就像x->infinity(极限的wolfram alpha链接)。

现在(警告:较重的数学,perhap CS.StackExchange或math.StackExchange更适合)

根据wolfram alpha(点击链接,查看x=无穷大附近的级数展开),

h(x)=exp(x ln(2)+1/2+O(1/x))

因此,对于足够大的X(例如X>L),我们有一个不等式

H(x)>=2H(x-1)+H(x/2)

现在有一些K(仅依赖于l(例如K=f(2l))),这样

通过归纳,右边是

<=2*k*h(x)+k*h((x+1)/2)

我们之前证明了

2*H(x)+H((x+1)/2)<=H(x+1)

因此f(x+1)<=K*H(x+1)

 类似资料:
  • 我试图通过绘制一棵恢复树并将其求解为替换方法来求解。但是我很难理解sqrt方法将如何影响这个过程,如果可能的话,我正在寻找一些指针 非常感谢!

  • 帮助我减少这个程序的时间复杂性 输出:为每个测试用例输出这样的对的数量。 约束条件:T≤10;N≤100000;A[i]≤1000000 示例输入(明文链接)

  • 所以,基本上,我想找到第二个数组中的所有元素,它们小于或等于第一个数组的元素。这两个数组都是排序的。我知道解决办法。我不想那样。我只想知道这个程序的时间复杂度,以及我们将如何计算。提前谢谢你。

  • 我是复杂性分析新手。任务是给定一个非空字符串(如“Code”)返回一个字符串(如“CCoCodCode”)。我有两个程序在做同样的事情。 程序1: 所以,上面的一个非常简单,这个程序有O(n^2)复杂度。 程序2: 从另一个StackOverflow问题来看,的时间复杂度似乎为O(n)。在这种情况下,程序2也具有O(n^2)时间复杂度。 我的分析是正确的还是遗漏了什么?

  • 我明天有一个计算机科学期中考试,我需要帮助确定一个特定递归函数的复杂性,如下所示,这比我已经研究过的东西要复杂得多:它有两个变量 T(n)=3 mT(n-m) 在m为常数的简单情况下,可以通过编写解包关系轻松获得公式;然而,在这种情况下,拆包并不会使生活变得更容易,如下所示(假设t(0)=c): T(n)=3 mT(n-m) T(n-1)=3 mT(n-m-1) T(n-2)=3 mT(n-m-2

  • 我必须写代码来取一个具有奇数个元素的排序双数组,找到它们之间距离最短的值对,并返回剩余的值,这被认为是“奇数”。以下是我编写的代码,它可以工作并返回正确的值。 有人能帮我找到我使用的算法的时间复杂度吗?我试过了,但真的很困惑。 算法:从数组的第一、第二和第三个元素开始。比较第一和第二元素以及第二和第三元素之间的差异。如果第一个差小于或等于后一个,则将前两个元素设为(-1)。否则,对第二、第三和第四