圖形(Graph)

Da-Wei Chiang

大綱

  • 圖形基本概念
    • 圖形應用
    • 加權圖形
  • 有向與無向圖形
    • 有向圖形應用
  • 廣度優先搜尋法
  • 深度優先搜尋法

圖形基本概念

圖形應用 - 1

圖形應用 - 2

  • 台北捷運部分地圖

加權圖形

  • 加權的數字意義可以自行定義. 如圖中的數字可以表示兩個人關係的距離或住家的距離...等等

有向與無向圖形

  • 上述圖形中節點與節點之間沒有方向性我們稱為無向圖形.
  • 有向圖形如下圖所示

有向圖形應用

廣度優先搜尋法(Breadth First Search)

  • 電腦圖形理論的搜尋演算法
  • 概念:一層一層的搜尋, 當搜尋第一層沒有答案在搜尋第二層, 第二層搜尋沒有答案在搜尋第三層...依此類推

圖例 - 廣度優先搜尋法(Breadth First Search)

  • 假設有個圖形如下, 試圖搜尋G節點

圖例 - 廣度優先搜尋法(Breadth First Search)

  • 首先我們宣告一個佇列, 放入預備搜尋的節點. 並從頂點A開始搜尋

圖例 - 廣度優先搜尋法(Breadth First Search)

  • 發現A不是目標節點, 並將A加入已搜尋過串列. 並將A的子節點B、C加入預搜尋佇列中

圖例 - 廣度優先搜尋法(Breadth First Search)

  • 接著搜尋B. 發現B不是目標節點, 並將B加入已搜尋過串列.且將B的子節點D、E、F加入預搜尋佇列中

圖例 - 廣度優先搜尋法(Breadth First Search)

  • 接著搜尋C. 發現C不是目標節點, 並將C加入已搜尋過串列.且將C的子節點G、H加入預搜尋佇列中

圖例 - 廣度優先搜尋法(Breadth First Search)

  • 接著搜尋D. 發現D不是目標節點, 並將D加入已搜尋過串列.因為D為葉節點, 沒有其它子節點故無節點加入預搜尋佇列.

圖例 - 廣度優先搜尋法(Breadth First Search)

  • 接著搜尋E. 發現E不是目標節點, 並將E加入已搜尋過串列.且將E的子節點I加入預搜尋佇列中

圖例 - 廣度優先搜尋法(Breadth First Search)

  • 接著搜尋F. 發現F不是目標節點, 並將F加入已搜尋過串列.且將F的子節點J加入預搜尋佇列中

圖例 - 廣度優先搜尋法(Breadth First Search)

  • 接著搜尋G. 發現G是目標節點.完成搜尋

實作上我們怎麼描繪一個圖形?可用字典或鏈結串列表示.

  • 如上述圖示範例字典可表示為
    {
      A:[B, C],
      B:[D, E, F],
      C:[G, H],
      D:[],
      E:[I],
      F:[J],
      G:[],
      H:[K],
      I:[],
      J:[],
      K:[]
    }
    

練習

  • 使用上述字典範例作為圖形, 讓使用者輸入要搜尋的節點.
  • 撰寫廣度搜尋法搜尋此節點, 並輸出搜尋到節點時所搜尋過的所有節點.

深度優先搜尋法(Depth First Search)

  • 電腦圖形理論的搜尋演算法
  • 概念:先深入一個路徑搜尋, 當深入這個路徑的末端都沒搜尋到時. 則回到前一層找尋可搜尋的路徑深入搜尋...依此類推.

圖例 - 深度優先搜尋法(Depth First Search)

  • 假設有個圖形如下, 試圖搜尋G節點

圖例 - 深度優先搜尋法(Depth First Search)

  • 首先我們宣告一個堆疊, 放入預備搜尋的節點. 並從頂點A開始搜尋

圖例 - 深度優先搜尋法(Depth First Search)

  • 從堆疊中取出A放入已搜尋的串列, 並檢查A是否為目標節點. 由於A不是目標節點, 故將其子節點B、C存入堆疊中.

圖例 - 深度優先搜尋法(Depth First Search)

  • 從堆疊中取出B放入已搜尋的串列, 並檢查B是否為目標節點. 由於B不是目標節點, 故將其子節點D、E、F存入堆疊中.

圖例 - 深度優先搜尋法(Depth First Search)

  • 從堆疊中取出D放入已搜尋的串列, 並檢查D是否為目標節點. 由於D不是目標節點, 且其為葉節點.故無其他節點存入堆疊中.

圖例 - 深度優先搜尋法(Depth First Search)

  • 從堆疊中取出E放入已搜尋的串列, 並檢查E是否為目標節點. 由於E不是目標節點, 故將其子節點I存入堆疊中.

圖例 - 深度優先搜尋法(Depth First Search)

  • 從堆疊中取出I放入已搜尋的串列, 並檢查I是否為目標節點. 由於I不是目標節點, 且其為葉節點.故無其他節點存入堆疊中.

圖例 - 深度優先搜尋法(Depth First Search)

  • 從堆疊中取出F放入已搜尋的串列, 並檢查F是否為目標節點. 由於F不是目標節點, 故將其子節點J存入堆疊中.

圖例 - 深度優先搜尋法(Depth First Search)

  • 從堆疊中取出J放入已搜尋的串列, 並檢查J是否為目標節點. 由於J不是目標節點, 且其為葉節點.故無其他節點存入堆疊中.

圖例 - 深度優先搜尋法(Depth First Search)

  • 從堆疊中取出C放入已搜尋的串列, 並檢查C是否為目標節點. 由於C不是目標節點, 故將其子節點G、H存入堆疊中.

圖例 - 深度優先搜尋法(Depth First Search)

  • 從堆疊中取出G放入已搜尋的串列, 並檢查G是否為目標節點. 由於G為目標節點.故完成搜尋

練習

  • 使用上述字典範例作為圖形, 讓使用者輸入要搜尋的節點.
  • 撰寫深度搜尋法搜尋此節點, 並輸出搜尋到節點時所搜尋過的所有節點.