資料結構和演算法 二分查詢

2021-10-23 18:03:13 字數 3705 閱讀 2891

思想:

二分查詢針對的是乙個有序的資料集合,查詢思想有點類似分治思想。每次都通過跟區間的中間元素對比,將待查詢的區間縮小為之前的一半,直到找到要查詢的元素,或者區間被縮小為 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值與...