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