算法 Algorithm
特征
1.有限的指令集
2.不一定有输入,但一定要有输出
3.有穷性,在有限步骤之后停止
4.每一条指令明确无歧义,计算机可处理,不依赖任何一种计算机语言和具体的实现手段。
C语言程序段运行时间的测量
必须调用time.h
clock():捕捉从程序开始运行到该函数被调用时所消耗的时间,时间单位是clock tick,“时钟打点”。
常数CLK_TCK:机器时钟每秒的打点数。(不同机器该常数可能有差异)
原理:程序开始运行后,机器时钟一直在打点,到了待测程序段前,调用一次clock(),返回此时的打点数start;待测程序段运行完后,再调用一次,得到打点数stop。两者之差除以CLK_TCK,得到时间,单位为sec,即s。通过这种方式便可测出某一段程序的运行时间。
具体程序如下:
#include<stdio.h>
#include<time.h>
clock_t start,stop //clock_t是函数clock()的返回变量类型
double duration
int mian
{
/*不在测试范围内的准备工作写在start之前*/
start = clock(); //开始计时
MyFunction; //待测的程序段MyFunction
stop = clock(); //终止计时
duration = (double)((stop-start)/CLT_TCK);
/*其它不在测试范围内的处理写在stop之后*/
printf("duration = 6.2e%\n",duration);
}
算法的复杂度
空间复杂度s(n):占用存储单元的长度
时间复杂度t(n):耗费时间的长度
需要我们关注的是,随着要处理数据规模的增大,复杂度的增长趋势。所以引入复杂度的渐进表示法。
O(f(n)):复杂度的上界
Ω(f(n)):复杂度的下界
θ(f(n)):上界和下界相当时的统一表示
它们是不唯一的。比如某个程序复杂度为n的指数倍(t的平方、立方…),那么f(t)表示的指数不同,其O(f(t))就不同。研究时不能使上界过大,下界过小就行。
分析技巧:
复杂度比较:
2
n
>
n
2
>
n
l
o
g
n
>
n
>
l
o
g
n
2^{n}>n^2>nlogn>n>logn
2n>n2>nlogn>n>logn