青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
數(shù)據(jù)加載中……

深度優(yōu)先搜索和廣度優(yōu)先搜索

一、深度優(yōu)先搜索 
   
深度優(yōu)先搜索就是在搜索樹的每一層始終先只擴(kuò)展一個(gè)子節(jié)點(diǎn),不斷地向縱深前進(jìn)直到不能再前進(jìn)(到達(dá)葉子節(jié)點(diǎn)或受到深度限制)時(shí),才從當(dāng)前節(jié)點(diǎn)返回到上一級(jí)節(jié)點(diǎn),沿另一方向又繼續(xù)前進(jìn)。這種方法的搜索樹是從樹根開始一枝一枝逐漸形成的。

     
深度優(yōu)先搜索亦稱為縱向搜索。由于一個(gè)有解的問題樹可能含有無窮分枝,深度優(yōu)先搜索如果誤入無窮分枝(即深度無限),則不可能找到目標(biāo)節(jié)點(diǎn)。所以,深度優(yōu)先搜索策略是不完備的。另外,應(yīng)用此策略得到的解不一定是最佳解(最短路徑)。

二、    重排九宮問題游戲
在一個(gè)33的九宮中有1-88個(gè)數(shù)及一個(gè)空格隨機(jī)擺放在其中的格子里。如下面左圖所示。現(xiàn)在要求實(shí)現(xiàn)這樣的問題:將該九宮調(diào)整為如下圖右圖所示的形式。調(diào)整規(guī)則是:每次只能將與空格(上,下或左,右)相臨的一個(gè)數(shù)字平移到空格中。試編程實(shí)現(xiàn)。

| 2 | 8  | 3 |                 | 1 | 2 | 3 |
-
| 1 |     | 4 |                 | 8 |    | 4 |

| 7 | 6  | 5 |                 | 7 | 6 | 5 |

深度優(yōu)先搜索的路徑示意圖:

clip_image001

 

三、廣度優(yōu)先搜索

     在深度優(yōu)先搜索算法中,是深度越大的結(jié)點(diǎn)越先得到擴(kuò)展。如果在搜索中把算法改為按結(jié)點(diǎn)的層次進(jìn)行搜索,本層的結(jié)點(diǎn)沒有搜索處理完時(shí),不能對(duì)下層結(jié)點(diǎn)進(jìn)行處理,即深度越小的結(jié)點(diǎn)越先得到擴(kuò)展,也就是說先產(chǎn)生的結(jié)點(diǎn)先得以擴(kuò)展處理,這種搜索算法稱為廣度優(yōu)先搜索法。

廣度優(yōu)先搜索路徑示意圖:

clip_image003

 

四、航班問題(來自《The Art of Java)
   
一位顧客要預(yù)定一張從New YorkLos Angeles的航班機(jī)票,下面是航班線路,請(qǐng)你為顧客找一種購(gòu)票方案。

航班

距離

New YorkChicago

900英里

ChicagoDenver

1000英里

New YorkToronto

500英里

New YorkDenver

1800英里

TorontoCalgary

1700英里

TorontoLos Angeles

2500英里

TorontoChicago

500英里

DenverUrbana

1000英里

DenverHouston

1000英里

HoustonLos Angeles

1500英里

DenverLos Angeles

1000英里

下面是用深度優(yōu)先搜索求解的程序:

// Find connections using a depth-first search.
import java.util.*;
import java.io.*;
// Flight information.
class FlightInfo {
  String from;
  String to;
  int distance;
  boolean skip; // used in backtracking
  FlightInfo(String f, String t, int d) {
    from = f;
    to = t;
    distance = d;
    skip = false;
  }
}
class Depth {
  final int MAX = 100;
  // This array holds the flight information.
  FlightInfo flights[] = new FlightInfo[MAX];
  int numFlights = 0; // number of entries in flight array
  Stack btStack = new Stack(); // backtrack stack
  public static void main(String args[])
  {
   
    String to, from;
    Depth ob = new Depth();
    BufferedReader br = new
      BufferedReader(new InputStreamReader(System.in));
 
    ob.setup(); 
    try {
      System.out.print("From? ");
      from = br.readLine();
      System.out.print("To? ");
      to = br.readLine();
      ob.isflight(from, to);
      if(ob.btStack.size() != 0)
        ob.route(to);
    } catch (IOException exc) {
      System.out.println("Error on input.");
    }
  }
 
  // Initialize the flight database.
  void setup()
  {
    addFlight("New York", "Chicago", 900);
    addFlight("Chicago", "Denver", 1000);
    addFlight("New York", "Toronto", 500);
    addFlight("New York", "Denver", 1800);
    addFlight("Toronto", "Calgary", 1700);
    addFlight("Toronto", "Los Angeles", 2500);
    addFlight("Toronto", "Chicago", 500);
    addFlight("Denver", "Urbana", 1000);
    addFlight("Denver", "Houston", 1000);
    addFlight("Houston", "Los Angeles", 1500);
    addFlight("Denver", "Los Angeles", 1000);
  }
 
  // Put flights into the database.
  void addFlight(String from, String to, int dist)
  {
 
    if(numFlights < MAX) {
      flights[numFlights] =
        new FlightInfo(from, to, dist);
      numFlights++;
    }
    else System.out.println("Flight database full.\n");
  }
  // Show the route and total distance.
  void route(String to)
  {
    Stack rev = new Stack();
    int dist = 0;
    FlightInfo f;
    int num = btStack.size();
    // Reverse the stack to display route.
    for(int i=0; i < num; i++)
      rev.push(btStack.pop());
    for(int i=0; i < num; i++) {
      f = (FlightInfo) rev.pop();
      System.out.print(f.from + " to ");
      dist += f.distance;
    }
    System.out.println(to);
    System.out.println("Distance is " + dist);
  }
  /* If there is a flight between from and to,
     return the distance of flight;
     otherwise, return 0. */
  int match(String from, String to)
  {
    for(int i=numFlights-1; i > -1; i--) {
      if(flights[i].from.equals(from) &&
         flights[i].to.equals(to) &&
         !flights[i].skip)
      {
        flights[i].skip = true; // prevent reuse
        return flights[i].distance;
      }
    }
    return 0; // not found
  }
 
  // Given from, find any connection.
  FlightInfo find(String from)
  {
    for(int i=0; i < numFlights; i++) {
      if(flights[i].from.equals(from) &&
         !flights[i].skip)
      {
        FlightInfo f = new FlightInfo(flights[i].from,
                             flights[i].to,
                             flights[i].distance);
        flights[i].skip = true; // prevent reuse
        return f;
      }
    }
    return null;
  }
 
  // Determine if there is a route between from and to.
  void isflight(String from, String to)
  {
    int dist;
    FlightInfo f;
    // See if at destination.
    dist = match(from, to);
    if(dist != 0) {
      btStack.push(new FlightInfo(from, to, dist));
      return;
    }
    // Try another connection.
    f = find(from);
    if(f != null) {
      btStack.push(new FlightInfo(from, to, f.distance));
      isflight(f.to, to);
    }
    else if(btStack.size() > 0) {
      // Backtrack and try another connection.
      f = (FlightInfo) btStack.pop();
      isflight(f.from, f.to);
    }
  }
} 
 

clip_image004

解釋:isflight()方法用遞歸方法進(jìn)行深度優(yōu)先搜索,它先調(diào)用match()方法檢查航班的數(shù)據(jù)庫(kù),判斷在fromto之間有沒有航班可達(dá)。如果有,則獲取目標(biāo)信息,并將該線路壓入棧中,然后返回(找到一個(gè)方案)。否則,就調(diào)用find()方法查找from與任意其它城市之間的線路,如果找到一條就返回描述該線路的FlightInfo對(duì)象,否則返回null。如果存在這樣的一條線路,那么就把該線路保存在f中,并將當(dāng)前航班信息壓到棧的頂部,然后遞歸調(diào)用isflight()方法 ,此時(shí)保存在f.to中的城市成為新的出發(fā)城市.否則就進(jìn)行回退,彈出棧頂?shù)牡谝粋€(gè)節(jié)點(diǎn),然后遞歸調(diào)用isflight()方法。該過程將一直持續(xù)到找到目標(biāo)為止。

 

程序運(yùn)行結(jié)果:


C:\java>java Depth
From? New York
To? Los Angeles
New York to Chicago to Denver to Los Angeles
Distance is 2900

C:\java>

      深度優(yōu)先搜索能夠找到一個(gè)解,同時(shí),對(duì)于上面這個(gè)特定問題,深度優(yōu)先搜索沒有經(jīng)過回退,一次就找到了一個(gè)解;但如果數(shù)據(jù)的組織方式不同,尋找解時(shí)就有可能進(jìn)行多次回退。因此這個(gè)例子的輸出并不具有普遍性。而且,在搜索一個(gè)很長(zhǎng),但是其中并沒有解的分支的時(shí)候,深度優(yōu)先搜索的性能將會(huì)很差,在這種情況下,深度優(yōu)先搜索不僅在搜索這條路徑時(shí)浪費(fèi)時(shí)間,而且還在向目標(biāo)的回退中浪費(fèi)時(shí)間。

再看對(duì)這個(gè)例子使用廣度優(yōu)先搜索的程序:

// Find connections using a breadth-first search.
import java.util.*;
import java.io.*;
// Flight information.
class FlightInfo {
  String from;
  String to;
  int distance;
  boolean skip; // used in backtracking
  FlightInfo(String f, String t, int d) {
    from = f;
    to = t;
    distance = d;
    skip = false;
  }
}
class Breadth {
  final int MAX = 100;
  // This array holds the flight information.
  FlightInfo flights[] = new FlightInfo[MAX];
  int numFlights = 0; // number of entries in flight array
  Stack btStack = new Stack(); // backtrack stack
  public static void main(String args[])
  {
    String to, from;
    Breadth ob = new Breadth();
    BufferedReader br = new
      BufferedReader(new InputStreamReader(System.in));
 
    ob.setup(); 
    try {
      System.out.print("From? ");
      from = br.readLine();
      System.out.print("To? ");
      to = br.readLine();
      ob.isflight(from, to);
      if(ob.btStack.size() != 0)
        ob.route(to);
    } catch (IOException exc) {
      System.out.println("Error on input.");
    }
  }
 
  // Initialize the flight database.
  void setup()
  {
    addFlight("New York", "Chicago", 900);
    addFlight("Chicago", "Denver", 1000);
    addFlight("New York", "Toronto", 500);
    addFlight("New York", "Denver", 1800);
    addFlight("Toronto", "Calgary", 1700);
    addFlight("Toronto", "Los Angeles", 2500);
    addFlight("Toronto", "Chicago", 500);
    addFlight("Denver", "Urbana", 1000);
    addFlight("Denver", "Houston", 1000);
    addFlight("Houston", "Los Angeles", 1500);
    addFlight("Denver", "Los Angeles", 1000);
  }
 
  // Put flights into the database.
  void addFlight(String from, String to, int dist)
  { 
    if(numFlights < MAX) {
      flights[numFlights] =
        new FlightInfo(from, to, dist);
      numFlights++;
    }
    else System.out.println("Flight database full.\n");
  }
  // Show the route and total distance.
  void route(String to)
  {
    Stack rev = new Stack();
    int dist = 0;
    FlightInfo f;
    int num = btStack.size();
    // Reverse the stack to display route.
    for(int i=0; i < num; i++)
      rev.push(btStack.pop());
    for(int i=0; i < num; i++) {
      f = (FlightInfo) rev.pop();
      System.out.print(f.from + " to ");
      dist += f.distance;
    }
    System.out.println(to);
    System.out.println("Distance is " + dist);
  }
  /* If there is a flight between from and to,
     return the distance of flight;
     otherwise, return 0. */
  int match(String from, String to)
  {
    for(int i=numFlights-1; i > -1; i--) {
      if(flights[i].from.equals(from) &&
         flights[i].to.equals(to) &&
         !flights[i].skip)
      {
        flights[i].skip = true; // prevent reuse
        return flights[i].distance;
      }
    }
    return 0; // not found
  }
 
  // Given from, find any connection.
  FlightInfo find(String from)
  {
    for(int i=0; i < numFlights; i++) {
      if(flights[i].from.equals(from) &&
         !flights[i].skip)
      {
        FlightInfo f = new FlightInfo(flights[i].from,
                             flights[i].to,
                             flights[i].distance);
        flights[i].skip = true; // prevent reuse
        return f;
      }
    }
    return null;
  }
 
  /* Determine if there is a route between from and to
     using breadth-first search. */
  void isflight(String from, String to)
  {
    int dist, dist2;
    FlightInfo f;
    // This stack is needed by the breadth-first search.
    Stack resetStck = new Stack();
    // See if at destination.
    dist = match(from, to);
    if(dist != 0) {
      btStack.push(new FlightInfo(from, to, dist));
      return;
    }
    /* Following is the first part of the breadth-first
       modification.  It checks all connecting flights
       from a specified node. */
    while((f = find(from)) != null) {
      resetStck.push(f);
      if((dist = match(f.to, to)) != 0) {
        resetStck.push(f.to);
        btStack.push(new FlightInfo(from, f.to, f.distance));
        btStack.push(new FlightInfo(f.to, to, dist));
        return;
      }
    }
    /* The following code resets the skip fields set by
       preceding while loop. This is also part of the
       breadth-first modifiction. */
    int i = resetStck.size();
    for(; i!=0; i--)
      resetSkip((FlightInfo) resetStck.pop());
    // Try another connection.
    f = find(from);
    if(f != null) {
      btStack.push(new FlightInfo(from, to, f.distance));
      isflight(f.to, to);
    }
    else if(btStack.size() > 0) {
      // Backtrack and try another connection.
      f = (FlightInfo) btStack.pop();
      isflight(f.from, f.to);
    }
  }
  // Reset skip field of specified flight.
  void resetSkip(FlightInfo f) {
    for(int i=0; i< numFlights; i++)
      if(flights[i].from.equals(f.from) &&
         flights[i].to.equals(f.to))
           flights[i].skip = false;
  }
}

程序運(yùn)行結(jié)果:

C:\java>java Breadth
From? New York
To? Los Angeles
New York to Toronto to Los Angeles
Distance is 3000

C:\java>

它找到了一個(gè)合理的解,但這不具有一般性。因?yàn)檎业降牡谝粭l路徑取決于信息的物理組織形式。

clip_image005

 

如果目標(biāo)在搜索空間中隱藏得不是太深,那么廣度優(yōu)先搜索的性能會(huì)很好。

 

 

posted on 2009-01-04 21:03 肥仔 閱讀(6012) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Web-后臺(tái)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            黑人一区二区| 久久www成人_看片免费不卡| 欧美一区二区三区在线观看| 亚洲欧洲一区二区在线播放| 欧美大片第1页| 欧美国产在线观看| 午夜精品久久久久久久久| 欧美在线啊v| 麻豆国产精品777777在线 | 欧美精品粉嫩高潮一区二区 | 麻豆视频一区二区| 欧美国产第二页| 美日韩丰满少妇在线观看| 亚洲精品资源美女情侣酒店| 亚洲欧美日产图| 一本一本久久a久久精品综合妖精| 毛片av中文字幕一区二区| 亚洲欧美在线一区| 亚洲国产成人精品久久| 欧美一区二区视频观看视频| 国产午夜精品视频免费不卡69堂| 亚洲高清自拍| 亚洲精品久久| 亚洲精品视频在线| 99精品国产福利在线观看免费 | 亚洲男人av电影| 韩日欧美一区| 久久亚洲私人国产精品va媚药| 日韩视频二区| 欧美大胆a视频| 正在播放亚洲| 国产欧美日韩三级| 亚洲精品乱码久久久久久| 国产日韩欧美精品| 性久久久久久| 久久成人精品一区二区三区| 欧美色欧美亚洲高清在线视频| 另类图片国产| 欧美成人国产va精品日本一级| 亚洲国产精品欧美一二99| 小黄鸭精品aⅴ导航网站入口| 亚洲男同1069视频| 国产精品美女主播| 性欧美大战久久久久久久免费观看 | 国内成+人亚洲| 在线综合亚洲| 亚洲日本aⅴ片在线观看香蕉| 毛片一区二区三区| 免费亚洲电影在线观看| 亚洲一区二区毛片| 国产一区二区三区精品久久久| 亚洲经典自拍| 午夜精品久久久久| 亚洲婷婷综合色高清在线| 国产精品亚洲综合天堂夜夜| 国产主播一区| 国产精品超碰97尤物18| 亚洲女人天堂成人av在线| 亚洲欧洲日产国产综合网| 亚洲第一中文字幕| 国产精品99久久久久久久女警| 国产精品捆绑调教| 国产精品www| 欧美日韩三区四区| 国产热re99久久6国产精品| 国产亚洲精品美女| 欧美吻胸吃奶大尺度电影| 国产视频丨精品|在线观看| 国产精品国产福利国产秒拍| 欧美国产日韩一区| 欧美日韩视频在线| 在线电影国产精品| 黑人一区二区三区四区五区| 欧美激情在线狂野欧美精品| 欧美精品国产精品| 欧美日本一道本| 欧美成人免费网站| 亚洲综合国产精品| 久久尤物电影视频在线观看| 国产女人水真多18毛片18精品视频| 国产一区二区三区高清在线观看| 国产一区二区三区的电影| 久久不射网站| 一区二区在线看| 久久久一区二区三区| 亚洲新中文字幕| 亚洲欧美一区二区精品久久久| 欧美精品一区二区三区一线天视频| 久久精品国产视频| 国产精品久久久久久久一区探花| 亚洲国产精品久久人人爱蜜臀 | 久久久噜噜噜久久狠狠50岁| 久久久女女女女999久久| 欧美日韩另类字幕中文| 国产精品大全| 99国产麻豆精品| 久久夜色精品国产欧美乱极品| 国产在线国偷精品产拍免费yy| 欧美一区二区三区四区高清| 午夜国产一区| 欧美日韩国产探花| 在线观看久久av| 久久精品国产第一区二区三区最新章节 | 久久久99精品免费观看不卡| 久久一区免费| 久久久久99精品国产片| 亚洲七七久久综合桃花剧情介绍| 亚洲欧美综合网| 亚洲欧美日韩另类精品一区二区三区| 久久激情中文| 亚洲国产另类精品专区| 亚洲自拍偷拍视频| 欧美91精品| 一区二区三区 在线观看视频| 亚洲欧洲精品一区| 欧美三日本三级少妇三2023| 尤物yw午夜国产精品视频明星| 久久影视精品| 欧美日韩精品免费在线观看视频| 亚洲免费成人av| 尤物九九久久国产精品的分类| 久久成人免费网| 欧美日韩一区二区三区四区在线观看 | 国产伦精品一区二区三区免费 | 亚洲一区免费看| 欧美激情1区| 伊人婷婷久久| 久久午夜色播影院免费高清| 久久精品亚洲热| 久久久精品欧美丰满| 欧美一区综合| 久久久蜜桃精品| 久久精品国产清高在天天线| 亚洲美女毛片| 欧美在线免费视频| 亚洲淫片在线视频| 国产精品国产三级国产aⅴ9色 | 国产精品福利av| 亚洲国内精品| 欧美一级专区| 欧美激情亚洲视频| 久久久久久电影| 欧美日韩一区在线观看| 亚洲性感美女99在线| 亚洲精品资源| 一区二区三区www| 亚洲欧美在线高清| 久热精品在线视频| 好吊妞这里只有精品| 亚洲精品孕妇| 欧美亚洲免费在线| 亚洲国产成人tv| 国产女主播一区二区三区| 久久婷婷国产综合精品青草| 亚洲免费视频在线观看| 宅男噜噜噜66一区二区66| 亚洲电影第三页| 亚洲欧美清纯在线制服| 亚洲综合视频1区| 狂野欧美一区| 亚洲伊人一本大道中文字幕| 欧美在线不卡| 亚洲一区免费| 在线中文字幕一区| 一区二区成人精品 | 伊人久久噜噜噜躁狠狠躁| 久久福利视频导航| 欧美激情a∨在线视频播放| 欧美专区在线观看| 91久久精品日日躁夜夜躁欧美| 噜噜噜噜噜久久久久久91| 免费亚洲一区| 亚洲欧美国产精品桃花| 亚洲欧美精品中文字幕在线| 国产麻豆精品在线观看| 久久久国产亚洲精品| 欧美精品久久久久久久久久| 亚洲综合导航| 蜜臀av在线播放一区二区三区| 亚洲最新在线视频| 99国产麻豆精品| 国产亚洲精品久久久久动| 美日韩精品免费| 一区二区三区国产盗摄| 久久一区国产| 亚洲国产91精品在线观看| 亚洲一区二区三区免费观看 | 日韩视频一区二区| 一区二区三区四区五区精品| 亚洲大胆视频| 久久国产精品电影| 欧美激情在线观看| 国产日韩在线一区二区三区| 亚洲精品欧美日韩| av成人黄色| 久久精品国产一区二区电影| 免播放器亚洲一区| 国产专区一区| 久久久水蜜桃| 亚洲第一精品影视|