有趣的算法

博客介绍了穷举法、迭代法、分治、动态规划、贪婪、回溯和分支界定等算法。以背包问题为例,阐述了不同算法的应用思路。还列举了可使用分治法求解的经典问题,如二分搜索等,并对各算法特点进行了说明,如动态规划可减少重复计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                算法------穷举法 迭代法 分治、动态规划、贪婪、回溯和分支界定
首先,拿出一个很经典的例子:
一个典型的最优化问题就是背包问题。

背包问题:有一个背包,背包容量是M=150kg。有7个物品,物品不可以分割成任意大小。 
要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。 
物品 A  B  C  D  E  F  G
重量 35 30 60 50 40 10 25
价值 10 40 30 50 35 40 30

穷举法:作为穷举当然是把所有的可能都列举出来一个一个的比,当然这种方法并不怎么明智。
贪婪法:(我在这里称他为极端法)价值,重量,性价比(价值+重量相加最优),这种方法或许可以得到较优的方法。
迭代法:这个算法是和穷举法比较类似,不过这个算法可以清晰的看到整个过程。

分治法的步骤:

1.分开:将原问题分解为多个子问题,这些子问题是可以独立求解的子问题,并且分解得到的解和原问题的解有着相同的结构,便于使用递归和循环机制。

2.求解:求解这些子问题的解

3.合治:将子问题的解合并起来形成原问题的解。

可使用分治法求解的一些经典问题
(1)二分搜索
(2)大整数乘法
(3)Strassen矩阵乘法
(4)棋盘覆盖
(5)合并排序
(6)快速排序
(7)线性时间选择
(8)最接近点对问题
(9)循环赛日程表

介绍一下典型的二分法:
有2个金块,一块重一块轻,再加入一块,现在有一台比较重量的天平,用最少的次数得到最重的金块。
比较其中的两块,再拿其中最重的和剩下的比较。

实际上就是类似于数学归纳法,找到解决本问题的求解方程公式,然后根据方程公式设计递归程序。
1、一定是先找到最小问题规模时的求解方法
2、然后考虑随着问题规模增大时的求解方法
3、找到求解的递归函数式后(各种规模或因子),设计递归程序即可。

动态规划法:
动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。
一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。

由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,
将其不同阶段的不同状态保存在一个二维数组中。与分治法最大的差别是:适合于用动态规划法求解的问题,
经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。

回溯法
回溯法类似于搜索,当不满足需求时就会回溯返回,以尝试其他的路径。回溯回去的点叫回溯点,利用这样的方法求的最优解。


分支界限法
回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,
或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
就像一棵树一样,利用他们的分支,再找下一个分支。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值