实现算法的一般步骤
1.分析理解、抽象和归纳问题
2.寻找解决问题的算法过程思路
3.用数学语言符号将其表示出来
4.选用合适的数据结构并编程
5.评估该算法
怎么去描述算法
自然语言---->流程图--->伪代码--->程序语言
算法的复杂度描述
算法的时间复杂度是指 执行算法所需要计算的工作量。算法的时间复杂度是一个函数,它定量的描述了算法的运行时间。
算法的空间复杂度是指 算法需要消耗的内存空间。算法的空间复杂度是对一个算法在运行过程中临时占用存储空间大小的度量。
经典的算法策略
1.枚举算法
也叫穷举算法(暴力破解法),是一种针对要解决的问题,列举出它的所有可能的情况,逐个判断有哪些是符合问题所要求的约束条件,从而得到问题的解。
枚举算法的思路
第一步:确定解题范围,枚举出所有可能的题解 第二步:判断解题是否符合正解的条件 第三步:使可能解的范围降至最小,以便提高解题效率。
枚举算法案例
百钱买百鸡问题:我国古代数学家在《算经》一书中提出的数学问题:鸡 翁一值钱五,鸡 母一值钱三,鸡雏三值钱一。百钱买百鸡,问 鸡翁、鸡 母、鸡雏各几何?
破译密码问题:用“字典”锁定密码在某个范围,可以缩短破译时间
2.递推算法
通过已知条件,利用特定关系得出中间推论,直到得出结果。分为逆推和顺推两种。
递推算法思路:将一个复杂庞大的计算过程转化成简单过程的多次重复。
第一步:确定问题的数据信息之间存在着特定的递推关系;第二步:逐步推断;第三步:尽量使用简单变量,减少耗能。
递推算法案例:斐波那契序列和杨辉三角形
3.递归算法
将问题转化为规模缩小了的同类问题的子问题,然后通过递归调用来表示问题的解,分为直接递归和间接递归
递推与递归的比较:递推算法通常采用数组,递归算法采用栈,递推效率较高
递归算法思路
第一步:确定递归公式,将问题化为子问题求解,子问题求解的方法与原问题相同;第二步:确定边界,递归的次数必须是有限的;第三步:构架调用自身函数的子过程
递归算法案例:求n!(阶乘问题)和汉诺塔问题
4.迭代算法
也称为辗转法,是一种不断用变量的旧值递推新值的过程,分为精确迭代和近似迭代。最常见的迭代算法是牛顿法(一种在实数域和复数域近似求解的方法)
迭代算法的步骤:
第一步:确定迭代变量;第二步:建立迭代关系式;第三步:对迭代过程进行控制;
迭代算法案例:最大公约数问题(欧几里得的辗转相除法)
5.分治算法
缩小问题的规模,分而治之
分治算法的思路
第一步:分解;第二步:求解;第三步:合并
分治算法案例:
信息搜索定位问题(折半查找法),排查假币问题
6.贪心算法
针对范围相对广泛的许多问题能产生整体最优解,增加候选对象,得到整体最优解
贪心算法的思路:
第一步:建立数学模型来描述问题;第二步:把求解的问题分为若干个子问题:第三步:得到子问题的局部最优解;第四步:合并最优解
贪心算法案例:最大整数(n个整数连接成一排,组成一个最大的多位整数)
这个案例我还不太会,有会的同学可以一起探讨一下(嘻嘻)
7.回溯算法
回溯法回溯到根节点,且根节点的所有子树都被搜索遍才结束,在搜索过程中产生解
回溯算法的思路:
第一步:定义问题的解空间;第二步:确定易于搜索的解空间结构;第三步:以深度优先的方式搜索解空间,并用剪枝函数避免无效搜素
回溯算法典型案例:迷宫问题和n皇后问题