思想:
二分查詢針對的是乙個有序的資料集合,查詢思想有點類似分治思想。每次都通過跟區間的中間元素對比,將待查詢的區間縮小為之前的一半,直到找到要查詢的元素,或者區間被縮小為 0
時間複雜度:o(logn)
實現:1、遞迴
function
binarysearchre
($arr
,$value
,$low=0
,$high=0
)if($low
>
$high
)$mid
=floor
($low+(
$high
-$low)/
2);if
($arr
[$mid]==
$value
)elseif
($arr
[$mid
]<
$value
)else
return-1
;}function
bsearch
($arr
,$value
)
2、非遞迴
function
binarysearch
($arr
,$value
)$low=0
;$high
=$length-1
;while
($low
<=
$high
)elseif
($arr
[$mid
]<
$value
)else
}return-1
;}
一般的二分查詢僅限於有序沒有重複元素的查詢,但是有重複元素的查詢會存在問題,所以有下面四種變形
1、查詢第乙個值等於給定值的元素
/**
* 查詢第乙個值等於給定值的元素
* [1,3,4,5,6,8,8,8,11,18]
* @param [type] $nums
* @param [type] $target
* @return [type]
*/function
binarysearchfirst
($nums
,$target
)$low=0
;$high
=$length-1
;while
($low
<=
$high
)elseif
($nums
[$mid
]<
$target
)else
else}}
return-1
;}
2、查詢最後乙個相等的元素
/**
* 查詢最後乙個相等的元素
* @param [type] $nums
* @param [type] $target
* @return [type]
*/function
binarysearchlast
($nums
,$target
)$low=0
;$high
=$length-1
;while
($low
<=
$high
)elseif
($nums
[$mid
]<
$target
)else
else}}
return-1
;}
3、查詢第乙個大於等於給定值的元素
/**
* 查詢第乙個大於等於給定值的元素
* @param [type] $nums
* @param [type] $target
* @return [type]
*/function
binarysearchfirsttarget
($nums
,$target
)$low=0
;$high
=$length-1
;while
($low
<=
$high
)else
}else
}return-1
;}
4、查詢最後乙個小於等於給定值的元素
/**
* 查詢最後乙個小於等於給定值的元素
* 實際應用(ip查詢)
* @param [type] $nums
* @param [type] $target
* @return [type]
*/function
binarysearchlasttarget
($nums
,$target
)$low=0
;$high
=$length-1
;while
($low
<=
$high
)else
else}}
return-1
;}
如果 ip 區間與歸屬地的對應關係不經常更新,我們可以先預處理這 12 萬條資料,讓其按照起始 ip 從小到大排序。如何來排序呢?我們知道,ip 位址可以轉化為 32 位的整型數。所以,我們可以將起始位址,按照對應的整型值的大小關係,從小到大進行排序。然後,這個問題就可以轉化為我剛講的第四種變形問題「在有序陣列中,查詢最後乙個小於等於某個給定值的元素」了。當我們要查詢某個 ip 歸屬地時,我們可以先通過二分查詢,找到最後乙個起始 ip 小於等於這個 ip 的 ip 區間,然後,檢查這個 ip 是否在這個 ip 區間內,如果在,我們就取出對應的歸屬地顯示;如果不在,就返回未查找到。
5、迴圈有序陣列查詢
/**
* 查詢陣列中元素
* [7, 8, 1, 2, 3, 4]
*/function
binarysearchlooparrtarget
($nums
,$target
)$low=0
;$high
=$length-1
;while
($low
<=
$high)if
($nums
[$low
]<=
$nums
[$mid])
else
}else
else}}
return-1
;}var_dump
(binarysearchlooparrtarget
($arr,2));
資料結構 二分查詢演算法
1.請自行學習二分查詢演算法,並實現以下函式 1.1 在乙個已排序的整型陣列array中,假設已知array陣列的元素個數為n,需要查詢的關鍵值為key,要求在array陣列中查詢值為key的數字,並返回該數字在陣列中對應的索引值。請設計並實現該函式。include int bsearch1 int...
資料結構 二分查詢(演算法)
二分查詢要求陣列必須有序,如果陣列無序,需對陣列進行排序操作 首先確定陣列中間值的下標 mid left right 2 讓需要查詢的值findvalue與arr mid 進行比較 1 如果無它要求,直接返回mid即可 2 如果需要查詢第乙個元素位置,需要向左迴圈,查詢mid前面是否還有滿足需求的值...
資料結構查詢演算法(二分查詢)
參考例子 後記 二分查詢演算法,說白了就是在有序的陣列裡面給予乙個存在陣列裡面的值key,然後將其先和陣列中間的比較,如果key大於中間值,進行下一次mid後面的比較,直到找到相等的,就可以得到它的位置。首先確定整個查詢區間的中間位置mid strat end strat 2 用待查關鍵字key值與...