基本演算法介紹-搜尋


搜尋(search) 演算法

搜尋(search) 演算法:在大量資料中找出目標資料的演算法

(1)日常生活的應用

例如從通訊錄找出某好友的電話號碼、利用電話號碼或身分證,找出會員資料或是從字典中查詢某一個單字

(2)搜尋(search) 演算法種類

最常用的搜尋演算法有

循序搜尋法(Sequential Search)

二分搜尋法(Binary Search)

牛刀小試1-搜尋演算法種類

解說:

循序搜尋法(Sequential Search)

範例

(1)Pokemons 這一排櫃子裡有4隻神奇寶貝,假設每個櫃子的門都被關上,我們事前也不知道各個神奇寶貝的位置,這時如果想要知道「比獸」神奇寶貝在哪裡時,我們第一個想到的方法會是什麼呢? 最直觀地想,我們會從第一個櫃子開始試,一次開一個櫃子,直到找到「比獸」為止。像這樣的搜尋方法,就是最經典簡單的「簡易搜尋」。

(2)假設原始資料有:5、17、33、41、55、61 、80這 7 個隨機數字,搜尋的目標資料是33,因為原始資料只有 7 個數字,所以你能夠一眼就看到33 在原始資料的第 3 筆,但是如果資料量暴增到 1000 個,你就得要從解決問題的過程中找出規則,將其發展成一套搜尋演算法,而這套演算法適用於各種大小的資料量與各種不同的目標資料。

思考問題

想想看此類循序搜尋法有何特色呢?

說明

1.比運氣

2.速度慢(當 n 值很大的時候,例如 1,000,000 筆資料,平均搜尋的就要 50 萬次, 搜尋時間就相對較長)


二分搜尋法(Binary Search)

 

資料來源:Animations from Grokking Algorithms

原始影片https://goo.gl/NM3eku


解說

1到100的終極密碼,一個個從頭慢慢猜最壞要猜100次。但用二分搜尋法(Binary Search)每次從中剖半,留下正確的部分再剖半,7次就能猜出來了。當放大到40億個數字的終極密碼,一個個從頭慢慢猜最壞要猜40億次;後者只要32次就能猜出來了。

如果搜尋的數列已經有排序,應該儘量利用它們已排序的特性,以減少搜尋比對的次數,這是搜尋的基本原則,二分搜尋法是這個基本原則的代表。

範例

假設原始資料有:5、17、33、41、55、61 、80這 7 個隨機數字,在二分搜尋法中,我們先打開最中間的櫃子,發現裡面的數字是 41。因為 55 比 41 大,因此我們知道從一號櫃到三號櫃都不會有 55,接下來只需要檢查五號櫃到七號櫃。 同樣的邏輯,我們打開剩下三個可能性中最中間的櫃子,發現六號櫃裡面的數字是 61,因為 61 比 55 大,我們可以知道七號櫃的數字一定也比 55 大,得知 55 一定就在五號櫃之中。

牛刀小試2-搜尋法視覺化工具

牛刀小試3-猜謎遊戲

猜謎遊戲

思考問題

想想看二分搜尋法有何特色呢?

說明:

1.速度快

2.要排序


搜尋方法的時間複雜度(花費時間)-高中課綱

循序(簡易)搜尋,我們可以知道最壞的情況就是剛好七個步驟(要找的數字是 80 )

二分搜尋法,我們可以先練習去計算各種情況需要的步驟,而最終的答案如下表:


從上表我們可以發現,二分搜尋法最慘最慘,也只需要三個步驟。 推廣到有 n 個櫃子時,我們可以發現:二分搜尋法在每進行一個步驟時,就可以排除掉一半的可能性。每次都能減少一半,因此二分搜尋法最糟最糟也只需要以 2 為底的 log n 個步驟就能完成。當資料量很大時(100萬筆資料)時,此方法搜尋速度就會很快


搜尋程式實作篇(老師可依學生程度實作.此為高一課綱)

循序搜尋法(Sequential Search)(此為高一課綱.但簡單可實作)

http://usr.nkust.org/2018/06/12/scratch-sequential-search/

參考積木

二分搜尋法(Binary Search)實作篇(老師可依學生程度實作.此為高一課綱)

體驗SCRATCH利用二分搜尋 binary search製作猜數字遊戲

https://scratch.mit.edu/projects/89598637/#editor

體驗micro:bit 製作的二分搜尋 binary search製作猜數字遊戲

http://glglace.blogspot.tw/2017/10/1160-microbit-7-binary-search.html

參考積木


牛刀小試4-海戰棋遊戲

解說

https://sites.google.com/a/ntjh.ntct.edu.tw/105pljh/home/searchalgorithm

參考網站