電腦科學 ^ IT人生 ^ 公益課程

#8 如何快速搜尋資料 - Binary Search

在以前還沒念電腦科學之前,對於快速搜尋這件事情完全沒什麼概念,唯一知道就是在一堆資料裡面一個一個找了,對於沒念過電腦科學的人來說,一個一個找是最直覺也是最簡單的方法.想像一個情況,一個 Array 裡面有一百個整數,假設每一個整數的值都不一樣,那麼我們想要知道這個 Array 裡面有沒有 77 這個數字,最直接的方法就是從 Array 的第一個元素找到最後一個元素,最好的情況是 77 這數字剛好在 Array 的第一個位置,那麼很快就可以找到了,若最壞的情況是 77 落在 Array 的最後一個位置或是 77 根本不在這裡面,那麼我們就必須從第一個元素找到最後一個元素.從我們之前講的 Big O 來看,這樣的搜尋所花的時間複雜度是 O(n).這樣的情況有沒有可能更有效率呢?

如果我們今天很幸運得到一個已經排序好的 Array,那麼我們還需要從第一個找到最後一個嗎? 看來不一定喔! 想一想,如果是一個已經排序好的 Array,我們要從什麼地方開始找會比較好 ? 看看下圖的 Array,如果你要找 77 的話,你打算要怎麼找才能快一點.


在電腦科學的基礎課程中提供了一個簡單的方法,簡單的說就是用二分法來找,也就是 binary search.這個方法很簡單,一開始先從中間的位置開始找,以上圖的例子來看,中間是 55,如果我們要找 77 ,我們就知道 77 一定會在後面,不會在前面,原因就是這些元素都已經從小到大排序好了.接著,再用相同的方法,把後面的內容 (64,77,82,97) 再從中間找,而上述的例子剛好就找到了 77,所以一下子就找到了目標.

Binary search 是一個很簡單的概念,也是許多搜尋技術最基礎的想法.當我們再在一堆資料裡面去找某一個特定目標時,如果這一堆資料沒有特別的分類方法時,則很難產生出一個有效率的尋找過程,但如果這一堆資料經過了特別的分類方法,則就有機會產生出一個有效率的尋找過程.以 Binary search 來說,把資料排序好就是這個分類方法,而每次從中間元素開始找就是依這個分類方法而提出的有效率的尋找過程.

如果把層次拉到資料庫的產品,資料庫會有一堆的資料,而資料庫可以建立 B-tree,然後透過這個 B-tree 來尋找資料,所以資料庫引擎才能快速找到目標資料.B-tree 就是上述所說的分類方法,而在 B-tree 上游走就是上述的有效率的尋找過程.

如果把層次拉到像 Google 那樣的搜尋引擎,他們一定有很多的伺服器做索引之用,然後這些伺服器可以為同一個使用者要求來服務,所以當你輸入某個關鍵字時,才能如此快速得到結果,只不過這種層次的分類方法和有效率的尋找過程都是相當複雜的分散式程式.

Share: