我想用递推方程找出程序的时间复杂度。那就是..
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
好的,我想我已经能够证明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)。否则,对第二、第三和第四