5.1 python数据结构与算法之算法思想概述

常见的算法思想概述:

这一章开始介绍算法知识, 为后面的学习奠定基础,除了下一节要介绍的递归外,后面还将详细介绍 动态规划, 贪心等思想, 更重要的是,后续查找,排序等常见算法中,均要涉及到这些基础的算法思想。

算法的英文名称是Algorithm,这个词在1957年之前在Webster’s New World Dictionary(《韦氏新世界词典》)中还未出现,只能找到带有它的古代涵义的较老形式的“Algorism”(算术),是指用阿拉伯数字进行算术运算的过程。在中世纪时,珠算家用算盘进行计算,而算术家用算术进行计算。 

根据经验和发展结论得出,算法应该具有如下五个重要的特征。 

(1)有穷性:保证执行有限步骤之后结束;

(2)确切性:每一步骤都有确切的定义;

(3)输入:每个算法有零个或多个输入,以刻画运算对象的初始情况,所谓零个输入是指算法本身定除了初始条件;

(4)输出:每个算法有一个或多个输出,显示对输入数据加工后的结果。没有输出的算法是毫无意义的;

(5)可行性:在原则上算法能够精确地运行,进行有限次运算后即可完成一种运算。

基础算法思想:

(1)穷举

穷尽每一种可能的情况,效率不高,适用于没有明显规律的情况,同时又最为耗时的一种解决实际问题的算法思想。在可能的解空间范围不大的情况下,也算是快刀斩乱麻了,不用找规律动脑筋。

(2) 递推

根据已有的数据和关系,逐步推导而得到结果。

(3)递归

一种直接或间接地调用原算法本身的一种算法,见下一节5.2

(4)分治

分治法,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……

设计思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,相互独立,以便各个击破,分而治之。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。

执行步骤:

         1)、确定一个规模为n的难解决问题难以直接解决

         2)、将该问题分解为m个规模较小的子问题a,a们之间相互独立,与原问题形式相同

         3)、递归地解决这些小问题,即一个一个解决

         4)、然后,将各子问题的解合并到原问题的解

(5)动态规划

基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。

由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。

与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。

(6)贪心

求局部最优,对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。

贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。

(7)回溯

类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径,类似于走迷宫的过程。

回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

基本思想: 在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。

(8)概率算法

无法计算解析,将实际问题的求解数值通过近似值的方式解出。

执行步骤:

         1)、将问题转化为相应的几何图形S,S面积容易求出,问题的结果对应几何图形中某一部分S1的问题

         2)、然后,向几何图形里撒点

         3)、统计几何图形S和S1中的点数,根据面积关系及点数关系来计算得到结果

         4)、判断上述结果是否在需要精度内。
 

参考:常见的算法思想(整理)

猜你喜欢

转载自blog.csdn.net/xutiantian1412/article/details/84667140
5.1