中易网

【请教】递归算法 的时间复杂度。。。非常感谢各位!

答案:5  悬赏:40  
解决时间 2021-02-19 11:32
void mergesort(int a[],int i,int j){ int m; if(i!=j) { m=(i+j)/2; mergesort(a,i,m); mergesort(a,m+1,j); merge(a,i,j,m); }}求mergesort(a,0,n-1)的时间复杂度,其中,merge(a,i,j,m)用于两个有序子序列a[i..m]和a[m+1..j]的合并,是非递归函数调用,它的时间复杂度为O(合并的元素个数)?我先计算 mergesort(a,i,m);再计算 mergesort(a,m+1,j);和 merge(a,i,j,m);发现和答案不一样。看了看答案的解题思路,又一知半懂。。能给出详细的过程吗??非常感谢!!!!!数据结构比我想象的难多了。
最佳答案
代码都有了,就加几行记一下步数,跑一下就知道结果啦
全部回答
哈哈,我正好刚刚Google了:递归算法的时间复杂度分析 在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解。实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而足,比较常用的有以下四种方法: (1)代入法(Substitution Method) 代入法的基本步骤是先推测递归方程的显式解,然后用数学归纳法来验证该解是否合理。 (2)迭代法(Iteration Method) 迭代法的基本步骤是迭代地展开递归方程的右端,使之成为一个非递归的和式,然后通过对和式的估计来达到对方程左端即方程的解的估计。 (3)套用公式法(Master Method) 这个方法针对形如“T(n) = aT(n/b) + f(n)”的递归方程。这种递归方程是分治法的时间复杂性所满足的递归关系,即一个规模为n的问题被分成规模均为n/b的a个子问题,递归地求解这a个子问题,然后通过对这a个子间题的解的综合,得到原问题的解。 (4)差分方程法(Difference Formula Method) 可以将某些递归方程看成差分方程,通过解差分方程的方法来解递归方程,然后对解作出渐近阶估计。 下面就以上方法给出一些例子说明。 一、代入法 大整数乘法计算时间的递归方程为:T(n) = 4T(n/2) + O(n),其中T(1) = O(1),我们猜测一个解T(n) = O(n2 ),根据符号O的定义,对n>n0,有T(n) < cn2 - eO(2n)(注意,这里减去O(2n),因其是低阶项,不会影响到n足够大时的渐近性),把这个解代入递归方程,得到: T(n) = 4T(n/2) + O(n) ≤ 4c(n/2)2 - eO(2n/2)) + O(n) = cn2 - eO(n) + O(n) ≤ cn2 其中,c为正常数,e取1,上式符合 T(n)≤cn2 的定义,则可认为O(n2 )是T(n)的一个解,再用数学归纳法加以证明。 二、迭代法 某算法的计算时间为:T(n) = 3T(n/4) + O(n),其中T(1) = O(1),迭代两次可将右端展开为: T(n) = 3T(n/4) + O(n) = O(n) + 3( O(n/4) + 3T(n/42 ) ) = O(n) + 3( O(n/4) + 3( O(n/42 ) + 3T(n/43 ) ) ) 从上式可以看出,这是一个递归方程,我们可以写出迭代i次后的方程: T(n) = O(n) + 3( O(n/4) + 3( O(n/42 ) + ... + 3( n/4i + 3T(n/4i+1 ) ) ) ) 当n/4i+1 =1时,T(n/4i+1 )=1,则 T(n) = n + (3/4) + (32 /42 )n + ... + (3i /4i )n + (3i+1 )T(1) < 4n + 3i+1 而由n/4i+1 =1可知,i0,有f(n) = O(nlogb a-ε ),则T(n) = O(nlogb a ) 2.若f(n) = O(nlogb a ),则T(n) = O(nlogb a *logn) 3.若f(n) = O(nlogb a+ε ),且对于某常数c>1和所有充分大的正整数n,有af(n/b)≤cf(n),则T(n)=O(f(n))。 设T(n) = 4T(n/2) + n,则a = 4,b = 2,f(n) = n,计算得出nlogb a = nlog2 4 = n2 ,而f(n) = n = O(n2-ε ),此时ε= 1,根据第1种情况,我们得到T(n) = O(n2 )。 这里涉及的三类情况,都是拿f(n)与nlogb a 作比较,而递归方程解的渐近阶由这两个函数中的较大者决定。在第一类情况下,函数nlogb a 较大,则T(n)=O(nlogb a );在第三类情况下,函数f(n)较大,则T(n)=O(f (n));在第二类情况下,两个函数一样大,则T(n)=O(nlogb a *logn),即以n的对数作为因子乘上f(n)与T(n)的同阶。 但上述三类情况并没有覆盖所有可能的f(n)。在第一类情况和第二类情况之间有一个间隙:f(n)小于但不是多项式地小于nlogb a ,第二类与第三类之间也存在这种情况,此时公式法不适用。
是O(nlgn)吧?
可以说说具体的操作吗? 我很白的。。
如果就按这个递归式子算,计算第n项需要的计算量an = σai {i,0 -> n-1} 因此an = s(n-1) => an = 2*a(n-1) 又因为0,1两项可以直接算得. 故 a0 = 1, a1 = 1 所以第n项的计算量为{n=0 : 1, n>0 : 2^(n-1)} 总的来说是o(2^n)级别 当然真正实现这个算法的时候不会这么采用暴力的计算.如果加入记忆化,把每个ti的值先记下,则时间复杂度可以降到o(n^2)级别 进一步优化,可以尝试计算这个递归数列的通项.不过我简单试了下发现最后要计算1/n的和,这个据我所知只能直接计算.这样整个算法的复杂度可以降到o(n). 至于楼下说的o(1)的常数做法,我个人没有想到,也许在数据规模小的情况下可以使用查表法做到.
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
三星Gear S3未支付订单取消后s码还有效么
丹阳市到浙江龙巷的火车
糊涂翅地址在哪,我要去那里办事
高校学生干部如何应对突发事件?举例说明。
红黄蓝的“小小活动家”是什么?
这个车怎么抬高车把
女人无才便是德,男人无财是什么?
福建省泉晟贸易有限公司地址在哪,我要去那里
西湖国贸中心地下停车库怎么去啊,有知道地址
中国人民银行(元谋县支行)地址有知道的么?有
武平县仙乐园怎么去啊,有事要去办理
一段路,甲走完用8分钟,乙走完用9分钟。甲和
爱国巷/解放南路(路口)地址在什么地方,想过
如字开头 成语 如 在杯背 如 针毡
QQ怎么进行屏幕分享
推荐资讯
上海路/兆麟街(路口)这个地址在什么地方,我
汉语姓氏在日语里按照什么规则发音?另音读和
中国邮政储蓄银行(物茂邮政所)地址在什么地方
易贝乐少儿英语清城中心在哪里啊,我有事要去
准备注册个人姓名域名,姓名全拼是liwei,先
战争有害于社会发展
南孚1号电池的具体参数(越具体越好)
中国电信天利成旅顺长江路合作厅地址有知道的
一人名下可以有二个宅基证吗?
禁闭岛 最后一段字幕的对白是什么
请问研究生考试中的专业一和专业二是什么啊
祥云居饭庄在什么地方啊,我要过去处理事情
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?