算法设计与分析

来源:互联网 发布:骨朵数据 网络剧排行 编辑:程序博客网 时间: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 设集合Sn个元素, 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分成大小相等的两个子集S1S2, 所以S1 S2 各有n / 2 = 2m-1 个元素。

(b)    S1S2分别反复使用分治法, 求出最大及最小元素。

(c)    比较S1S2 所求出的最大及最小元素 , 就可以得到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成两个子集S1S2, ||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, max2min1, min2。设Sn个元素, n = 2 , T(2) = 1, n > 2, T(n) = 3/2n - 2 , 就是说明了在n个元素的集合中寻找最大及最小元素至少要进行(3/2n – 2), 所以使用分治法可以减少比较的次数, 优于上一个算法。

{

 定理 : a, b, c是非负常数, 递归式         b             n = 1

                                T(n) =    aT(n/c) + bn    n >

{

 的解是

                            O(n)         a < c

logc2

 T(n) =       O(nlogn)      a = c

            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=

证明:1n=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个:

 

 

 

回溯法

原创粉丝点击