第2章--算法,其实有趣又有用

从定义说起

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

基本特性

输入输出:0或多个输入,1或多个输出
有穷:执行有限步骤后,自动结束而不会出现无限循环
确定:每一步骤都具有确定含义,不存在二义性
可行:每一步都在有限次数内完成

基本特性定义了一个算法的雏形,但一个“好”算法还需要具备更多的特性。就像房子建好后,要变成一个舒服的居住环境,还需要做更多的装修与装饰工作,也就是所谓的“设计”。

算法设计的要求

正确性——输入、输出、加工处理无歧义性,能正常反映问题的需求、能得到问题的正确答案。

分为四个层次:
1.语法无错
2.对合法输入能产生满足要求的输出结果
3.对非法输入能得出满足规格说明的结果
4.对精心选择的、甚至故意刁难的测试数据,都有满足要求的输出结果

一般情况下,把 层次3 作为一个算法是否正确的标准。

可读性——便于阅读、理解和交流、维护

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

时间效率高和存储量低

算法效率度量方法

事后统计——利用计算机计时器对不同算法编制的程序的运行时间进行比较
不科学、不准确,存在较大缺陷,实际中不使用。

事前分析估算——在程序编制前,依据统计方法对算法进行估算

根据经验,程序运行时间取决于下列因素:
1.算法采用的策略、方法 决定算法好坏的根本
2.编译产生的代码质量 主要由软件来支持
3.问题的输入规模 实际问题决定
4.机器执行指令的速度 取决于硬件性能

以上分析可以看出,
一个程序的运行时间,依赖于算法的好坏问题的输入规模

算法时间复杂度

大o记法:
O[1]常数阶 < O[n]线数阶 < O[n2]平方阶 < O[nlogn]对数阶

O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

推导大O阶:
1.常数1取代运行时间中的所有加法常数
2.在修改后的运行次数函数中,只保留最高阶项
3.如果最高阶项存在且不是1,则去除与这个项相乘的常数

比如, f(n)=3n2+2n+1
最终可以记为 O(n2)

理解大O推导不难,难的是分析数列的一些运算,更多的是考察你的数学知识和能力

强调算法的重要性

一台老式CPU的计算机运行 O(n) 的程序和一台速度提高100倍的新式CPU运行 O(n2) 的程序。最终效率高的胜利方式却是老式CPU的计算机,原因在于算法的优劣直接决定了程序运行的效率

作者的话:
利用算法分析工具,改进自己的代码,让计算机轻松一点,这样你就更加胜人一筹

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值