常規二分法
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...