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
}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 也稱為折半查詢。它的前提是線性表中的記錄必須是關鍵碼有序...