一般将算法中基本操作的执行次数作为算法时间复杂度的度量。
而评价一个算法流程的好坏,先看时间复杂度的指标,然后再分
析不同数据样本下的实际运行时间,也就是常数项时间。
常数时间的操作,一个操场如果和数据量么有关系,每次都是固定时间内完成的操作,叫做常数操作。在常数操作数量的表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果记为f(N),那么时间复杂度为O(f(N))。而算法的时间复杂度一般采取最怀情况的标准。
时间复杂度的具体计算
时间复杂度根据是否递归调用将其分为递归调用和非递归调用。
一非递归调用
1)对非递归分析的关键是建立一个代表算法运行时间的求和表达式。
例如对一下算法的分析
将两个有序升序序列合为一个升序序列
void Union(int A[], int n, int B[], int b){
int i = 0,j = 0, k =0;
while(i<n && j<m){
if(A[i] <= B[j]) C[k++] = A[i++];
else C[k++] = B[j++];
}
while(j<n) C[k++] = A[i++];
while(j<m) C[k++] = B[i++];
}
对此算法进行分析:
1)最好情况分析:一个数组的[0]处的值大于另外一个中的每一个,则只需进行比较O(min(m,n))次。
2)最坏情况:将两个数组都遍历比较一次则O(m+n)
对顺序表查找的分析(从第一个位置起开始查找)
1)若第一个位置的数为所查的K则为最好情况O(1);
2)如最后一个位置的值为所查的值K,则为最坏情况 O(n);
设数据为等概率事件,则 = = = O(n)
对冒泡进行分析
冒泡的基本语句为比较操作,其执行次数取决于排序的趟数。
最好情况:待排序为升序序列,算法只进行一趟,进行了n-1次比较 =O(n)
最坏情况:待排序记录为降序,进行了n-1趟排列,第i趟执行了n-i次,
所以平均次数 = = O()
对于平均情况需考虑初始序列的逆序个数。而初始序列的逆序个数也就是记录比较次数的下界。
如n个记录有n!种排列,所有排列中逆序的平均个数就是算法所需平均比较次数。
集合{1,2,3} 有3! = 6种排列,123(0) 132(1) 213(1) 231(2) 312(2) 321(3)
令S(k)表示逆序个数为k的排列数目,则S(0)=1 S(1)=2 S(2)=2 S(3)=1
平均个数m(n) = =
最好情况 逆序个数为0 最坏逆序个数为
m(n) = = = =
对于递归算法
递归算法实际上是一种分而治之的方法。通常满足如下的分治递推式
递推式描述的是:大小为n的原问题,分解为若干个大小为 的子问题,其中有a个子问题需要求解, 是最后合并各个子问题所需要的工作量
设T(n) 是一个非递减的函数切满足分治递推公式则
若cn^k中k = 1则
吐槽:数学公式的编写真的好恶心啊!!!
网友评论