将数组分割成两半,A1
2和A
21
,在每一半中找到最大值和最小值,并返回这两个最小值中的最小值及这两个最大值中的最大值。
过程
Mi
Max
输入
个整数元素的数组A1
为2的幂
输出xyA中的最大元素和最小元素
fifhighlow1the
ifAlowAhighthe
retur
AlowAhighelse
retur
AhighAlowe
dif
elsemidlowhigh2x1mi
lowmidy1maxlowmid
x2mi
mid1high
fy2mi
mid1high
xmi
x1x2ymaxy1y2retur
xye
dif
可见当我们在一个数组中如何同时选择最大最小值时,分治算法时一个不错当选择。如上例中所示,我们把一个数组分成了low部分和high部分两个较小当部分,然后求出他们的mid。用lowhigh部分分别和mid比较把其最大最小值进行存放,最后再比较存放数当最大最小值。我们考虑的例子中只考虑了时2
的幂的情况。而且分成的子问题都是相互独立的,如果子问题不独立而是出现重复子问题那往往我们选择的不是分治算法而是采用动态规划算法求解更加便利。
3动态规划:
31动态规划介绍
动态规划算法,就是递推重复子问题。该算法效率主要与重复子问题的处理有关。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的
典型的题目有陪审团、最大公共子串问题流水作业调度,矩阵乘法
背包问题和01背包问题
32动态规划介绍例子
例:最大公共子串问题这个是动态规划的基础题目。这个问题,不妨设第一个串为a,长度为
,第二个串为b,长度m。那么最长的子序列长度为f(
m)
当a
am时f
m1f
1m1
否则f
mmaxf
1fm1
同时建立一个存储计算过的f(xy的矩阵,如果计算过了就直接使用。2对已集装箱问题中的背包问题和01背包问题的区别。背包问题可以将一个整体进行拆分存放,而01背包问题必须存放的是一个整体!直到出现最大价值为之。比如当c50而我这有三个小箱abc重量分别是102030而价值分别对应60100120!这时当我们考虑装箱时!用背包问题的思想,不管是背包还是01背包都要体现价值最大化。在这使用背包问题这价值为6010080分别是装了ab和c的20重量!当我们考虑用01背包时最大价值为100120分别装了bc。这就是两者最大价值的实现和不同点。
4贪心算法:
f是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的r