二分查找法
public static void main(String[] args) {
int[] nums = new int[100];
for (int i = 1; i < 100; i++) {
nums[i] = i;
}
System.out.println(binarySearch(nums,5));
}
public static int binarySearch(int[] nums,int target){
int low = 0,high = nums.length-1; //首先先有序数组的两个端点
while (low <= high){ //如果找到最后low==high了表示数组没有这个元素
int mid = (low+high)/2; //找到中间的那个元素进行比较
if (nums[mid] == target){ //如果相同就返回
return mid;
}else if(nums[mid] > target){ //此时找到的数如果比target大,那就把mid-1重新赋值给high
high = mid - 1;
}else if(nums[mid] < target){
low = mid + 1;
}
}
return -1;
}
练习,假设有一个128个名字的有序列表,使用二分查找法查找其中一个,最多需要几步才能找到?
答案: logn次(以2为底),最多需要7次。
运行时间
最多需要猜测的次数与列表长度相同,这被称为线性时间(linear time)——O(n)
二分查找的运行时间为对数时间(或log时间)——O(logn)
大O表示法
是一种特殊的表示法,指出了算法的速度有多快,但通常表示的是最糟糕的运行时间。
算法的运行时间以不同的速度增加
随着元素的增加,简单查找的线性时间会被大大拉长,而二分查找法则不会
一些常见的大O运行时间(又快到慢)
- O(log n),也叫对数时间,这样的算法包括二分查找。
- O(n),也叫线性时间,这样的算法包括简单查找。
- O(n * log n),这样的算法包括第4章将介绍的快速排序——一种速度较快的排序算法。
- O(n 2 ),这样的算法包括第2章将介绍的选择排序——一种速度较慢的排序算法。
- O(n!),这样的算法包括接下来将介绍的旅行商问题的解决方案——一种非常慢的算法。
PS:算法的速度指的并非时间,而是操作数的增速。
谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。
算法的运行时间用大O表示法表示。
O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多。
练习
1.O(logN) 2.O(N) 3.O(N) 4.O(N)
旅行商问题
小结:
二分查找的速度比简单查找的速度快很多
O(logN)比O(N)快。需要搜索的元素越多,前者比后者就快的越多。
算法运行时间不以秒为单位
算法运行时间是从其增速的角度度量的
算法运行时间用大O表示