学习视频:数据结构与算法基础(青岛大学-王卓)
算法的定义
解决问题的方法和步骤(有穷性、确定性、可行性、输入、输出);
程序 = 数据结构 + 算法。
ps:健壮性,指处理出错的方法不应是中断程序的执行,而是输出一个代表出错的值。
算法的时间量度
一般采取事前分析的方法:
算法运行时间 = 一个简单操作所需的时间 * 简单操作的次数 ;
算法运行时间 = ∑ 每条语句执行的次数 (又称为语句频度)* 该语句指向一次所需的时间;
每条语句执行一次need的时间一般随机器而异,与算法无关,所以我们可以假设每条语句所需的时间均为单位时间,这样,算法运行时间就只取决于语句频度了。
算法运行时间 = 语句频度 * 单位时间;
ex:n*n矩阵相乘
for(i = 1; i <= n; i++){
//执行n+1次
for(j = 1; j <= n; j++ ){
//执行n*(n+1)次
c[i][j] = 0; //执行n*n次
for(k = 0; k < n; k++) //执行n*n*(n+1)次
c[i][j] = c[i][j] + a[i][k] * b[k][j]; //执行n*n*n次
}
}
上述算法的时间消耗T(n)= 2 * n³ + 3 * n² + 2n + 1;
ex:算法的比较
T1(n) = 10n T2(n) = 5n²
根据算法的渐进时间复杂度:若有某个辅助函数f(n),使得当n趋近于无穷大,T(n)/f(n) 的极限值为不等于零的常数,则称f(n)是T(n)的同量级函数,记作T(n) = O(f(n)),O(f(n))为算法的渐进时间复杂度;
所以T1好;
ex:T(n)= 2 * n³ + 3 * n² + 2n + 1,求其时间复杂度?
n趋近无穷时,T(n)/n³ = 2;
T(n) = O(n³ );
因此一般情况下,不必计算所有操作执行次数,只考虑算法中的基本操作(一般为次数最大的,即频度最大)执行的次数n,
排序:n为记录数;
矩阵:n为矩阵阶数;
多项式:n为项数;
集合:n我元素个数;
树: n为结点个数;
图: n为定点数或边数;
时间复杂度分析例题
attention:时间复杂度是由嵌套最深层语句的频度决定的
first:找到执行次数最多的;
second:找到f(n);
third::取其数量级用符号"O"表示
有时,算法中基本操作重复执行的次数还随着问题的数据集不同而不同,例如顺寻查找a[i]中等于e的元素,返回其所在位置,最好情况1次,最坏情况n次,评价时间复杂度为O(n);(一般考虑最坏)
加法规则:
T(n) = T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(Max(f(n),g(n)))
乘法规则:
T(n) = T1(n) * T2(n) = O(f(n)) * O(g(n)) = O(f(n) * g(n))
算法时间效率比较
算法的空间量度
空间复杂度:算法所需存储空间的度量
S(n) = O(f(n)),n为问题的规模大小
学习视频:数据结构与算法基础(青岛大学-王卓)