二分尋找(binary search)java實現及時間複雜度,binaryjava
概述
在一個已排序的數組seq中,使用二分尋找v,假如這個數組的範圍是[low...high],我們要的v就在這個範圍裡。尋找的方法是拿low到high的正中間的值,我們假設是m,來跟v相比,如果m>v,說明我們要尋找的v在前數組seq的前半部,否則就在後半部。無論是在前半部還是後半部,將那部分再次折半尋找,重複這個過程,知道尋找到v值所在的地方。
實現二分尋找可以用迴圈,也可以遞迴。
java實現迴圈
public static int iterativeSearch(int v, int[] seq) { int low = 0, high = seq.length - 1; while (low < high) { int mid = (low + high) / 2; int m = seq[mid]; if (v == m) { return mid; } else if (v > m) { low = mid + 1; } else { high = mid - 1; } } return -1; }
}遞迴
public static int recursionSearch(int v, int low, int high, int[] seq) { if (low > high) return -1; int mid = (low + high) / 2; int m = seq[mid]; if (v == m) { return mid; } else if (v > m) { return recursionSearch(v, mid + 1, high, seq); } else { return recursionSearch(v, low, mid - 1, seq); } }}java8原生實現
private static int binarySearch0(int[] a, int fromIndex, int toIndex, int key) { int low = fromIndex; int high = toIndex - 1; while (low <= high) { int mid = (low + high) >>> 1; int midVal = a[mid]; if (midVal < key) low = mid + 1; else if (midVal > key) high = mid - 1; else return mid; // key found } return -(low + 1); // key not found. }時間複雜度
比如:總共有n個元素,每次尋找的區間大小就是n,n/2,n/4,…,n/2^k(接下來操作元素的剩餘個數),其中k就是迴圈的次數。
由於n/2^k取整後>=1,即令n/2^k=1,
可得k=log2n,(是以2為底,n的對數),所以時間複雜度可以表示O()=O(logn)