什么是算法
算法,是一组完成特定任务的指令。任何代码片段都可视为算法。简单来说,算法就是一串代码或指令。
为什么会有算法
算法为了解决某种特定的问题(或称为完成某种特定的任务)所创建的一种解决策略。用《百度百科-算法》中的解释就是“为了能够对一定规范的输入,在有限时间内获得所要求的输出”。
二分查找法
需求:设计一个数组,写一个方法,让其找到指定的数,每次只对比中间数,找到则返回查找的次数,找不到则返回null
方法分析:
- 确定返回值类型:String
- 确定参数:数组int[] arr,int i
- 确定访问修饰符:public static
算法分析:
- 确定变量:min,max,mid,count
- 确定循环条件:最小值不能大于最大值
- 确定判断元素:i 与 arr[mid]
public static String binarySearch(int[] arr,int i) {
// 定义变量
int min = 0; // 最小值索引
int max = arr.length - 1; // 最大值索引
int mid; // 中间值索引
int count = 0; // 初始化计算次数
// 定义循环,条件:最小值不大于最大值则继续循环,即min <= max
while(min <= max) {
mid = (min + max) / 2; // 每次循环对mid重新取中赋值
int value = arr[mid]; // 获取数组中间值
count++; // 计算次数累加
if (i == value) { // 判断中间值与指定值是否相等
return String.valueOf(count); // 相等则将count转换成String类型并返回,跳出循环
}else if(i < value) { // 判断指定值是否小于中间值
max = mid - 1; // 小于则对最大值重新定义,缩小范围
}else {
min = mid + 1; // 与上同
}
}
return null; // 循环结束还未匹配相等的值,则返回null
}
二分查找法特点:
每次只对比中间值,判断中间值比指定值大或者小,缩小范围继续判断
对比简单查找(即用每一个元素与指定值对比)查找次数要少的多,若数组中有1024个数,简单查找最多要对比1024次,而二分查找最多只需要对比**log2**1024次,即10次,十分高效。
使用二分查找的前提是:数组必须是有序的
为什么必须是有序的?个人理解,二分查找也叫折半查找,每次对比只操作中间值,中间值的定义必须满足两个条件,1、这中间值是索引的中间值;2、也是数组中所有数值的中间值。要满足两种条件数组必须是有序的,若是无序的数组使用二分查找是无意义的。
大O表示法
- 大O表示法是为了指出算法的速度有多快的一种特殊的表示法
- 大O表示法指的并非以秒为单位的速度,而是让你能够比较操作数,它指出了算法运行时间的增速。可以理解为增长速度
- 大O表示法指出了最糟糕情况下的运行时间,即可能运行时间的最大值
常用的大O运行时间
以下log的底数都是2,即log2
- O(log n),也叫对数时间,这样的算法包括二分查找
- O(n),也叫线性时间,这样的算法包括简单查找
- O(n * log n),这样的算法包括快速排序——一种速度较快的排序算法
- O(n2),这样的算法包括选择排序——一种速度非常慢的排序算法
- O(n!),一种非常慢的算法,例如旅行商问题的解决方案
总结
- 二分查找的速度比简单查找的速度快的多
- O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快的越多
- 算法运行时间并不以秒以单位
- 算法运行时间是从其增速的角度度量的
- 算法运行时间用大O表示法表示。