第二章 算法

 

目录

 一.算法的定义

二.算法特性

三.算法设计要求

四.算法效率的度量方法

五.函数的渐近增长

六.算法的时间复杂度

七.空间复杂度


一.算法的定义

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作;

二.算法特性

  • 输入性

  • 输出性

  • 有穷性

  • 确定性:每一步都具有确定的含义,不会出现二义性

  • 可行性:每一步都是可执行的

三.算法设计要求

  • 正确性:能正确反映问题的需求,能够得到问题的正确答案
  • 可读性
  • 健壮性:对于不合法的输入数据能正确处理,不会产生bug
  • 时间效率高和存储量低

四.算法效率的度量方法

  • 事后统计方法:通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序运行时间进行比较,从而确定算法效率的高低;
  • 事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算;

五.函数的渐近增长

  • 比较算法A 2n+3次操作次数和算法B 3n+1次操作次数的效率
次数2n+32n3n+13n
15243
27476
396109
1023203130
100203200301300

可以看出,1.当n≥3,2n+3次数少于3n+1,因此算法A此时优于算法B;

                  2.随着n增大,加法常数不影响算法效率;

定义:函数的渐进增长,给定两个函数f(n)和g(n),若存在一个整数N,使得当n>N时,f(n)总是比g(n)大,则f(n)增长大于g(n);

  • 比较算法A 4n+8次操作次数和算法B 2n*n+1次操作次数的效率
    次数4n+84n2n*n+12n*n
    112131
    216294
    3203199
    104810201100
    1004081002000110000
    10004008100020000011000000
    可以看出,1.当n≥10,4n+8次数少于2n*n+1,因此算法A此时优于算法B;

                         2.随着n增大,最高次项的常系数不影响算法效率;

  • 比较算法A 2n*n+3n+1次操作次数和算法B 2n*n*n+3n+1次操作次数的效率
次数2n*n+3n+1n*n2n*n*n+3n+1n*n*n
16161
2154238
32896427
1023110020311000
100203011000020003011000000

可以看出,1.当n≥2,2n*n+3n+1次数少于2n*n*n+3n+1,因此算法A此时优于算法B;

                  2.随着n增大,最高次项的指数大的,函数增长也快;

总结:判断一个算法效率时,应该更关注最高次项的阶数,函数的常数与系数可以忽略;

六.算法的时间复杂度

  1. 定义:语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级,时间复杂度记为T(n)=O(f(n)),一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法;
  2. 推导公式

1).用常数1取代运行时间中的所有加法常数;

2).在修改后的运行次数函数中,只保留最高阶项;

3).如果最高阶项存在且不是1,则去掉这个项的系数;

    3.举例

  • 常数阶:f(n)=3,时间复杂度为O(1)
int sum = 0,n = 100;		/* 执行一次 */
sum = (1 + n) * n / 2;		/* 执行一次 */
printf("%d", sum);			/* 执行一次 */
  • 线性阶:f(n)=n,时间复杂度为O(n)
int i;                   /* 执行一次 */
for (i=0;i<n;i++)        /* 执行n次 */
{
    i=i+0;              /* 执行1次,忽略 */
}
  • 对数阶:f(n)=log2n,时间复杂度为O(logn)
int count = 1;           /* 执行一次 */
while count < n)        /* 执行log2n次 */
{
	count = count * 2;
}
  • 平方阶:f(n)=n*n,时间复杂度为O(n*n)
int i,j;
for(i = 0; i < n; i++)      /* 执行n次 */
{
	for(j = 0; j < n; j++)  /* 执行n次 */                   
	{                                      
		/* 时间复杂度为O(1)的程序步骤序列 */
	}                                      
}

若内循环次数改为m,则复杂度为O(n*m),因此实际上可以理解为:循环的时间复杂度等于循环体的复杂度*该循环体运行的次数;

   4.常见时间复杂度耗费时间:

  O(1)<O(logn)<O(n)<O(nlogn)<O(n*n)<O(n*n*n)<O(2*n的n次方)<O(n!)<O(n*n的n次方)

七.空间复杂度

1.定义:指通过计算算法所需的存储空间实现,计算公式是S(n)=O(f(n)),n是问题的规模,f(n)是语句关于n所占存储空间的函数;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值