分治算法的复杂度分析

前言
这是啥?you see see you,one day day?
说起复杂度,我其实现在还不是很会计算时间复杂度,纠结于对算法的实现过程可能有一定的不清楚。但是尽力尝试就行,学习的时候有借鉴《趣学算法》,觉得这本书很不错。
附上常用的计算公式:
n * O( 1 ) = O( n );
c * O( n ) = O( n ); 【常数系数直接省略】
O( cm ) + O( cn ) = O( cm ); 【常数相加取最大项】
O( m ) * O( n ) = O( m * n);



分治算法,就是把一个大的问题分为很多个形式相同的子问题,把问题规模缩小。假使,最初的问题规模是N,这些小的子问题的个数为a,子问题的规模是n / b,分解或者合并的复杂度表示为f( n ),那么总的时间复杂度就可以表示为
在这里插入图片描述
这可以算作计算的通用公式了。

很明显,这是一个递推的表达式,我们在数学中计算可得:
为了便于计算,赋初值,子问题规模为 b / 2:
分治算法的复杂度分析_第1张图片



分治递归树
分治算法的复杂度分析_第2张图片
从图中我们可知:
时间复杂度 = 叶子数 *T(1)+成本和 = 2xT(1) +xO(n);
同样的有n = 2x,则x = log n,那么代入计算可得时间复杂度等于O(nlogn).


大师解法
在这里插入图片描述
分治算法的复杂度分析_第3张图片
分治算法的复杂度分析_第4张图片
最后一层的成本约等于
在这里插入图片描述
既然最后一层的成本约等于叶子数,那么叶子数*T(1)就可以省略了,即时间复杂度等于成本和。,因为他们相当于一个常数倍的关系。
根据以上的图我们发现,从上到下一层,每一层之间的时间成本具有一个a/bd的关系,且很明显如果这个公比是小于一的,呈递减的趋势,那么我们可以计算出每一层的成本,直接略估计小于等于O(nd),即第一层的成本;但是,如果公比大于一,那么时间复杂度就可以用最后一层的成本表示
在这里插入图片描述
除了以上两种可能,还有相等的这一种情况,那么直接利用第一层的成本乘以树的高度即可:
在这里插入图片描述


其他的也都可以采用这种做树的方式计算,再讨论公比即可。

你可能感兴趣的:(数据结构)