《大话数据结构》第二章:算法

2.1 开场白

由浅入深

2.2 数据结构与算法关系

为什么要放到一起讲
是为了更好的理解数据结构,并不会细谈算法的方方面面。

2.3 两种算法的比较

计算1+2+3+……+100
第一种:for循环
在这里插入图片描述
但是真的好吗?高效吗?
第二种:高斯求和
在这里插入图片描述
如果n大就更改数据类型为长整型,防止溢出

2.4 算法algorithm定义

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
对于给的问题,可以有多个算法来解决的。是没有通用的算法的,具体问题具体分析。

2.5 算法的特性

2.5.1 输入输出

算法具有0个或多个输入。至少有一个或多个输出。可以是打印也可以是返回一个或多个值。

2.5.2 有穷性

是指算法在执行有限的步骤之后,自动结束而不会出现无线循环,并且每一个步骤都在可接受的时间内完成。

2.5.3 确定性

算法的每一步都有具体确定的含义,不会出现二义性。
在一定条件下,只有一条执行路径,相同的输入只能有唯一的输出结果。每个步骤被精确定义而无歧义。

2.5.4 可行性

算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。
可行性是算法可以转化为程序上机运行,并得到正确的结果。

2.6 算法设计的要求

尽管算法不唯一,相对好的算法是存在的。
什么是好的算法

2.6.1 正确性

是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。

正确应该有4个层次
1.算法程序无语法错误
2.对于合法的输入数据能够产生满足要求的输出结果
3.对于非法的数据能够得出满足规格说明的结果
4. 对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果

算法的正确性大部分情况下都不可能用程式来证明,而用数学方法证明。一般情况下我们把层次3作为一个算法是否正确的标准

2.6.2 可读性

算法设计的另一目的是为了便于阅读、理解和交流。

2.6.3 健壮性

当输入数据不合法时,算法也能做出相关的处理,而不是产生异常或莫名其妙的结果

2.6.4 时间效率高和存储量低

执行时间短的效率高。
存储量需求指算法在执行过程中需要的最大存储空间,主要指算法程序运行时所占用的内存或外部硬件存储空间。
用最少的存储空间,最少的时间,办同样的事就是好算法。

2.7 算法效率的度量方法

如何度量一个算法的执行时间?

2.7.1 事后统计方法

通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
但有很多缺陷 一般不考虑

2.7.2 事先分析估算方法

在计算机程序编制前,依据统计方法对算法进行估算

消耗时间取决于下列因素

  1. 算法采用的策略、方法(根本)
  2. 编译产生的代码质量(软件)
  3. 问题的输入规模
  4. 机器执行指令的速度(硬件)

所以一个程序运行时间,依赖于算法好坏和问题的输入规模(输入量的多少)。

在这里插入图片描述
在这里插入图片描述
最终,在分析程序的运行时间时,最重要的时把程序看作是独立于程序设计语言的算法或一系列步骤

重要的是把基本操作的数量与输入规模关联起来,即基本操作的数量必须表示成输入规模的函数
在这里插入图片描述

随着n的值越来越大,他们在时间上的效率也越来越大

2.8 函数的渐近增长

第一个例子

给两个算法:
A:2n+3次操作
B:3n+1次
谁更快 不一定要看n的取值
在这里插入图片描述

在这里插入图片描述

可以看出随着n的增大+3或者+1实际上不影响,忽视这些加法常数变成A’ B’

第二个例子

C 4n+8 D 2n2+1
在这里插入图片描述

与最高此项相乘的常数并不重要

第三个例子

在这里插入图片描述

最高次项的指数大的,函数随着n的增长,结果也会变得增长的很快

第四个例子

在这里插入图片描述
判断一个算法的效率时,函数中的常数和其他次要项可以忽略不记,而更应该关注主项(最高阶项)的阶数。

对比几个算法的关键执行函数的渐近增长性,分析出:某个算法,随着n的增大,它会越来越优于另一算法或者越来越差。

这其实就是事前估算方法的理论依据,通过算法的时间复杂度来估算算法时间效率。

2.9 算法时间复杂度

2.9.1 算法时间复杂度定义

在这里插入图片描述
在这里插入图片描述

2

2.9.2 推导大O阶方法

就是总结的4个例子
在这里插入图片描述

2.9.3 常数阶 O(1)

不管常数时多少都是O(1)
对于单纯分支结构(不包含在循环结构中),无论真假,执行的次数都是一定的,不会随着n的变大而变大,其时间复杂度也是O(1)

2.9.4 线性阶O(n)

线性阶的循环结构 需要确定某个特定语句或某个语句集运行的次数,关键要分析循环结构的运行情况。

2.9.5 对数阶O(logn)

在这里插入图片描述

2.9.6 平方阶

对与双重循环

第一个例子

内外都是从0开始的或是内外两个不影响
循环的时间复杂度就是内部循环体的复杂度乘以该循环运行的次数

第二个例子

在这里插入图片描述
在这里插入图片描述

第三个例子

对方法调用的时间复杂度
主函数
在这里插入图片描述
假如函数时这样的
在这里插入图片描述
假如变了
在这里插入图片描述

最终
在这里插入图片描述
O(n2)

2.10 常见的时间复杂度

在这里插入图片描述

2.11 最坏情况与平均情况

查找一个有n个随机数字数组中的某个数字,最好的情况是一下就找到了,时间复杂度O(1),最坏情况就在最后一个数字,O(n)。平均就是n/2
最坏情况运行时间是一种保证,那就是运行时间不能再长了。在应用中,这是一种最重要的需求,通常,除非特别指定,我们提到的运行时间就是最坏情况的运行时间。
平均运行时间是所有情况中最有意义的,因为他是期望的运行时间。 但是比较难分析,一般都是通过运行一定的数量的实验数据估算出来的。
一般没有特殊说明,都是指最坏时间复杂度。

2.12 算法空间复杂度

用空间换取时间
例子:
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值