學習軌道
/
Python
Python
/
練習
/
二分搜尋
二分搜尋

二分搜尋

簡單

簡介

你偶然遇上了一群既是數學家、也是創作歌手的人。 他們為每一個自己喜歡的數字寫了一首歌,而你可以想見,他們喜歡的數字還真不少(例如 0、73 或 6174)。

你很想知道自己最喜歡的數字是哪一首歌,但歌這麼多,要找到正確的那一首可得花上一段時間。 幸好,他們把歌曲整理成一份依標題排序的播放清單,而標題就是歌曲所描寫的那個數字。

你發現,只要用二分搜尋演算法,就能依標題快速找到想聽的那首歌。

說明

你的任務是實作二分搜尋演算法。

二分搜尋演算法會反覆把陣列切成兩半,只留下包含我們要找的項目的那一半,藉此在陣列中找到項目。 它可以讓我們快速縮小項目可能出現的位置,直到找到它,或是排除所有可能的位置。

Caution

二分搜尋只有在陣列已經排序過時才能運作。

這個演算法的流程如下:

  • 找出_已排序_陣列中間的元素,並拿它和我們要找的項目比較。
  • 如果中間的元素就是我們要找的項目,那就完成了!
  • 如果中間的元素比我們的項目大,就可以排除那個元素以及它之後的所有元素。
  • 如果中間的元素比我們的項目小,就可以排除那個元素以及它之前的所有元素。
  • 如果陣列中的每個元素都被排除了,就代表這個項目不在陣列裡。
  • 否則,就對陣列中還沒被排除的部分重複同樣的流程。

來看一個例子:

假設我們要在下面這個已排序的陣列中尋找數字 23:[4, 8, 12, 16, 23, 28, 32]。

  • 我們先拿 23 和陣列中間的元素 16 比較。
  • 因為 23 大於 16,我們可以排除陣列的左半部,剩下 [23, 28, 32]。
  • 接著,我們拿 23 和新的中間元素 28 比較。
  • 因為 23 小於 28,我們可以排除陣列的右半部:[23]。
  • 我們找到目標項目了。

例外訊息

有時候,我們會需要引發例外。這麼做的時候,記得一定要附上有意義的錯誤訊息,指出錯誤的來源是什麼。這能讓你的程式碼更容易閱讀,對除錯也有很大的幫助。如果你知道錯誤來源會是某種特定的型別,可以選擇引發其中一種內建的錯誤型別,但仍然要附上有意義的訊息。

這個練習特別要求你,當給定的值無法在陣列中找到時,使用 raise 陳述句來「拋出」一個 ValueError。只有同時raise這個exception並附上訊息,測試才會通過。

若要引發帶有訊息的ValueError,請把訊息寫成exception型別的引數:

# example when value is not found in the array.
raise ValueError("value not in array")

出處

Wikipedia連結會在新視窗或分頁中開啟
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Python Exercism

準備好開始 二分搜尋 了嗎?

註冊 Exercism,透過 17 個概念146 個練習 和真人引導來學習並精通 Python,全部免費。