選單
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

DSA 選擇排序時間複雜度


有關時間複雜度的通用解釋,請參閱此頁面


二分查詢時間複雜度

二分查詢 透過檢查中間值來在已排序的陣列中查詢目標值。如果中間值不是目標值,則線性搜尋會選擇左側或右側的子陣列,並繼續搜尋,直到找到目標值。

要找到二分查詢的時間複雜度,讓我們看看在具有 \(n\) 個值的陣列中查詢目標值需要多少次比較操作。

最佳情況是第一個中間值與目標值相同。如果發生這種情況,目標值會立即找到,只需一次比較,因此在這種情況下時間複雜度為 \(O(1)\)。

最壞情況是搜尋區域必須反覆減半,直到搜尋區域只剩下一個值。發生這種情況時,無論是否找到目標值,都不會影響時間複雜度。

我們來考慮長度為 2 的冪的陣列,例如 2、4、8、16、32、64 等。

在將 2 除以二直到我們只看到一個值之前,需要多少次?只需要一次,對吧?

那 8 呢?我們需要將一個 8 個值的陣列減半 3 次才能得到一個值。

一個 32 個值的陣列必須減半 5 次。

我們可以看到 \(2=2^1\),\(8=2^3\),\(32=2^5\)。因此,我們需要減半陣列多少次才能得到一個元素,可以在以 2 為底的冪中找到。另一種看待它的方式是問“我必須將 2 乘以自身多少次才能得到這個數字?”。在數學上,我們可以使用以 2 為底的對數,這樣我們就可以發現長度為 \(n\) 的陣列可以被分成 \( \log_{2}(n)\) 次。

這意味著二分查詢的時間複雜度是

\[ \underline{\underline{O( \log_{2} n )}} \]

平均情況並不那麼容易確定,但是由於我們使用大 O 表示法將演算法的時間複雜度視為最壞情況的上限,因此平均情況並沒有那麼有趣。

注意:二分查詢 \(O( \log_{2}n)\) 的時間複雜度比線性查詢 \(O(n)\) 快得多,但重要的是要記住,二分查詢需要排序的陣列,而線性查詢則不需要。

如果我們繪製二分查詢在具有 \(n\) 個值的陣列中查詢值所需的時間與線性查詢的比較圖,我們將得到這個圖

Binary Search Time Complexity

二分查詢模擬

執行不同數量值 \(n\) 的陣列的模擬,看看二分查詢找到目標值需要多少次比較

{{ this.userX }}

操作次數:{{ operations }}
未找到!

 

正如您在執行二分查詢模擬時所看到的,即使陣列很大並且我們正在尋找的值未找到,搜尋也只需要很少的比較。



×

聯絡銷售

如果您想將 W3Schools 服務用於教育機構、團隊或企業,請傳送電子郵件給我們
sales@w3schools.com

報告錯誤

如果您想報告錯誤,或想提出建議,請傳送電子郵件給我們
help@w3schools.com

W3Schools 經過最佳化,旨在方便學習和培訓。示例可能經過簡化,以提高閱讀和學習體驗。教程、參考資料和示例會不斷審查,以避免錯誤,但我們無法保證所有內容的完全正確性。使用 W3Schools 即表示您已閱讀並接受我們的使用條款Cookie 和隱私政策

版權所有 1999-2024 Refsnes Data。保留所有權利。W3Schools 由 W3.CSS 提供支援