Binary Search 專欄

Binary Search 時間複雜度 O(logN ), 由於每次減小一半 至關於取logdom

 

Q: 何時能夠用Binary Seach?spa

A: 當數據是Sorted 而且支持Random Access的時候code

 

Binary Search 的基本規則blog

1. 搜索空間在循環中不斷減少element

 The Searching Area decrease during the processget

2. 目標元素(若是存在)不能夠被排除到搜索空間以外 class

 

Basic Binary Search 搜索

 public int binarySearch(int[] array, int target) {
    //Corner case 
    if(array==null || array.length==0){
      return -1;
    }
    int left=0;
    int right=array.length-1;
    while(left<=right){
      int mid=left+(right-left)/2;
      if(array[mid]==target){
        return mid;
      }else if(array[mid]>target){
        right=mid-1;
      }else{
        left=mid+1;
      }
    }
    return -1;
  }

注意幾點常見錯誤 循環

1. int mid=left+(right-left)/2;數據

目的是防止Overflow 

 

2. 注意while 條件的判斷 , 如下循環條件排列從苛刻到寬鬆 

(1).while(left<=right)

留下0個元素

(2).while(left<right)

留下1個元素

(3).while(left<right-1)

留下兩個元素 

 

尋找最接近的元素index

 public int closest(int[] array, int target) {
    //Corner case 
    if(array==null || array.length==0){
      return -1;
    }
    int left=0;
    int right=array.length-1;
    while(left<right-1){
      int mid=left+(right-left)/2;
      if(array[mid]==target){
        return mid;
      }else if(array[mid]>target){
        //the right element may be the result
        //cannot be ruled out
        right=mid;
      }else{
        //the left element may be the result
        //cannot be ruled out
        left=mid;
      }
    }
    //Post processing 
    if(target-array[left]<array[right]-target){
      return left;
    }else{
      return right;
    }
  }
相關文章
相關標籤/搜索