1.常用算法思想概述
对于程序员来说,学习一门语言是不太难的,难得是如何编写一个高质量的程序,算法是程序的灵魂,一个号的算法可以化繁为简,高效率的求解问题,因此掌握各种算法思路是必要的
在程序设计中,算法是独立于程序语言的,无论使用哪种语言都会经常使用如下几种算法,只是会根据不同语法规则做相应的修改而已
1.穷举算法思想
2.递推算法思想
3.递归算法思想
4.分治算法思想
5.概率算法思想
2穷举算法思想
穷举算法是最简单的一种算法,其依赖于计算机强大的计算能力来计算每一种可能的情况,从而达到求解的目的.穷举算法效率并不高,但是适用一些没有明显规律可循的场合.
穷举算法就是从所有可能的情况下搜索出正确的答案,其执行流程如下
(1)对于一种可能的情况,计算出结果
(2)判断结果是否满足要求,如果不满足则继续执行(1)来搜索下一个可能的情况,满足要求就表示寻找到了一个正确的答案
穷举算法的关键是要确定搜索的范围,确定之后根据循环结构和条件判断语句验证候选答案的正确性,从而得到所需要的正确答案
经典例子,百钱白鸡问题,鸡兔同笼问题
3递推算法思想
递推算法是一种常用的算法思想,在数学计算场合有着广泛的应用,递推算法适合应用在有明显公式规律的场合
递推算法是一种理性思维模式的代表,根据已有的数据和关系逐步推到而得到结果,递推算法的执行过程如下
(1)根据已知结果和关系,求解中间结果
(2)判定是否达到要求,如果没有达到,则继续根据已知的结果和关系求解中间结果,如果满足要求则表示寻找到一个正确的答案.
递推算法需要用户知道答案和问题之间的逻辑关系.在许多数学问题中,都有明确的计算公式可以遵循,因此常常采用递推算法思想
比如兔子铲子,菲波那切数列问题
4.递归算法思想
递归算法也是一种非常常见的算法思想.使用递归算法,往往可以简化代码的编写,提高程序的可读性,但是不合适的递归反而会导致程序执行效率变低
递归算法就是在程序中不断反复调用自身来达到求解问题的方法.这里强调的重点是调用自身,这就要等待求解的子问题能够分解相同问题的一个子问题,这样多次递归调用,便可完成求解
递归调用时一个函数在它的函数体内调用它自身的函数调用方式,这种函数也成为递归函数.在递归函数中,主调函数同时又是被调函数.执行递归函数将反复调用其自身,每调用一次就进入新的一层
函数的递归调用可分为两种情况.
直接递归:函数中调用本身
间接递归:func-a 调用func-b ,fun-b再调用func-a
编写递归函数时必须使用if语句强制函数在未执行递归调用前返回,否则调用函数它将永远不会返回,这是一个很容易犯的错误
优缺点:
优点:代码间接,可读性好,特别与人工智能有关的问题,比如汉诺塔,八皇后问题,有时候用递归能实现,用循环不一定能实现
缺点:大部分递归历程并没有明显的减少代码规模和节省内存空间,递归形式比非递归形式的运行速度要慢一些,这是因为附加的函数调用增加了时间开销,执行一系列的出栈压栈操作,如果递归层次太深,会导致堆栈溢出,但很多情况下,速度的差别不是很明显
递归例子,汉诺塔,八皇后问题,阶乘
5分治算法思想
分治算法是一种化繁为简的算法思想,分治算法往往应用于计算步骤比较复杂的问题,通过将问题简化逐步得到结果
分治算法的基本思想讲将一个复杂的问题分为若干个规模较小,计算简单的小问题来进行求解,然后综合各个小问题,最终得到问题的答案,分治算法的执行过程如下
(1)将一个规模为N的问题,若改问题可以容易解决则直接解决,否则执行以下步骤
(2)将该问题分解为M个规模较小的子问题,这些问题应相互独立,并且与原问题形式相同
(3)递归求解各个子问题
(4)然后,将各个子问题的解合并得到原问题的解
使用分治法要求待解决的问题能够化繁为简为若干个小规模的相同的问题,通过逐步划分,达到一个易于求解的阶段而直接进行求解,然后在程序中使用递归算法进行求解
6.概率算法思想
概率算法依照概率统计的思路来求解问题的算法,她往往不能得到问题的精确值,但却在数值计算领域得到了广泛的应用.因为很多数学问题往往没有或者很难计算出解析解,这时需要通过数值计算来计算解的近似值
概率算法执行过程如下
(1)将问题转化为相应的几何图像S,S的面积是容易计算的,问题的结果,问题的结果往往对应几何图形中某一部分S1的面积
(2)然后,像几何图形中随机撒点
(3)统计几何图形S和S1中的点数,根据S的面积和S1的面积的关系以及各图形的点数来计算得到结果
(4)判断上述结果是否在需要的经度之内,如果未到到则执行步骤(2),如果达到精度,则输出近似结果
概率算法大致分为如下4中形式
数值概率算法
蒙特卡罗算法
拉斯维加斯算法
舍伍德算法