1.引言
什么是算法?其实,任何代码都可以看作是算法。究其根本,就是完成一个任务的指令。但我们所要研究的算法是那些有意思的部分。
2.二分查找
二分查找是一种基本且常见的查找算法。《算法图解》的作者将其作为第一个向我们介绍的算法。假如现在我们来玩猜数游戏,从1-100中找出对面那个娇羞的女孩子心里默念的数字。怎么猜才会最快呢?我想你肯定是先猜50,然后再根据大了还是小了,进行下一步猜测。比如25,或者是75?这样的话,你从1-100中猜出正确的数字最多只需要7次。这就是二分查找,你看,其实我们生活中一直都在使用它,只不过我们现在只是要给它取个名字而已。但是呢,二分查找的前提是,数字必须要是有序的。其实在算法中,很多时候都是要求我们进行操作的序列是有序的。所以在算法中,排序算法的使用是非常频繁的。而简单查找就是比较蠢萌的方式了,就是猜1,然后猜2,依次猜下去,一直到猜对为止。
下面给出用循环写出的二分查找的代码。当然,也可以用递归来写这个查找方法。
package ver01;
import java.util.Arrays;
public class BinarySearch {
public static void main(String[] args) {
int[] a = buildArray(100);
//System.out.println(Arrays.toString(a));
binarySearch(a, 51);
}
public static int binarySearch(int[] array, int key) { //二分查找方法
int low = 0;
int high = array.length - 1;
int j = 0;//用来计数
while (low <= high) {
int mid = (low + high) / 2;//要把这个放在循环体里面。因为每次的mid都不一样。写在外面就固定死了
if (array[mid] == key) {
j++;
System.out.println("总共用了" + j + "步,找到了关键字!");
return mid;
} else if (array[mid] < key) {
j++;
low = mid + 1;
} else {
j++;
high = mid - 1;
}
}
System.out.println("没有找到!");
return -1;
}
public static int[] buildArray(int num) { //这个是用循环来生成有序数组的方法
int[] numArray = new int[num];
for (int i = 0; i < num; i++) {
numArray[i] = i + 1;
}
return numArray;
}
}
3.大O表示法
《算法图解》这里面对这个的介绍比较详细。它指出的是算法的速度有多快。或者换个说法,就是不同的大O,他们的运行时间是以不同的速度增加的。以二分查找和简单查找为例,二分查找时间复杂度为O(log n),注意:算法里面的log不作特殊说明都是以2为底的。简单查找的为O(n)。从100个数找出一个数,二分查找的算出来为7,二简单查找算出来的是100.当从10亿个数中查找时,这个比例会更加夸张。
下面给出常见的时间复杂度。好吧,其实这玩意就是时间复杂度,只不过《算法图解》这本书确实是一本入门的书籍。
O(log n),也叫对数时间,常见的有二分查找。
O(n),线性时间,包括简单查找。
O(n*log n),快速排序。
O(n^2),选择排序。
O(n!),这种算法包括旅行商算法。
本文深入浅出地介绍了算法的基本概念,重点讲解了二分查找这一高效查找算法,并对比了其与简单查找的时间复杂度,同时引入了大O表示法来评估算法效率。通过实例解析,帮助读者理解算法在实际问题解决中的应用。
1110

被折叠的 条评论
为什么被折叠?



