对于一个问题, 可以有多种算法,那么如何来衡量算法的优劣呢?
人们一般从两个方面来衡量:
o:时间效率,即算法处理数据所耗费的时间,用时间复杂度来表示。
o:空间效率,即算法所需求的存储量的大小,用空间复杂度来表示。
两者不可同时兼顾,一般取时间效率,时间效率被认为重要一些。
1,时间复杂度分析
对于解决一个问题的算法, 执行时间短的显然比执行时间场的时间效率高。即执行时间短的算法比执行时间长的算法时间复杂度要低。
那么算法的执行时间的长短是如何度量的呢? 一种方法是编制一个程序实现这个算法, 然后输入不同的数据运行这个程序,测定该程序运行的时间,这成为“事后统计法”。另一种方法是分析算法运行的时间, 称为“事前统计法”,它不上机运行依算法编制的程序,而是分析影响算法执行时间的各种因素,从而估算出算法执行的时间。其中,一个最重要的因素是输入算法的数据量称为“问题规模”。因此, 一个算法的执行时间T可被表示为问题规模n的一个函数T(n)。
一般用算法中语句被执行的次数来表示算法的时间效率(算法的时间复杂度)。
2,常见的时间复杂度
(1)常量阶
算法的时间复杂度为常量,它不随问题规模n的大小而变化。
记为:T(n)=O(1)
(2)线性阶
算法的时间复杂度与问题规模n成线性关系。
记为:T(n)=O(n)
(3)平方阶和立方阶
算法的时间复杂度和问题规模n成平房或立方关系。
记为:T(n)=O(n²)或T(n)=O(n³)
(4)对数阶
算法的时间复杂度与问题规模n成对数关系。
记为:T(n)=O(㏒2n)
此外, 算法的时间复杂度还有指数阶O(2n)和阶乘阶O(n!)
这些时间复杂度之间的关系为:
O(1) < O(log2n) < O(n) < O(n log2n) < O(n²) < O(n³) < O(2的n次方) < O(n!) < O(n的n次方)
3,最坏情况下的时间复杂度
对于有些算法来说,时间复杂度除了和问题规模n有关以外, 还与算法的输入项有关。例如:
int i,m;
m=a[0];
for(i=1;i<n;i++)
if(a[i]>m)
m=a[i];
return m;
算法的关键在于“m=a[i]”,其执行的次数与输入的n个元素有关,如果第一元素即为最大值,则执行次数为0,时间复杂度为O(1),称为最好情况下的时间复杂度;如果最后一个元素为最大值, 则执行n-1次,时间复杂度为O(n),称为最坏情况下的时间复杂度。如果最大值出现的位置是随机的,则执行次数为n/2次, 时间复杂度为O(n),称为平均情况下的时间复杂度。 通常取最坏情况下的时间复杂度,即O(n)
4,空间复杂度分析
算法的空间复杂度就是算法或程序运行时所占用的存储空间。一般只统计数据部分所占用的存储空间,而不统计代码部分所占用的存储空间。
总结: 第一章的概述暂时告一段路。 了了几页纸,价值超千金呀!这几天把书里的习题做一做, 再用汇编程序替代书里的C程序实现几种简单的算法。
- [somniumchase] 我一运行就说没有数字 01/01 11:44
- [游客] 为什么啊 08/07 15:36
- [游客] 如果想快一些 就改下面这里 dx值改成1H delay: push ax 04/19 02:53
- [lshhjx] 注释在程序中很重要,楼主不知道吗? 12/08 13:40
- [biaggi] 看不明白,在下還須學習 11/06 08:11
- [游客] 我运行的时候直接显示Unkown filename跳出了- -请问怎么改 06/16 21:44
- [游客] 勿庸置疑,注释是好习惯。与人方便自己方便。 04/12 10:33
- [游客] 老实说,看着真心累呀! 04/07 18:37
- [游客] 很无语,初学者就多看书,不要动不动要别人注释,基础打好了,再自己注释,这样比别人帮你注释好得多 12/17 19:43
- [dgkepu] 初学者:不懂,希望有多点注释带着学习学习! 12/07 20:52
- [游客] windows 7是一个64Bit操作系统,它不兼容DOS,无法识别16Bit系统。重装系统wind 02/28 21:05
- [游客] windows 7是一个64Bit操作系统,它不兼容DOS,无法识别16Bit系统。重装系统wind 02/28 21:05
- [466987333] 你好,高手,我想请教一个问题。 我用的是win7操作系统,32位的,里面没有找masm目录,是不是 12/12 17:30
- [lanfioncc] 那个太高级了。。。我还有点看不懂。。不过谢谢!!! 11/27 11:23
- [yc2010] 实验16中的 table: dw sub1,sub2,sub3,sub4 可不可以改成呢? 09/11 09:08
- [yc2010] mov bl,ah mov bh,0 add bx,bx ----------->这里为 09/07 21:03
- [yc2010] 为什么要add bx,bx呢? 09/07 20:55
- [yc2010] 那是不是像table[bx],ds[bx]....等(内存单元)都是表示一个字节呢? 09/06 21:10
- [masmaster] 杨季文的《80X86汇编语言程序设计教程》 09/01 12:52
- [游客] to masmaster shl左移4位,那al传进来的4,5,6位背景色不就没了. 为什 09/01 11:00