一丶基本概念
1.算法设计的任务:对一个具体的问题,设计一种良好的算法,获取最佳的结果.
2.什么是算法:通俗说是一种最优解,
3.程序=数据结构+算法+程序设计语言
二丶基础算法
1.枚举(穷举)算法思想
特点:1.依赖于计算机强大的运算能力来穷尽每一个可能的情况,从而达到解决问题的目的.
2.该算法效率不高.
3.该算法适用于一些没有规律可循的环境中.
两个必要条件:1.对于一种可能的情况,计算其结果.
2.判断结果是否满足要求,如果不满足,则执行第一步.
示例1:填数字游戏
算法描述题
X 算
----------------
题题题题题
示例2:填运算符游戏
5 5 5 5 5 5 = 5
2.递推算法思想
适用环境:适用于有明确公式的情况,通过已知条件,利用特定关系得出中间推论,逐步递推,直到得出结果.
递推核心:利用已有信息推出新的东西.
(1)顺推法(求结果)
从已知条件出发,逐步推算要解决的问题.
示例1:斐波那契额数列的推导(生小兔子模型)
(2)逆推法(求条件)
从已知结果出发,用迭代表达式逐步推算出问题开始条件.
示例1:该存多少钱
3.递归算法思想
用途:该算法可以有效解决一些问题,往往可以简化代码的编写,但若有不适合的递归,反而导致效率低.
核心:不断通过反复调用自身来求解问题.待求解问题可以分解为相同的一个子问题.
三要求:1.每循环调用一次,求解问题的规模要有所缩小.
2.相邻两次循环之间有紧密的联系,前一次要为后一次做准备
3.当子问题规模极小时,应该能直接给出答案而不再进行递归调用(即有一个结束递归的条件),否则导致堆栈溢出.
注意三点:1.递归效率低,
2.递归必须要有一个递归出口
3.递归调用过程中,系统将每一次递归调用的返回点.局部量等保存在系统的栈中.
示例1:求阶乘
示例2:数制转换
3.分治算法
核心:将一个复杂的问题分解为若干个子问题来进行求解,子问题比较大分解为更小的子问题求解.
特征:1.求解问题可以分为若干个规模较小的相同问题
2.求解问题规模分解到一定程度,就很容易求解
3.合并子问题的解可以得到求解问题的解
4.由求解问题所分解出的各个子问题是相互独立的
分治算法和递归算法同时使用,可以产生许多高效的算法.
分治算法的设计分为以下三步:1.分解2.求解3.合并
示例1:乒乓球赛日程安排
4.贪婪算法
核心:局部最优,得出最优近似解
示例1:找零钱
示例2:换零钱
5.试探算法思想(也称回朔法)
核心:系统的搜索问题解的方法,例如选手下棋
思路:从问题的某一种状态出发,搜索这种状态出发所有能达到的状态,当一条路走到尽头的时候,退后几步,接着出发.
试探算法一般采用递归形式编写
示例1:生成彩票号码组合
6.模拟算法
示例1:猜数字游戏
示例2:模拟掷骰子
7.算法的评价
1.目的:1.方便从解决问题的多种算法中找到一个算法来使用
2.有助于现有算法的改进
2.算法考察的四个方面
1.正确性:是指通过设计算法的运算,最后能得到正确的结果。显然,这是算法必须达到的底线。要考察一个
算法的正确性,最简单的方法就是设置各种条件的测试数据去测试。
2.高效性:这也是评价算法的一个重要指标。对于解决同一问题的多种算法,执行时间短的算法效率高。要考
察一个算法的执行效率,通常关注算法进行的基本操作的次数。例如,对于嵌套循环,若能减少一层嵌套,其内循
环执行的次数将显著减少,效率将提高。
3.空间性:空间性是指按指定算法编写的程序执行时所需的存储空间。考察算法的空间占用,一般是以算法在
运行过程中所需占用的最大存储空间为衡量标准。
4.可读性:最简单的算法往往不是最高效的,其执行时间可能较长。但算法的简单性使程序的可读性增强,易
于调试和维护。考察算法的可读性时,应考虑大多数程序员都能很好地理解程序。