1. 程式人生 > >異序二分查找 二分查找方程根 二分查找重復元素最後一個

異序二分查找 二分查找方程根 二分查找重復元素最後一個

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位置
  • 返回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

異序二分查找 二分查找方程根 二分查找重復元素最後一個