異序二分查找 二分查找方程根 二分查找重復元素最後一個
阿新 • • 發佈:2018-03-30
sea 結果 多個 否則 設定 元素 有序 int sta
1 題目1 類二分查找
1.1 題目
將有序數組a的後面隨機一段一插到數組前面,使用類似二分查找的方法,查找一個元素e。
1.2 解題思路
將有序數組的後面一部分插到數組前面,使用二分查找查找一個元素。
- 這樣的查找,可以首先定義一個mid代表中間位置。
- 隨後,首先判斷mid所在位置,是在被插到前面數值較大的一段,還是原本數值較小的一段。
- 如果在前面較大數值一段,則再判斷目標元素是否在這一段中間,在則將高位hi移動到mid,否則移動低位lo到mid
- 如果在後面較小數值一段,則再判斷目標元素是否在這一段中間,在則移動低位lo到mid,否則將高位hi移動到mid
- 判斷lo和hi位置的數值是否為目標值,是則返回下標,不是則返回-1
1.3 Java實現代碼
public static int binSearch(int[] array, int n) { int lo = 0; int hi = array.length - 1; int mid = (lo + hi) >> 1; while(lo+1 < hi) { mid = (lo + hi) >> 1; if (array[lo] <= array[mid]) //前面一段 if (array[lo] <= n && n <= array[mid]) hi = mid; else lo = mid; else if(array[mid] <= n && n <= array[hi]) lo = mid; else hi = mid; } if(array[lo] == n) return lo; if(array[hi] == n) return hi; return -1; }
1.4 測試結果
The array: 7 8 9 11 14 15 2 3 4 5 Try find 1‘s index in array: -1 Try find 3‘s index in array: 7 Try find 5‘s index in array: 9 Try find 15‘s index in array: 5 The array2: 9 11 14 1 2 3 4 5 6 7 Try find 1‘s index in array2: 3 Try find 3‘s index in array2: 5 Try find 5‘s index in array2: 7 Try find 15‘s index in array2: -1
2 題目2 類二分查找方程根
2.1 題目
已知方程為 x^3-x+4 = 0 的根在 [-5, 0] 內,請使用二分查找的求解方法尋找到方程的近似根,要求保留四位小數
2.2 解題思路
類二分查找方程的根,可以將循環判斷條件改變達到目的。
- 這樣的查找,可以首先定義一個mid代表中間位置。
- 隨後,首先循環判斷高位hi減去低位lo是否到達目標精度
- 再在循環內部判斷高位hi和中間位置mid的函數值是否為正
- 為正則說明根不在[lo, hi]內,將lo移動到mid位置
- 不為正則說明在,將hi移動到mid位置
- 再在循環內部判斷高位hi和中間位置mid的函數值是否為正
- 返回mid位置
2.3 Java實現代碼
public static double result_search(double lo, double hi) {
double mid = (lo + hi) / 2;
while(hi-lo > 0.00001){
mid = (lo + hi) / 2;
if( f(lo)*f(mid) > 0 ){
lo = mid;
} else if( f(hi)*f(mid) > 0 ){
hi = mid;
}
}
return mid;
}
public static double f(double x){
return x*x*x -x + 4;
}
2.4 測試結果
Try to search the root of the equation below:
x^3 -x + 4 = 0
(Assert there is only one root of the equation)
-1.7963
3 題目3 二分查找最後一個值
3.1 題目
實現二分搜索中如果有多個重復的數,返回最後一個,
3.2 解題思路
利用二分查找找到目標元素出現的第一個和最後一個位置,只需要對於二分查找的退出條件,做一個簡單的設定就能得到我們理想的結果,其他都跟二分搜索類似
3.3 Java實現代碼
public static int lastSearch(int[] array, int n) {
int lo = 0;
int hi = array.length - 1;
int mid = (lo + hi) >> 1;
while(lo < hi) {
mid = (lo + hi + 1) >> 1;
if(array[mid] > n)
hi = mid - 1;
else
lo = mid;
}
if(array[hi] == n) return hi;
return -1;
}
3.4 測試結果
The array:
index: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
value: 2 3 4 4 5 7 8 9 11 11 11 11 14 15 16 16 16 16
Try find 1‘s last index in array: -1
Try find 3‘s last index in array: 1
Try find 4‘s last index in array: 3
Try find 11‘s last index in array: 11
Try find 16‘s last index in array: 17
異序二分查找 二分查找方程根 二分查找重復元素最後一個