給定一個升序排列的自然數數組,數組中包含重復數字,例如:[1,2,2,3,4,4,4,5,6,7,7]。問題:給定任意自然數,對數組進行二分查找,返回數組正確的位置,給出函數實現。注:連續相同的數字,返回第一個匹配位置還是最后一個匹配位置,由函數傳入參數決定。
我為什么會出這道題目?
二分查找在數據庫內核實現中非常重要
在數據庫的內核實現中,二分查找是一個非常重要的邏輯,幾乎99%以上的SQL語句(所有索引上的范圍掃描/等值查詢/Unique查詢等),都會使用到二分查找進行數據的定位。
考慮一個數據庫表t1(a int primary key, b int),表上的b字段有一個B+樹索引,表中記錄的b字段取值,就是題目中的[1,2,2,3,4,4,4,5,6,7,7]序列。此時,給定以下的兩條查詢語句,就是使用到了不同的二分查找邏輯:
SQL1:
| select * from t1 where b > 4; |
SQL2:
| select * from t1 where b >= 4; |
針對SQL1,索引的二分查找,就需要跳過所有的4,從最后一個4之后開始返回所有記錄;針對SQL2,二分查找就需要定位到第一個4,然后順序讀取所有記錄。
除此之外,針對數據庫中其他的查詢邏輯,二分查找還需要附帶更多的功能,例如:
SQL3:
| select * from t1 where b < 2; |
SQL4:
| select * from t1 where b <= 2; |
由于數據庫索引同時支持反向掃描,因此SQL3、SQL4的語句,都可以使用索引反向掃描。反向掃描時,SQL3需要定位到索引中的第一個2;而SQL4,則需要定位到索引的最后一個2,然后開始反向返回滿足查詢條件的索引記錄。
二分查找在程序設計中,是一個十分基礎并且易錯的功能
第一個真正正確的二分查找算法,在第一個二分查找實現之后的12年,才被發表出來。通過Google,輸入Binary Search或者是二分查找關鍵字,有大量的相關的文章或者博客討論此話題。
二分查找實現,需要注意的問題
本文不準備詳細介紹一個正確的二分查找應該是如何實現的,畢竟現在網上有著大量的正確版本。接下來,根據批改試卷過程中發現的一些問題,做一些簡單的分析,希望對大家實現一個有效的二分查找算法,甚至是一個數據庫內可用的二分查找算法,有所幫助。
問題一:是否檢查參數的有效性
大量的試卷,在給出此問題的解決算法時,直接拿著low,high參數開始進行計算,但是卻沒有檢查low/high參數。low/high是否相同,數組中是否存在記錄?low/high構成的區間是否有效?代碼的魯棒性不足。
新聞熱點
疑難解答