搜尋 Search

154 阅读5分钟

你有找東西的經驗嗎?找書、找衣服、找信件、找聯絡人,通常什麼是最難找的呢,如果沒有事先沒有透過好的分類、好的收納或好的管理,可能會在找東西時找的很辛苦 XD

另外申請一些網路服務的時候,像是會員申請或是會員登入時,系統可以快速辨別此用戶是否已經註冊過,或是登入時的帳號密碼是否輸入正確,想像看看在登入 Facebook 時,系統是如果在 30 億的用戶中,快速搜尋到我們的帳戶資料的呢

搜尋 Search

分類 內部搜尋 (Internal Searching) 若資料量很小,則可將所有資料載入記憶體進行搜尋,就像是我們要找鉛筆盒裡面的筆,可以將筆通通掏出來放自己的桌上慢慢找

外部搜尋 (External Searching) 若資料量大,就無法將資料載入到記憶體,記憶體會爆滿,這時候需要使用其他的輔助記憶體來協助,像是硬碟,就像是公司本部已經沒有足夠的空間存放資料,就只能在外面買新的地或租用外部倉庫

靜態搜尋 (Static Searching) 在搜尋過程中,資料是*固定*的,可以預知資料的內容,並不會出現新增或刪除的現象,例如:我們要找某一篇報紙上的英文文章,其中英文字母 A 總共出現幾次,而這篇文章在印刷之後是不會改變的,我們不用擔心在搜尋過程中,會有搜尋錯誤的問題

動態搜尋 (Dynamic Searching) 在搜尋過程中,資料是*不固定*的,可能會出現新增或刪除的變動,例如:在圖書館借書時,雖然在家有事先查過想借的書還在圖書館內,但再前往圖書館或在找書的過程中,很有可能隨時會被其他人借走

  1. 循序搜尋法 (Sequential Search) / 線性搜尋法 (Linear Search)
  2. 二元搜尋法 (Binary Search) / 二分搜尋 (Half-Interval Search)
  3. 內插搜尋法 (Interpolation Search) / 插補搜尋法
  4. 費式搜尋法 (Fibonacci Search) / 費伯那搜尋法

內插搜尋法又稱插補搜尋法,主要是針對已排序的資料進行搜尋,算是二分搜尋法的改良版本,二分法會先找中間值,但內插搜尋法會透過斜率公式初步估算資料可能出現在哪個的位置,很像在一個範圍插入一個可能的位置,並逐漸<mark>縮小</mark>搜尋範圍

你有欣賞過花朵嗎?有沒有注意到,有些花的花瓣大多是 3 瓣或 5 瓣,也有 8 瓣或 13 瓣,為什麼會這些數字這麼常出現呢?似乎是大自然的一種法則

image.png 或是某些建築例會呈現黃金比例,其實都是費氏級數的呈現

image.png

跟內插搜尋法一樣會透過某個公式來限縮搜尋範圍,內插搜尋法是透過斜率公式,而費式搜尋法是使用費式級數來分割,

費式樹

  • 特性
  1. 費氏樹的左右子樹皆為費氏樹
  2. 父節點與子節點的相差值會等於某一個費氏數值
  3. 左節點的數值會小於父節點
  4. 右節點的數值會大於等於父節點

image.png

圖形(樹也是圖的一種)也有搜尋演算法可以使用,例如深度優先搜尋法廣度深度優先搜尋法

你在超市購物時,都是怎麼選購貨架上的物品?是使用左右掃射,還是上下掃瞄呢?哪一種方式可以最快找到你想買的東西呢?

image.png

你玩過迷宮嗎?這是個很考驗運氣、耐性、智慧與勇氣的遊戲,從起點走到終點,會出現很多路徑,面臨多條路徑的選擇時,常常會出現選擇障礙,因為如果選錯可能就會走回頭路,你會怎麼決定你的策略呢?

不管是哪一種,都很有可能走得頭昏眼花、四肢不聽使喚,最後還不見得能順利過關 XD,不知道你有沒有聽過一種可以快速破解迷宮的方法,叫做沿牆走,不過只適用於某些類型的迷宮,最土法煉鋼的方式就是勇敢嘗試,試到最後面一定會找到出口,只怕時間不夠或是你已經感到心疲力竭先放棄了,那要怎麼預防迷路呢?可以學習童話故事中丟麵包屑的方式,讓自己清楚知道要注意哪些路徑?

image.png

深度優先搜尋法 Depth-first Search

如果要找 A 走到 G 的路徑,請找一個與 A 相鄰的點且沒有走過的點,重覆以下兩個動作直到找到目標點或所有點都被走過為止。

只是要特別注意的是走訪過的節點不能再度走訪,所以使用堆疊後進先出的特性來記錄還沒有走過的節點

例如從節點 1 走到節點 6,如果這是一個迷宮,使用深度搜尋實際走的樣子會長這樣

image.png

由上圖可發現,廣度優先會往同一層搜尋,直到找不到未走過節點時,才會往下一層找沒有走過的節點,搜尋順序為:1、2、3、4、5、6、7 image.png

** 戴克斯特拉演算法求最短路徑**

你有自己規劃行程的經驗嗎?如果朋友住在台中住在想去花蓮旅遊,那麼你會怎麼建議行程呢?是建議從南投走橫貫公路,還是從繞到台北宜蘭,還是打開 googe map 直接看哪個路徑比較短,或是花費的時間比較少,由下圖可以看到 google map 推薦路程時間最少的 (走往台北的路徑),而不是距離最短的路徑 (走往南投的路徑)

image.png

如果僅以作為挑選路徑的考量,也就是圖形中 A 點到 B 點經過幾個邊,可以使用昨天介紹的廣度或深度演算法,但如果加上時間的考量,則廣度搜尋演算法的結果並不一定會等於戴克斯特拉演算法的結果

image.png

image.png