目录
前言
循环与递归是算法的基础,无论是动态规划,还是图的搜索和树的遍历等问题中都是有广泛应用。
一、循环设计的要点
1. 明确变化量,起始结束条件,以及变化量与其他元素的关系,寻求算法效率优化,即优化时间(去循环)和优化空间(节省额外开辟空间)
2.“自顶而下”设计方法 :
由全局到局部,由抽象到具体,将困难问题划分为简单自己熟悉的问题
3.由具体到抽象的设计方法:
归纳找规律方法
4.阶乘问题循环设计要点:
数据范围极易超过类型表示范围,应采用高精度的方法对大整数采取int数组保存高低位或字符串存储,重载其基础运算符计算。
二、递归设计要点
递推划分过程与回溯过程,本质是利用回溯过程得到最后解,但思考方式采取递推划分思想。同时由于这个特性递归一般都是可以借助数组变量或栈转化为迭代的。
2.递归算法设计关键在于递归关系与递归边界出口条件的设计。
3.分析方法:
自上而下的划分(现象):分解到最小规模自动解决或易于解决,快排的Parition过程划分
自下而上的递推(本质):简单解迭代递推到复杂情况下的解,归并排序的合并过程
4.递归算法设计步骤:
(1)寻找递归关系:缩小问题规模
(2)设置边界控制递归出口:找到停止条件,即算法可解的最小规模问题
(3)设计具体函数、确定变化量与其他变量的关系
5.递归的特色应用:
非数值型问题一般使用递归,如汉罗塔问题,
DFS遍历坐标图和树的遍历等问题,由于变化量紧密与上一层状态相关,所以也推荐使用递归,改为循环太过复杂
三、循环与递归的比较
循环优点:递归由于其算法实现需要耗费较多的时间与空间资源(栈保存每个状态的信息,便于回溯求解),能用循环就改为循环。
递归优点:递归更加代码量简洁,且对于需要回溯时完成操作的问题十分友好。如对一个整数从高位向低位输出。
循环+数组存储 == 递归
四、迭代循环、递归的经典应用问题
1.走楼梯问题
2.昆虫繁殖问题
3.数塔问题
4.走迷宫问题——过河卒问题
5.背包问题:01背包,完全背包,多重背包,分组背包
6.快速幂问题
7.非数值问题
(1)汉诺塔问题
(2)合法括号
(3)集合子集划分
(4)子集生成
五、算法与数据结构
1.数据结构的选取要求:
(1)准确表示数据内容和数据间关系,
(2)考虑易于存储实现,
(3)特别考虑数据规模
(4)对算法实现效率有所支持
2.算法原始与处理过程信息的存储:
时间复杂度高的,可以采用数组存储,尝试缩小循环次数,但还是要尽量减少空间资源使用(动态规划由于过程极其复杂,因此常使用记忆化数组存储)
数组对信息的作用:
(1)存储状态有效信息,(图的节点坐标标记状态,DP状态存储等)
(2)利用数组下标使其他信息与有效信息建立映射关系。(hash映射)
(3)数组使信息有序化(桶排序原理)
3.大整数存储及运算:
设计要点:
1.字符数组存储从键盘输出的高精度数据,cin>>ch 直接按字符输入字符数组,无序对高精度数据进行分段输入
2.字符数组转数值数组存储 :a[i] = (ch - '0' + m) mod 10,m为前一位的进位。
3.高精度数据是按位计算,进位使用long存储,计算结果int a[N]存储4
4.优化算法的基本技巧
算术运算优化: ans += a[i] >= 90; a[i] = 1 - a[i]; a = (a + 1)% 10;
标志量的使用:冒泡排序设置标志量记录每次冒泡是否进行交换,当标志量未变化时,直接退出循环,排序完成
信息数据化: 对有些非数值问题有特效
5.优化算法的数学模型
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。