二分搜索算法
算法
步驟
給予一個包含 n 個帶值元素的數(shù)組 A 或是記錄 A 0 ... A n ?1 ,使得 A 0 ≤ ... ≤ A n ?1 ,以及目標值 T ,還有下列用來搜索 T 在 A 中位置的子程序。
令 L 為0, R 為 n ? 1。
如果 L > R ,則搜索以失敗告終。
令 m (中間值元素)為“( L + R )?/?2”加上下高斯符號。
如果A m < T ,令 L 為 m + 1并回到步驟二。
如果A m > T ,令 R 為 m - 1并回到步驟二。
當A m = T ,搜索結束;回傳值 m 。
這個迭代步驟會持續(xù)通過兩個變量追蹤搜索的邊界。有些實際應用會在算法的最后放入相等比較,讓比較循環(huán)更快,但平均而言會多一層迭代 。
大致匹配
以上程序只適用于完全 匹配,也就是查找一個目標值的位置。不過,因為有序數(shù)組的順序性,將二分搜索算法擴展到能適用大致匹配并不是很重要。舉例來說,二分搜索算法可以用來計算一個賦值的排名(或稱秩,比它更小的元素的數(shù)量)、前趨(下一個最小元素)、后繼(下一個最大元素)以及最近鄰。搜索兩個值之間的元素數(shù)目的范圍查詢(英語:Range query (data structures))可以借由兩個排名查詢(又稱秩查詢)來運行 。
排名查詢可以使用調整版的二分搜索來運行。借由在成功的搜索回傳 m ,以及在失敗的搜索回傳 L ,就會取而代之地回傳了比起目標值小的元素數(shù)目 。
前趨和后繼查詢可以借由排名查詢來運行。一旦知道目標值的排名,其前趨就會是那個位于其排名位置的元素(因為它是小于目標值的最大元素)。其后繼是(數(shù)組中的)下一個元素,或是(非數(shù)組中的)前趨的下一個元素 。目標值的最近鄰可能是前趨或后繼,取決于何者較為接近。
范圍查詢也是直接了當?shù)?。一旦知道兩個值的排名,不小于第一個值且小于第二個值的元素數(shù)量就會是兩者排名的差。這個值可以根據(jù)范圍的端點是否算在范圍內,或是數(shù)組是否包含其端點的對應鍵來增加或減少1 。
復雜度分析
應用
除直接在一個數(shù)組中查找元素外,可用在插入排序中。
免責聲明:以上內容版權歸原作者所有,如有侵犯您的原創(chuàng)版權請告知,我們將盡快刪除相關內容。感謝每一位辛勤著寫的作者,感謝每一位的分享。
- 有價值
- 一般般
- 沒價值
{{item.userName}} 舉報
{{item.time}} {{item.replyListShow ? '收起' : '展開'}}評論 {{curReplyId == item.id ? '取消回復' : '回復'}}
{{_reply.userName}} 舉報
{{_reply.time}}