算法设计与分析

<!-- /* 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) , 所以使用分治法可以减少比较的次数 , 优于上一个算法。

{

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

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

{

 
的解是

                             O(n)         a < c

logc 2

 
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 =

证明: 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 年代,贝尔曼( Richard Bellman )等人根据这类问题的多阶段决策的特性,提出了解决问题的“最优性原理”从而创建了最优化问题的一种最新的算法设计方法——动态规划。

 

 

 

 

 

回溯法

 

探索法最经典的例子就是 “装箱问题” 了。

       问题:有容积为 T 0 的箱子 B i 个,另有大小为 t i 的目标, i = ,要求把所有的目标放入数目尽可能少的箱子里去,目标不能分割,每个箱子装的目标体积之和不能超过 T 0

 

       这里给出解此类问题的 4 种算法:

1)  FF 算法:( First Fit 首次适合)

L 是给定的目标序列,把 L 中的第一个放入 B 1 ,然后拿第二个,看是否还能放入 B 1 ,能则放入,不能则放入 B 2 ,依次。就是说尽量放入下标最小的 B i

2)  FFD 算法:

如果把 L 以降序排列,那么 FF 算法就编程了 FFD 算法。

3)  BF 算法:

L 顺序任意,装箱的方法与 FF 算法相似,但是放下一个目标时找的是能尽量造成最小空间的那个箱子。

4)  BFD 算法:

L 以降序排列的 BF 算法。

 

这里以 FFD 算法为例。

       根据书上,有这么一个误差公式:

       其中 N FFD 是用 FFD 算法求得的近似解, N 0 是最佳解, 是任意大于 0 的数。就是说 FFD 算法产生的结构大概要比完美的情况多出那么个 23%

      

例子:     是任意选定的小正实数,所有箱子的尺寸为 1

有尺寸为 的目标 6 个,尺寸为 的目标 6 个,尺寸为 的目标 12 个,尺寸为 的目标 6 个。

那么看最佳解法的箱子是 9 个:

 

 

 

回溯法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值