1. 程式人生 > >Binary Search 專欄

Binary Search 專欄

每次 out class 循環條件 排列 -a 復雜 each 留下

Binary Search 時間復雜度 O(logN ), 因為每次減少一半 相當於取log

Q: 什麽時候可以用Binary Seach?

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

Binary Search 的基本規則

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

 The Searching Area decrease during the process

2. 目標元素(如果存在)不可以被排除到搜索空間之外

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; } }

Binary Search 專欄