[随笔]Java算法01——二分查找法及大O表示法

什么是算法

算法,是一组完成特定任务的指令。任何代码片段都可视为算法。简单来说,算法就是一串代码或指令。

为什么会有算法

算法为了解决某种特定的问题(或称为完成某种特定的任务)所创建的一种解决策略。用《百度百科-算法》中的解释就是“为了能够对一定规范的输入,在有限时间内获得所要求的输出”。

二分查找法

需求:设计一个数组,写一个方法,让其找到指定的数,每次只对比中间数,找到则返回查找的次数,找不到则返回null

方法分析:

  1. 确定返回值类型:String
  2. 确定参数:数组int[] arr,int i
  3. 确定访问修饰符:public static

算法分析:

  1. 确定变量:min,max,mid,count
  2. 确定循环条件:最小值不能大于最大值
  3. 确定判断元素: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表示法表示。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值