黄色在线观看视频-黄色在线免费看-黄色在线视频免费-黄色在线视频免费看-免费啪啪网-免费啪啪网站

查看全部128種考試
軟件水平考試
 考試動態 報考指南 歷年真題 模擬試題 復習資料 心得技巧 專業英語 技術文章 軟考論壇 考試用書
 程序員 軟件設計師 網絡管理員 網絡工程師 系統分析師 數據庫系統工程師
1
2
3
4
5
6
7
8
9
10
ak47  
【字體: 程序員考試:數據結構筆記
程序員考試:數據結構筆記
spks.exam8.com 來源:考試吧Exam8.com) 更新:2005-3-25 11:20:00 軟件水平考試 考試論壇


八、回溯法

  回溯跟遞歸都是程序員考試里常出現的問題,大家必須掌握!

  回溯法的有關概念:

  1) 解答樹:葉子結點可能是解,對結點進行后序遍歷.
  2) 搜索與回溯
  五個數中任選三個的解答樹(解肯定有三層,至葉子結點): 
               ROOT 虛根
        /      /    |  \  \
        1      2     3  4   5
    /  |  |  \  / | \    /\  |
    2  3  4  5 3 4 5  4 5  5
   /|\  /\ |  /\ | |
   3 4 5 4 5 5 4 5 5 5

  回溯算法實現中的技巧:棧
  要搞清回溯算法,先舉一個(中序遍歷二叉樹的非遞歸算法)來說明棧在非遞歸中所起的作用。
      A 過程:push()->push()->push()->push()棧內結果:ABDE(E為葉子,結束進棧)
     / \   pop()   ABD(E無右孩子,出棧)
     B  C   pop()   AB(D無右孩子,出棧) 
    /\     pop()   A(B有右孩子,右孩子進棧)
    D F     .      .
   / /\     .      .
   E G H    .      .
  /        .      .
  I        最后結果: EDBGFIHAC
  簡單算法:
    …
   if(r!=NULL) //樹不空
   { while(r!=NULL) 
    { push(s,r);
     r=r->lch;   //一直向左孩子前進
    }
    while(!empty(s)) // 棧非空,出棧
    { p=pop(s);
     printf(p->data);
     p=p->rch;   //向右孩子前進
     while(p!=NULL)
     { push(s,p);
      p=p->lch; //右孩子進棧
     }
    } 
   } //這就是傳說中的回溯,嘻嘻……沒嚇著你吧

  5選3問題算法:

  思想: 進棧:搜索
  出棧:回溯
  邊建樹(進棧)邊遍歷(出棧)
  基本流程: 
  太復雜了,再說我不太喜歡用WORD畫圖(有損形象),以后再整理!

  程序: n=5;r=3
     ……
     init(s)  //初始化棧
     push(s,1) //根進棧
     while(s.top<r-1)&&(s.data[s.top]!=n) //有孩子
      push(s,s.data[s.top]+1); //孩子入棧
     while(!empty(s))
     { if(s.top=r-1)
      判斷該"解"是否為解.
      x=pop(s); //保留x,判斷是否為最大值n,如果是n,則出棧
      while(x==n)
      x=pop(s);
      push(s,x+1);
      while(s.top<r-1)&&(s.data[s.top]!=n)
      push(s,s.data[s.top]+1);
     }

  背包問題: TW=20 , w[5]={6,10,7,5,8} 

  解的條件:1) 該解答樹的葉子結點
  2) 重量最大
  解答樹如下:   ROOT
       / | | | \
          6 10   7   5  8
        / | | \  / | \  / \ | 
        10 7 5 8 7 5 8 5  8 8
         | |      | 
         5 8      8
  程序:
  temp_w 表示棧中重量和
  …
  init(s); //初始化棧
  i=0;
  While(w[i]>TW)
   i++;
   If(i==n) Return -1; //無解
   Else {
    Push(s,i);
    Temp_w=w[i];
    i++;
    while(i<n)&&(temp_w+w[i]<=TW)
     { push(s,i);
      temp_w+=w[i];
      i++;
    }
    max_w=0;
    while(!empty(s))
     { if(max_w<temp_w)
       max_w=temp_w;
       x=pop(s);
       temp_w-=w[x];
       x++;
       while(x<n)&&(temp_w+w[x]>TW)
        x++;
       while(x<n)
       { push(s,x);
        temp_w=temp_w+w[x];
        x++;
        while(x<n)&&(temp_w+w[x]>TW)
        x++;
       }
     }
  請大家思考:四色地圖問題,比如給中國地圖涂色,有四種顏色,每個省選一種顏色,相鄰的省不能取同樣的顏色.不許偷懶,不能選人口不多于xxxxW的"大國"哦!如果真的有一天臺灣獨立了,下場就是這樣了,一種顏色就打發了,不過臺灣的程序員們賺到了,省事!呵呵。

    貪婪法:

  不求最優解,速度快(以精確度換速度)

  例:哈夫曼樹,最小生成樹

  裝箱問題:

  有n個物品,重量分別為w[n],要把這n個物品裝入載重為TW的集裝箱內,需要幾個集裝箱?
  思想1:對n個物品排序
  拿出第1個集裝箱,從大到小判斷能不能放。
  2 …
  3 …
  . …
  . …
  思想2: 對n個物品排序
  用物品的重量去判斷是否需要一只新箱子,如果物品重量小于本箱子所剩的載重量,則裝進去,反之則取一只新箱子。

  程序:
  count=1;qw[0]=TW;
  for(i=0;i<n;i++)
  {
   k=0;
   while(k<count)&&(w[i]>qw[k])
    k++;
    if(w[i]<=qw[k])
     qw[k]=qw[k]-w[i];
     code[i]=k; //第i個物品放在第k個箱子內
    else
     {count++; //取一個新箱子
      qw[count-1]=TW-w[i];
      code[i]=count-1;
    }
  }

  用貪婪法解背包問題:
  n個物品,重量:w[n] 價值v[i]
  背包限重TW,設計一個取法使得總價值最大.
  方法:
   0  1  2  3 … n-1
   w0  w1  w2  w3 … wn-1
   v0  v1  v2  v3 … vn-1 
   v0/w0  …     v(n-1)/w(n-1) 求出各個物品的"性價比"

  先按性價比從高到低進行排序

  已知:w[n],v[n],TW
  程序:
  …
  for(I=1;I<n;I++)
   d[i]=v[i]/w[i]; //求性價比
   for(I=0;I<n;I++)
   { max=-1;
    for(j=0;j<n;j++)
    { if(d[j]>max)
     { max=d[j];x=j; }
    } 
    e[i]=x;
    d[x]=0;
   }
   temp_w=0;temp_v=0;
  for(i=0;i<n;i++)
   { if(temp_w+w[e[i]]<=TW)
     temp_v=temp_v+v[e[v]];
  }

    分治法:

  思想:把規模為n的問題進行分解,分解成幾個小規模的問題.然后在得到小規模問題的解的基礎上,通過某種方法組合成該問題的解.

  例:數軸上有n個點x[n],求距離最小的兩個點.
  分:任取一點,可以把x[i]這n個點分成兩個部分
  小的部分 分點 大的部分
    |_._.__.__.____._|__._._.__._.__._______._.__._._.__.___._____._|
  治:解=min{小的部分的距離最小值;
   大的部分的距離最小值;
   大的部分最小點和小的部分最大點這兩點之差;}

      想必大家看到這里也累了,那就留一份模擬題給大家做做吧,看一下自己的實力。答案附在后面那。

上一頁  [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一頁

轉帖于:軟件水平考試_考試吧
文章搜索  
看了本文的網友還看了:
軟件水平考試權威輔導教材: 訂書電話:010-62168566  更多>>>
網友評論
昵 稱: *  評 分: 1分 2分 3分 4分 5分
標題:   匿名發表    (共有條評論)查看全部評論>>
版權聲明 -------------------------------------------------------------------------------------
  如果軟件水平考試網所轉載內容不慎侵犯了您的權益,請與我們聯系,我們將會及時處理。如轉載本軟件水平考試網內容,請注明出處。
關于本站  網站聲明  廣告服務  聯系方式  付款方式  站內導航  客服中心  友情鏈接  考試論壇  網站地圖
Copyright © 2004-2008 考試吧軟件水平考試網 All Rights Reserved    
中國科學院研究生院權威支持(北京) 電 話:010-62168566 傳 真:010-62192699
百度大聯盟黃金認證  十佳網絡教育機構  經營許可證號:京ICP060677
主站蜘蛛池模板: 久久久免费的精品 | 国产一级视频 | 看全黄大色黄大片美女51la | 免费黄色在线视频 | 天天躁狠狠躁夜躁2021 | 午夜精品在线视频 | 天天夜碰日日摸日日澡 | 久久国产精品佐山爱 | 中文字幕一区二区三区免费看 | 成人午夜看片在线观看 | 手机国产日韩高清免费看片 | 高h啃咬花蒂 | 亚洲精品福利在线观看 | 成年人在线观看免费视频 | 亚洲欧洲日产国码 最新 | 女人牲交视频一级毛片 | 欧美成人观看视频在线 | 手机看片1024国产 | 欧美激情视频网 | 欧美一区二区三区免费不卡 | 破外女出血一级毛片 | 亚洲欧美日韩第一页 | 欧美精品伊人久久 | 成人私人影院www片免费高清 | 一个人看的www免费观看视频 | 国产精品嫩草影院在线观看免费 | 国产成人久久一区二区三区 | 在线观看麻豆国产精品 | 欧美成人手机视频免费播放 | 操操干 | 成人免费视频视频在线不卡 | 亚洲国产第一区二区香蕉 | 中文字幕在线看视频一区二区三区 | 精品国产a| 干一干操一操 | 中文xxx视频| 男女猛烈无遮挡性视频 | 亚洲欧洲日韩综合色天使不卡 | 中国黄色一级视频 | 成人网址在线观看 | 一级做a爱片性色毛片武则天五则 |