演算法二 二分查詢

2021-09-24 01:07:38 字數 1901 閱讀 7257

1 用最省記憶體的方式查詢資料。

2 快速定位ip所在省市

二分每次都通過跟區間中的中間元素對比,將待查詢的區間縮小為一半,直到區間為0或者找到元素。需要重點關注退出條件、mid取值、low和high的更新。

二分的時間複雜度o(logn)。logn少的驚人之處和指數的大的驚人之處類似。2的32次方是4億多。在4億多有序陣列中查詢資料,只需要32次。很少吧。

簡單是因為陣列中沒有重複資料。

public static int easysearch(int a,int value)

private static int easysearch(int a,int value,int low,int high)

2n​次查詢,第二次查詢a[mid],需要n

4\dfrac

4n​次查詢,依次類推所需要的查詢有sum

=n2+

n4+n

8+..

..+1

=n−1

sum=\dfrac+\dfrac+\dfrac+....+1=n-1

sum=2n

​+4n

​+8n

​+..

..+1

=n−1

。時間複雜度o(n)。

2 二分針對的是有序資料。在插入、刪除比較少的場景中,可以將排序的時間成本均攤到查詢上面。插入、刪除多,則複雜度公升高。

3 資料量小不能體現二分的優勢。例如10個資料。無論順序查詢還是二分,時間差不多。

4 資料量不能太大。因為二分依賴陣列儲存資料,陣列要求連續的記憶體。

在100m記憶體中,查詢1000萬整數的某個數。如果用long表示整數,乙個整數8個位元組,1000萬整數,80m記憶體。可以先使用空間複雜度低的排序演算法排序,之後二分查詢。

求乙個數的平方根,精確到小數點後6位。

public static int findfirstequalelement(int a ,int value)else

}return -1;

}

public static int findlastequalelement(int a ,int value)else

}return -1;

}

public static int findfirstmoreorequalelement(int a ,int value)

}return -1;

}

public static int findlastlessorequalelement(int a ,int value)

}return -1;

}

快速定位ip所在省市。可以用乙個32位的int表示乙個ip位址。查詢每乙個ip段內,最後乙個起始ip小於等於目標ip的ip段,然後查詢目標ip是不是在這個範圍內。

迴圈有序資料的二分查詢怎麼解決,陣列是公升序。

需要先找到第乙個a[i

]

i+1]

a[i]a[

i]i+1]

,例如陣列nums=。i應該等於4。然後我們可以選擇將陣列複製一下成為,但是這樣時間複雜度就會是o(n)。我們也可以這樣看nums[4]=0,nums[5]=1,nums[6]=2,nums[7]=4,nums[8]=5,nums[9]=6,nums[10]=6。相當於將nums看做是乙個迴圈陣列。

public int search(int nums, int target) else

}int rotatedindex = low;

low = 0;

high = n-1;

while(low<=high)else

}return -1;

}

C語言排序(二) 二分查詢

一.實驗內容 順序查詢演算法與二分查詢演算法比較。a.定義兩個函式分別實現順序查詢和二分查詢演算法。b.主函式中用產生隨機數的方式隨機產生待查資料,通過呼叫口麵編寫函式查詢指定的資料。c.測試資料分別選擇 在1000 10000 1000001000000個數中查詢指定資料,對比兩個函式的執行時間。...

二分查詢二(二分查詢的經典變形問題)

主要 int bsearch1 int a,int n,int value else if a mid value else return 1 這段 的處理重點就是 a mid value 時的情況,如果 mid 等於 0,即這個元素已經是陣列的第乙個元素,那毫無疑問,這個元素肯定就是我們要找的 如...

資料結構與演算法 十二 二分查詢和插值查詢

有乙個遊戲最能體現二分查詢的思路 我在紙上已經寫好了100以內的正整數數字,然後請你猜,問最多幾次可以猜出來?這個遊戲的解法就是每次猜數後折取一半,我們把這種每次取中間記錄查詢的方法叫做折半查詢,或二分查詢。二分查詢 binary earch 也稱為折半查詢。它的前提是線性表中的記錄必須是關鍵碼有序...