算法设计与分析
来源:互联网 发布:骨朵数据 网络剧排行 编辑:程序博客网 时间:2024/04/29 15:37
<!-- /* Font Definitions */ @font-face{font-family:Wingdings;panose-1:5 0 0 0 0 0 0 0 0 0;mso-font-charset:2;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:0 268435456 0 0 -2147483648 0;}@font-face{font-family:宋体;panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-alt:SimSun;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;}@font-face{font-family:"/@宋体";panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal{mso-style-parent:"";margin:0cm;margin-bottom:.0001pt;text-align:justify;text-justify:inter-ideograph;mso-pagination:none;font-size:10.5pt;mso-bidi-font-size:12.0pt;font-family:"Times New Roman";mso-fareast-font-family:宋体;mso-font-kerning:1.0pt;}p.MsoHeader, li.MsoHeader, div.MsoHeader{margin:0cm;margin-bottom:.0001pt;text-align:center;mso-pagination:none;tab-stops:center 207.65pt right 415.3pt;layout-grid-mode:char;border:none;mso-border-bottom-alt:solid windowtext .75pt;padding:0cm;mso-padding-alt:0cm 0cm 1.0pt 0cm;font-size:9.0pt;font-family:"Times New Roman";mso-fareast-font-family:宋体;mso-font-kerning:1.0pt;}p.MsoFooter, li.MsoFooter, div.MsoFooter{margin:0cm;margin-bottom:.0001pt;mso-pagination:none;tab-stops:center 207.65pt right 415.3pt;layout-grid-mode:char;font-size:9.0pt;font-family:"Times New Roman";mso-fareast-font-family:宋体;mso-font-kerning:1.0pt;} /* Page Definitions */ @page{mso-page-border-surround-header:no;mso-page-border-surround-footer:no;}@page Section1{size:595.3pt 841.9pt;margin:72.0pt 90.0pt 72.0pt 90.0pt;mso-header-margin:42.55pt;mso-footer-margin:49.6pt;mso-paper-source:0;layout-grid:15.6pt;}div.Section1{page:Section1;} /* List Definitions */ @list l0{mso-list-id:1078089746;mso-list-type:hybrid;mso-list-template-ids:1495689942 -1838757346 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}@list l0:level1{mso-level-text:%1);mso-level-tab-stop:18.0pt;mso-level-number-position:left;margin-left:18.0pt;text-indent:-18.0pt;}@list l1{mso-list-id:1095444230;mso-list-type:hybrid;mso-list-template-ids:427086508 619207814 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}@list l1:level1{mso-level-tab-stop:18.0pt;mso-level-number-position:left;margin-left:18.0pt;text-indent:-18.0pt;}@list l2{mso-list-id:1303386913;mso-list-type:hybrid;mso-list-template-ids:309083194 366651248 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}@list l2:level1{mso-level-number-format:alpha-lower;mso-level-text:"/(%1/)";mso-level-tab-stop:18.75pt;mso-level-number-position:left;margin-left:18.75pt;text-indent:-18.75pt;}ol{margin-bottom:0cm;}ul{margin-bottom:0cm;}-->
三 、例子 :
例6 设集合S有n个元素, 求S的最大和最小元素。为简单起见, 设n = 2m , m>=0。
求集合S的最大元素, 可以采用下述算法。
-----------------------------------------------------------------------------------------------------
Procedure MAX(S)
begin
MAX ß S 中的任一元素
for S 中的所有其它元素x do
It X > MAX then MAX ß x
end
-----------------------------------------------------------------------------------------------------
结论 : 利用此算法, 进行n - 1次比较后就可以求出S的最大元素。用n - 2次比较就可以求出剩下的n - 1个元素的最小元素。所以如果要找出S中的最大和最小元素, 总共要进行 ( n – 1 ) + ( n– 2 ) = 2n - 3次比较。
*如果我们使用分治法来改善此算法, 则可以减少比较的次数。
(a) 把S分成大小相等的两个子集S1和S2, 所以S1 与S2 各有n / 2 = 2m-1 个元素。
(b) 对S1和S2分别反复使用分治法, 求出最大及最小元素。
(c) 比较S1和S2 所求出的最大及最小元素 , 就可以得到S的最大及最小元素。
-----------------------------------------------------------------------------------------------------
produce MAXMIN(S)
begin
1. if ||S|| = 2 then
begin
2. let S = {a, b}
3. return (MAX(a, b), MIN(a, b))
end
else
begin
4. 分S成两个子集S1和S2, 且||S1|| = ||S2||= 1/2||S||
5. (max1, min1) ßMAXMIN(S1)
6. (max2, min2) ßMAXMIN(S2)
7. return (MAX(max1, max2), MIN(min1, min2))
end
end
-----------------------------------------------------------------------------------------------------
结论 : 如果S只有两个元素, 那就在第3行进行一次比较, 如果S有两个以上的元素, 则至第四行将S分成两个子集, 并在5, 6行递归使用MAXMIN, 第7行比较max1, max2及min1, min2。设S有n个元素, 则n = 2 时, T(2) = 1, n > 2时, T(n) = 3/2n - 2 , 就是说明了在n个元素的集合中寻找最大及最小元素至少要进行(3/2n – 2)次, 所以使用分治法可以减少比较的次数, 优于上一个算法。
{
T(n) = aT(n/c) + bn n >1
{
O(n) a < c
logc2
O(n ) a > c
第一小节 动态规划问题
例1:在 x+x2+x3+…+xn =a是约束条件下,求的极大值.
令 ( 0 )
令 且
可得a-x=x, 所以 x=a/2
故
同理
令
所以 a-x=2x , x=a/3
所以 f3(a)=
用数学归纳法可以证明:fn(a) = , x1=x2=x3=…=xn=
证明:1:n=1 …
2:设fn(a) = , x1=x2=x3=…=xn= 成立,则
fn+1(a)=max(+fn(a-x))=max( )
令 y=
y’==
所以 nx=a-x ,(n+1)x=a
x=
fn+1(a)=+n=
我们刚才的解题策略是:“摸着石头过河”,f2 利用f1的结果,f3又利用f2的结果。。。。。。类似于游戏中的一个勇士打败了一些敌人后得到一件武器,然后去打败另一个强大一些的对手,得到一件更好的武器,接着打败更强大的敌人。。。。。最后取得胜利。。。
在实际生活中,有这么一类问题,它们的活动过程可分为若干个阶段,而且在任一阶段后的行为仅依赖于第I阶段的过程状态,而与I阶段之前的过程如何达到这种过程如何达到这种状态的方式无关,这样的过程就构成了一个多阶段决策过程。在50年代,贝尔曼(RichardBellman)等人根据这类问题的多阶段决策的特性,提出了解决问题的“最优性原理”从而创建了最优化问题的一种最新的算法设计方法——动态规划。
回溯法
探索法最经典的例子就是 “装箱问题” 了。
问题:有容积为T0的箱子Bi个,另有大小为ti的目标,i = ,要求把所有的目标放入数目尽可能少的箱子里去,目标不能分割,每个箱子装的目标体积之和不能超过T0。
这里给出解此类问题的4种算法:
1) FF算法:(First Fit 首次适合)
L是给定的目标序列,把L中的第一个放入B1,然后拿第二个,看是否还能放入B1,能则放入,不能则放入B2,依次。就是说尽量放入下标最小的Bi。
2) FFD算法:
如果把L以降序排列,那么FF算法就编程了FFD算法。
3) BF算法:
L顺序任意,装箱的方法与FF算法相似,但是放下一个目标时找的是能尽量造成最小空间的那个箱子。
4) BFD算法:
把L以降序排列的BF算法。
这里以FFD算法为例。
根据书上,有这么一个误差公式:
其中NFFD是用FFD算法求得的近似解,N0是最佳解,是任意大于0的数。就是说FFD算法产生的结构大概要比完美的情况多出那么个23%。
例子: 设是任意选定的小正实数,所有箱子的尺寸为1。
有尺寸为的目标6个,尺寸为的目标6个,尺寸为的目标12个,尺寸为的目标6个。
那么看最佳解法的箱子是9个:
回溯法
- 算法分析与设计
- 算法设计与分析
- 算法分析与设计
- 算法设计与分析
- 算法设计与分析
- 算法分析与设计
- 算法设计与分析
- 算法设计与分析
- 算法设计与分析
- 算法设计与分析
- 算法设计与分析
- 算法设计与分析
- 算法设计与分析
- 算法设计与分析
- 算法设计与分析
- 算法分析与设计
- 书名: 算法分析与设计
- 常用算法分析与设计
- ext grid 的每行最后一列添加 按钮
- 数论基础算法
- GetClientRect与GetWindowRect的区别
- asp调用dll及asp封装dll实例
- asp.net日期格式
- 算法设计与分析
- unicode2ascii+ascii2unicode
- 在C#中使用LOG4NET
- js+css完美控制未知尺寸图片大小
- 01穷举贪心分枝
- ASP程序加密解密方法全面解析
- ORACLE 常用命令
- 02分治法
- my sql 存储过程使用注意事项