《数据结构》- -第一章
一·算法
算法是对特定问题求解步骤的一种描述,它是指令的有限序列。
二·特性
(1)有穷性:算法必须总是在执行有穷步之后结束。
(2)确定性:算法中每一条指令必须有确切的含义。
(3)可行性:算法一定是能行的
(4)输入输出:算法可以有0个或多个输入 一个或多个输出
一个好的算法应该具有正确性,可读性,健壮性,高效率和低存储量的特征
三·算法时间效率度量
(1)可以忽略加法常量
O(2n + 3) = O(2n)
(2)与最高次项相乘的常数可忽略
O(2n^2) = O(n^2)
(3)最高次项的指数大的,函数随着 n 的增长,结果也会变得增长得更快
O(n^3) > O(n^2)
(4)判断一个算法的(时间)效率时,函数中常数和其他次要项常常可以忽略,而更应该关注主项(最高阶项)的阶数
O(2n^2) = O(n^2+3n+1)
O(n^3) > O(n^2)
四·时间复杂度的计算
(1)用常数 1 取代运行时间中的所有加法常数
(2)在修改后的运行次数函数中,只保留最高阶项
(3)如果最高阶项存在且不是 1,则去除与这个项相乘的常数(即 O(2n^2) = O(n^2),得到的结果就是大 O 阶
例:
int i,j;
for ( i = 0; i < n; ++i){
for(j = i; j < n; ++j){
/*时间复杂度为 O(1) 的程序步骤序列 */
}
}
五·分析
对于外循环,其时间复杂度为 O(n);
对于内循环环,当 i=0 时,内循环执行了 n 次,当 i=1 时,执行了 n-1 次,······当 i=n-1 时,执行了 1 次。
因此内循环总的执行次数为:
n + (n-1) + (n-2) + \cdots + 1 = \frac{n(n+1)}{2} = \frac{n^2}{2} + \frac{n}{2}
根据大 O 阶推导方法,最终上述代码的时间复杂度为 :
六·常见的时间复杂度