算法的复杂度

算法 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))就不同。研究时不能使上界过大,下界过小就行。

分析技巧:

算法的复杂度_第1张图片

复杂度比较:

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
算法的复杂度_第2张图片

你可能感兴趣的:(数据结构)