从定义说起
算法,解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
基本特性
输入输出:0或多个输入,1或多个输出
有穷:执行有限步骤后,自动结束而不会出现无限循环
确定:每一步骤都具有确定含义,不存在二义性
可行:每一步都在有限次数内完成
基本特性定义了一个算法的雏形,但一个“好”算法还需要具备更多的特性。就像房子建好后,要变成一个舒服的居住环境,还需要做更多的装修与装饰工作,也就是所谓的“设计”。
算法设计的要求
正确性——输入、输出、加工处理无歧义性,能正常反映问题的需求、能得到问题的正确答案。
分为四个层次:
1.语法无错
2.对合法输入能产生满足要求的输出结果
3.对非法输入能得出满足规格说明的结果
4.对精心选择的、甚至故意刁难的测试数据,都有满足要求的输出结果
一般情况下,把 层次3 作为一个算法是否正确的标准。
可读性——便于阅读、理解和交流、维护
健壮性——当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名奇妙的结果。
时间效率高和存储量低
算法效率度量方法
事后统计——利用计算机计时器对不同算法编制的程序的运行时间进行比较
不科学、不准确,存在较大缺陷,实际中不使用。
事前分析估算——在程序编制前,依据统计方法对算法进行估算
根据经验,程序运行时间取决于下列因素:
1.算法采用的策略、方法 决定算法好坏的根本
2.编译产生的代码质量 主要由软件来支持
3.问题的输入规模 实际问题决定
4.机器执行指令的速度 取决于硬件性能
以上分析可以看出,
一个程序的运行时间,依赖于算法的好坏和问题的输入规模。
算法时间复杂度
大o记法:
O[1]常数阶 < O[n]线数阶 < O[n2]平方阶 < O[nlogn]对数阶
推导大O阶:
1.常数1取代运行时间中的所有加法常数
2.在修改后的运行次数函数中,只保留最高阶项
3.如果最高阶项存在且不是1,则去除与这个项相乘的常数
比如,
f(n)=3n2+2n+1
最终可以记为
O(n2)
理解大O推导不难,难的是分析数列的一些运算,更多的是考察你的数学知识和能力
强调算法的重要性
一台老式CPU的计算机运行 O(n) 的程序和一台速度提高100倍的新式CPU运行 O(n2) 的程序。最终效率高的胜利方式却是老式CPU的计算机,原因在于算法的优劣直接决定了程序运行的效率。
作者的话:
利用算法分析工具,改进自己的代码,让计算机轻松一点,这样你就更加胜人一筹