[color=blue][b]1. 算法分析的评价体系[/b][/color]
评价算法的三条主要标准是:
[b](1) 算法实现所消耗的时间[/b]
[b](2) 算法实现所消耗的存储空间,其中主要考虑辅助存储空间[/b]
[b](3) 算法应易于理解、易于编码、易于调试。[/b]
[color=blue][b]2. 算法的时间复杂性[/b][/color]
[color=red][b]2.1 和算法执行相关的因素[/b][/color]
[b](1) 问题中数据存储的数据结构[/b]
[b](2) 算法采用的数学模型[/b]
[b](3) 算法设计策略[/b]
[b](4) 问题的规模[/b]
[b](5) 实现算法的程序设计语言[/b]
[b] (6) 编译算法产生的机器代码的质量[/b]
[b](7) 计算机执行指令的速度[/b]
[b][color=red]2.2 算法时间效率的衡量方法[/color][/b]
[b](1) 事后分析法[/b]
先将算法用程序设计语言实现,然后度量程序的运行时间,这种方法成为事后分析法。你能想到它的缺点???
[b](2) 事前分析估算法[/b]
一个算法的运行工作量的大小,只依赖于问题的规模(通常用整数量n表示),或者说算法的时间效率是问题规模的函数。
假如随着问题规模n的增长,算法执行时间的增长率和函数f(n)的增长率相同,则可记作:T(n) = O(f(n)), T(n)简称时间复杂度,
O是数量级的符号。
[color=red][b]2.3 时间复杂度估算[/b][/color]
算法的执行时间 = $[原操作的执行次数 * 原操作的执行时间], 其中, $表示累加.
语句的频度指的是该语句重复执行的次数。
[b](1) 例子1[/b]
分析: 算法段中语句"x++", "k<=n", "x++"的频度是n*n, 语句"j=1", "k=1"的频度是1, 语句"j<=n", "j++"的频度是n。
因此,算法运行的时间是3*n*n + 2*n + 2
[b](2) 例子2[/b]
[b](3) O[/b]
在算法的复杂度分析中经常使用一个记号O,读作大O,它是数量级Order的第一个字母。当一个算法的运行时间为n*n+n+1时,
由于n*n+n+1和n*n的数量级相等(该表达式当n足够大时约等于n*n),称它为这个算法的渐进时间复杂度,简称算法的时间复杂度,
记作:T(n) = O(n*n).
[b](4) 几种数量级[/b]
[b][color=brown][i] O(1) 常数级
O(logn) 对数级
O(n) 线性级
O(n的c次方) 多项式级
O(c的n次方) 指数级
O(n!) 阶乘级[/i][/color][/b]
[b](5) 问题时间复杂度的上界和下界[/b]
[b](6) 算法时间复杂度的最好情况和最坏情况[/b]
[color=red][b]2.4 算法的空间复杂性[/b][/color]
[b](1) 输入数据所占空间[/b]
[b](2) 程序本身所占空间[/b]
[b](3) 辅助存储空间[/b]
评价算法的三条主要标准是:
[b](1) 算法实现所消耗的时间[/b]
[b](2) 算法实现所消耗的存储空间,其中主要考虑辅助存储空间[/b]
[b](3) 算法应易于理解、易于编码、易于调试。[/b]
[color=blue][b]2. 算法的时间复杂性[/b][/color]
[color=red][b]2.1 和算法执行相关的因素[/b][/color]
[b](1) 问题中数据存储的数据结构[/b]
[b](2) 算法采用的数学模型[/b]
[b](3) 算法设计策略[/b]
[b](4) 问题的规模[/b]
[b](5) 实现算法的程序设计语言[/b]
[b] (6) 编译算法产生的机器代码的质量[/b]
[b](7) 计算机执行指令的速度[/b]
[b][color=red]2.2 算法时间效率的衡量方法[/color][/b]
[b](1) 事后分析法[/b]
先将算法用程序设计语言实现,然后度量程序的运行时间,这种方法成为事后分析法。你能想到它的缺点???
[b](2) 事前分析估算法[/b]
一个算法的运行工作量的大小,只依赖于问题的规模(通常用整数量n表示),或者说算法的时间效率是问题规模的函数。
假如随着问题规模n的增长,算法执行时间的增长率和函数f(n)的增长率相同,则可记作:T(n) = O(f(n)), T(n)简称时间复杂度,
O是数量级的符号。
[color=red][b]2.3 时间复杂度估算[/b][/color]
算法的执行时间 = $[原操作的执行次数 * 原操作的执行时间], 其中, $表示累加.
语句的频度指的是该语句重复执行的次数。
[b](1) 例子1[/b]
for (j = 1; j <= n; j++)
for(k = 1; k <= n; k++)
x++;
分析: 算法段中语句"x++", "k<=n", "x++"的频度是n*n, 语句"j=1", "k=1"的频度是1, 语句"j<=n", "j++"的频度是n。
因此,算法运行的时间是3*n*n + 2*n + 2
[b](2) 例子2[/b]
for (j = 1; j <= n; j++)
for(k = 1; k <= n; k++)
for(i = 1; i <= n; i++)
s++;
该算法的时间复杂度为近似n*n*n.
[b](3) O[/b]
在算法的复杂度分析中经常使用一个记号O,读作大O,它是数量级Order的第一个字母。当一个算法的运行时间为n*n+n+1时,
由于n*n+n+1和n*n的数量级相等(该表达式当n足够大时约等于n*n),称它为这个算法的渐进时间复杂度,简称算法的时间复杂度,
记作:T(n) = O(n*n).
[b](4) 几种数量级[/b]
[b][color=brown][i] O(1) 常数级
O(logn) 对数级
O(n) 线性级
O(n的c次方) 多项式级
O(c的n次方) 指数级
O(n!) 阶乘级[/i][/color][/b]
[b](5) 问题时间复杂度的上界和下界[/b]
[b](6) 算法时间复杂度的最好情况和最坏情况[/b]
[color=red][b]2.4 算法的空间复杂性[/b][/color]
[b](1) 输入数据所占空间[/b]
[b](2) 程序本身所占空间[/b]
[b](3) 辅助存储空间[/b]