算法基础介绍
1. 算法的概念
算法,在数学和计算机科学之中,一个被定义好的、计算机可施行之指示的有限步骤或次序,常用于计算、数据处理和自动推理。作为一个有效方法,算法被用于计算函数,它包含了一系列定义清晰的指令,并可于有限的时间及空间内清楚地表述出来。
2. 算法的特征
高德纳在他的著作《计算机程序设计艺术》里对算法的特征归纳:
- 输入:一个算法必须有零个或以上输入量。
- 输出:一个算法应有一个或以上输出量,输出量是算法计算的结果。
- 明确性:算法的描述必须无歧义,以保证算法的实际执行结果是精确地符合要求或期望,通常要求实际运行结果是确定的。
- 有限性:依据图灵的定义,一个算法是能够被任何图灵完备系统模拟的一串运算,而图灵机只有有限个状态、有限个输入符号和有限个转移函数(指令)。
- 有效性:能够实现,算法中描述的操作都是可以通过已经实现的基本运算有限次来实现。
3. 常用设计模式
常用的设计模式分为两种:完全遍历法和不完全遍历法。
在问题的解是有限离散解空间,且可以验证正确性和最优性时,最简单的算法就是把解空间的所有元素完全遍历一遍,逐个检测元素是否是我们要的解。这是最直接的算法,实现往往最简单。这是属于完全遍历法。
但是当解空间特别庞大时,这种算法很可能导致工程上无法承受的计算量。这时候可以利用不完全遍历方法---例如各种搜索法和规划法,来减少计算量。
4. 算法评定
同一问题可用不同算法解决,而一个算法的质量优劣将影响到程序的运行效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。
时间复杂度
算法的时间复杂度是指执行算法所需要的计算工作量。计算机算法是问题规模n的函数f(n),算法的时间复杂度记作:
t(n) = o(f(n))
空间复杂度
算法的空间复杂度是指算法需要消耗的内存空间。
正确性
算法的正确性是评价一个算法优劣的最重要的标准。
可读性
算法的可读性是指一个算法可供人们阅读的容易程度。
鲁棒性
鲁棒性是指一个算法对不合理数据输入的反应能力和处理能力,也称为容错性。
5. 常见算法思想
一、枚举算法
将问题的所有可能答案一一列举,根据判断条件判断此答案是否合适,一般用循环实现。
经典运用:百钱买百鸡、填写运算符。
二、递推算法
1.顺推法:从已知条件出发,逐步推算出要解决问题的方法。
2.逆推法:从已知结果出发,用迭代表达式逐步推算出问题开始的条件,即顺推法的逆过程。
经典运用:斐波那契数列(顺推法)、银行存款(逆推法)。
三、递归算法
1.递归过程一般通过函数或子过程实现;
2.递归算法在函数或子过程的内部,直接或间接调用自己的算法;
3.递归算法实际上是把问题转化为规模缩小了的同类问题的子问题,然后再递归调用函数或过程来表示问题的解;
注意:递归算法必须有一个明确的递归结束条件;如果递归次数过多,容易造成栈溢出。
经典运用:汉诺塔问题、阶乘问题。
四、分治算法
将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。只要求出子问题的解,就可以得到原问题的解。
一般步骤:
1.分解,将要解决的问题划分成若干个规模较小的同类问题;
2.求解,当子问题划分得足够小时,用较简单的方法解决;
3.合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
经典运用:大数相乘问题、比赛日程安排、归并排序。
五、贪心算法
从问题的某一个初始解出发,逐步逼近给定的目标,以便尽快求出更好的解。
局限:
1)不能保证最后的解是最优的;
2)不能求最大最小解问题;
3)只能求满足某些约束条件的可行解范围。
基本过程:
1.从问题的某一初始解出发;
2.while能向给定总目标前进一步;
3.求出可行解的一个解元素;
4.由所有解元素组合成问题的一个可行解。
经典运用:装箱问题、找零方案、活动选择问题、背包问题、多机调度问题。
六、试探算法(回溯法)
在试探算法中,放弃当前候选解,并继续寻找下一个候选解的过程称为回溯。扩大当前候选解的规模,以继续试探的过程称为向前试探。
(为求得问题的正确解,会先委婉地试探其中一种可能情况。在进行试探过程中,一旦发现原来选择的假设情况是不正确的,马上会自觉地退回一步重新选择,然后继续向前试探。反复进行,直到得到解或证明无解时才死心)
基本步骤:
1.针对所给问题,定义问题的解空间;
2.确定易于搜索的解空间结构;
3.以深度优先方式搜索解空间,并在搜索过程中用剪枝函数无效搜索。
经典运用:八皇后问题、29选7彩票组合、0-1背包、N皇后问题。
七、迭代算法(辗转法)
一种不断用变量的旧值递推新值的过程,解决问题时总是重复利用一种方法。
1.确定迭代变量:直接或间接地不断由旧值递推出新值的变量;
2.建立迭代关系式:新值与旧值的公式或关系。(解决迭代问题的关系)
3.对迭代过程进行控制:确定迭代过程什么时候结束。
所需的迭代次数是个确定值,可以计算出来:可以构建一个固定次数的循环来实现对迭代过程的控制;
所需的迭代次数无法确定:需要进一步分析用来结束迭代过程的条件。
八、模拟算法
对真实事物或者过程的虚拟。
经典运用:猜数字游戏、掷骰子问题。
九、动态规划算法
关键词:递归(递归式)、表记录(已解决的子问题的答案)、根据子问题求解问题的解(子问题不独立)、最优解(可选项)。
步骤:
1.找出最优解的性质,刻画其结构特征;
2.递归地定义最优解;
3.以自底向上的方式计算出最优值;
4.根据计算最优值时得到的信息,构造一个最优解。
只需求出最优值,步骤四可以省略;若需求出问题的一个最优解,则必须执行步骤4。
示例:0-1背包问题;矩阵链乘问题;最长公共子序列(LCS)。
十、分支界限法
关键字:解空间(广度优先、最小耗费优先)、界限函数(队列式、优先队列式)
步骤:
1.针对所给问题,定义问题的解空间。问题的解空间应至少包含问题的一个(最优)解。
2.确定易于搜索的解空间结构。通常将解空间表示为树、图;解空间树的第i层到第i+1层边上的标号给出了变量的值;从树根到叶子的任一路径表示解空间的一个元素。
3.以广度优先或最小耗费优先的方式搜索整个解空间。每个活节点只有一次机会成为扩展节点,活节点一旦成为扩展节点,其余儿子节点被加入活节点表中。(以此方式递归搜索)
界限函数:分支界限法的核心。尽可能多、尽可能早地“杀掉”不可能产生最优解的活节点。好的界限函数可以大大减少问题的搜索空间,大大提高算法的效率。
1.队列式(FIFO)分支界限法。先进先出。
2.有限队列式分支界限法。组织一个优先队列,按优先级选取。通常用最大堆来实现最大优先队列,最小堆来实现最小优先队列。
十一、概率算法
关键词:随机性选择、小概率错误、不同解(对同一问题求解两次,可能得到完全不同的解,且所需时间、、结果可能会有相当大的差别)
基本特征:
1.输入包括两部分。一、原问题的输入;二、供算法进行随机选择的随机数序列;
2.运行过程中,包括一处或多处随机选择,根据随机值来决定算法的运行;
3.结果不能保证一定是正确的,但可以限制出错率;
4.不同的运行过程中,对于相同的输入实例可以有不同的结果,执行时间也可能不同。
分类:
1.数值概率算法。常用于数值问题的求解。近似解,近似解的精度随计算时间的增加不断提高。
2.蒙特卡罗算法。精确解,解未必是正确的,正确的概率依赖于算法所用的时间。一般情况下,无法有效地判断所得到的解是否肯定正确。
3.拉斯维加斯算法。一旦找到解,一定是正确解。找到的概率随计算时间的增加而提高。对实例求解足够多次,使求解失效的概率任意小。
4.舍伍德算法。总能求得问题的一个解,且所求得的解总是正确的。设法消除最坏情形与特定实例之间的关联性。
十二、近似算法
关键词:近似解、解的容错界限(近似最优解与最优解之间相差的程度)、不存在多项式时间算法。
基本思想:放弃求最优解,用近似最优解替代最优解。使算法简化,时间复杂度降低。
衡量性能的标准:
1.算法的时间复杂度。
2.解的近似程度。与近似算法本身、问题规模、不同的输入实例有关。
示例:NP问题、定点覆盖问题、TSP、子集和数问题。

浙公网安备 33010602011771号