二分查詢以及變體 JS

2021-10-23 06:16:50 字數 1891 閱讀 6046

常規二分法

function

twopart

(nums, key)

return-1

;}// 小於、小於等於的最後乙個數

function

twopartsmall

(nums, key)

return hi;

}// 大於、大於等於的第乙個數

function

twopartbig

(nums, key)

return lo;

}

減而治之

三部分emide==mid 命中,返回

有序陣列示例:

[1,2,3,3,4,4,5,6,7];

查詢區間[lo,hi)

hi=arr.length,因此右邊界不可達,hi相當於乙個哨兵

右邊界是不可達的,因此在遍歷過程中區間的範圍是左閉右開

當將hi=arr.length-1的時候,右邊界是可達的

陣列分成三段:

e小於arr[mid] [li,mid)

e等於arr[mid] mid

arr[mid]小於e (mid,li]

function

binarysearch1

(arr,e)

return-1

;}

將陣列分成兩段

e小於等於arr[mid] [li,mid)

arr[mid]小於e [mid,hi)

function

binarysearch2

(arr,e)

return arr[li]

==e?lo:-1

;}

如果陣列中存在重複元素e,版本3可以獲得區間最後乙個尋找重複元素e的索引/第乙個尋找的重複元素索引如果不存在返回可插入位置的索引因此需要限制條件當超過上界

查詢e在陣列arr中不存在,lo可以返回它插入位置的索引

解決

if(lo>=arr.length||arr[lo]!==e) return -1;
由於在遍歷的時候返回的是

arr[0,lo)<=efunction

binarysearch3

(arr,e)

if(lo>=arr.length||arr[lo]

!==e)

return-1

;//最終返回乙個不大於e的位置

//看圖說話

需要限制條件

超出陣列下界

查詢e在陣列arr中不存在,hi可以返回它插入位置的索引

解決

if(lo>=arr.length||arr[lo]!==e) return -1;
第乙個重複元素e的索引

function

binarysearch3

(arr,e)

if(arr[hi]

!==e||hi==0)

return-1

;//最終返回乙個不小於e的位置

return hi;

}

二分查詢及其變體(Python)

二分查詢,它的時間複雜度是 o logn 其核心思想有點類似分治思想。即每次都通過跟區間中的中間元素對比,將待查詢的區間縮小為一半,直到找到要查詢的元素,或者區間被縮小為 0。但是二分查詢的 實現比較容易寫錯。你需要著重掌握它的三個容易出錯的地方 迴圈退出條件 mid 的取值,low 和 high ...

深入分析二分查詢及其變體

一般的二分查詢 如下 int search int a,int n,int target return 1 上面的二分查詢非常的樸實,上述二分查詢的作用當然就是 找到陣列a中等於target的元素。但是這個查詢元素隱含了乙個條件 這個陣列的元素是不包含重複元素的。這個限制可以說是非常的大。我們來看一...

js二分查詢

遞迴的時候是一層一層的return出來最後一次是限定條件 不再呼叫函式 如果這裡的fn 前面不寫return 則到最後一層一層返回到最上層時 沒有return函式fn結束掉 它還會繼續往下執行 即return 1 所以只要不是 num arr mid 都會返回 1 function searchnu...