介绍
O(log n):也叫对数时间,典型算法是二分查找法
当数据增大n倍时,耗时增大log n倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)
二分查找法
使用二分查找法时的前提是:查询的数组是已经排序的
例如当前有十个数1-10,使用简单查询法查询时最糟糕的情况下需要查询10次,使用二分查询的方式如下:
如需要查询4所在的位置,则
1、从1-10取中间值5
2、比较4和5,4<5,则抛弃后半部分即5-10
3、取1-4的中间值2,4>2,则抛弃前半部分1-2
4、剩下3-4只剩下两个数则和3比较,不管是否相等都可以确定4所处位置了
总比较次数仅仅只有3次
当总数+1为11时比较次数仍然为3,当比较次数为增加到16时比较次数为4
递增规律为:数量(次数),2(1), 4(2), 8(3), 16(4), 32(5)…
即数量每乘以2次数+1,用数学表示即2的次数幂等于总数,属于用大O表示法即为O(log n)
二分查找法是一种随着数量越多,算法耗时增速越慢的算法,但是前提是查找数组必须是已经排序过的
代码实现:
public class BinarySearch {
public static void main(String[] args) {
System.out.println(binarySearch(new Integer[]{1, 2, 3, 4, 5}, 6));
}
/**
* 二分查找法,每次都可以排除一半数据,时间复杂度O(log n)
*
* @param array
* @param searchValue
* @return
*/
public static int binarySearch(Integer[] array, Integer searchValue) {
int low = 0;
int high = array.length - 1;
while (low <= high) {
int mid = (low + high) / 2;
Integer value = array[mid];
if (value.equals(searchValue)) {
return mid;
} else if (value.intValue() > searchValue.intValue()) {
// 取左边数组,最大值为中间值-1
high = mid - 1;
} else {
// 取右边数组,最小值为组件值+1
low = mid + 1;
}
}
return -1;
}
}