二分查詢實現與分析

2021-07-30 12:59:28 字數 833 閱讀 5853

在有序表或者陣列進行查詢元素的的時候,如果對其中的元素逐個進行比較查詢的話,當資料量很大時,假設陣列的元素個數為n個,那麼所對應的時間複雜度就是o(n)。

對於o(n

),其實已經效率算是很快了。但作為貪心而又充滿智慧型的人類,我們總是能夠想到效率更快的演算法。天下武功,唯快不破。於是二分查詢就橫空出世。

所謂,二分查詢法,就是將表中元素不斷的進行折半,與所形成的子表的中間的元素進行比較。比如在(1,2,3,4,5)中查詢4,那麼我們先找到中間元素3,4>3,那麼形成子表(3,4,5)讓後我們與中間元素4進行比較,這樣就找出了4的位置。

那麼這個演算法的時間複雜度是怎麼樣的?

在上面的例子中,如果表的元素個數為n個,那麼我們會不斷的將這個表折半。

即n/2,n/2^2,n/2^3,n/2^4......n/2^k。

最糟糕的情況下,也就是我們查詢的元素在表最後或者不在表中的時,我們就要不斷折半,直到子表只剩乙個元素。假設此時為第k次折半,那麼n/2^k>=1.。

我們取n/2^k>=1。兩邊去對數就得到k=log

2n。所以二分查詢法得時間複雜度為o(

log2

n)。

可以畫圖比較n與log2n,或者在腦袋畫張圖,很容易就知道當n比較小的時候,兩者的效率差不多。可是當n很大時後者快的不要太多啊。

#includeusing namespace std;

const int array_size = 100;

templateint binary_search(const t arr,t num)

return -1;

}void main()

二分查詢與二分答案

主要用於在乙個單調的函式中查詢某值 連續函式的情況 若當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y 則 l mid,否則 r mid 直至 r l eps 當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y...

二分查詢與遞迴式二分查詢

二分查詢 public class binarysearch arrays.sort arr todo auto generated method stub int low 0 int high arr.length 1 while low high elseelse 遞迴實現二分查詢 public...

二分查詢深度分析

總結一句話就是 思路很簡單,細節是魔鬼,hhhh。本部落格 幾個最常用的二分查詢場景 尋找乙個數 尋找左側邊界 尋找右側邊界。public int binarysearch int nums,int target return 1 答 舉個例子推一下即可得知。因為當left 4,right 6時,此...