Java学习疑点(3)--解析二分法查找的原理以及其优缺点

本文介绍了Java中的二分查找方法binarySearch(),强调了其高效性和对已排序数组的依赖。二分查找能快速定位元素,但当数组中有重复元素时,只能找到一个。此外,若元素无法比较排序,结果则不确定。在选择查找方法时,应考虑数组类型和查找需求。

Java数组Arrays类中有一个方法--binarySearch(). 称之为"二分查找", 其效率远远要高于线性查找, 但是其也一样存在着缺点, 比如查询对象必须要经过排序, 当查询对象中有多个元素相同时, 二分查找只能找到其中一个, 并且找到的这个元素不一定位于最前面或者最后面. 下面对二分查找的原理作一总结:

 

使用二分搜索法来搜索指定的 int 型数组,以获得指定的值。必须在进行此调用之前对数组进行排序(通过sort(int[])方法)。如果没有对数组进行排序,则结果是不确定的。如果数组包含多个带有指定值的元素,则无法保证找到的是哪一个。

参数:

     a - 要搜索的数组

     key - 要搜索的值

返回:

         如果它包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)插入点 (mid)被定义为将键插入数组的那一点:即第一个大于此键的元素索引,如果数组中的所有元素都小于指定的键,则为a.length。注意,这保证了当且仅当此键被找到时,返回的值将 >= 0。

 

public static int binSearch(int a[], int key) {   

	int mid = a.length / 2;   
	if (key == a[mid]) {   
		return mid;   
	}

	int start = 0;   
	int end = a.length - 1;   
	while (start <= end) {   
		mid = (end - start) / 2 + start;   

		if (key < a[mid]) {   
			end = mid - 1;   
		} else if (key > a[mid]) {   
			start = mid + 1;   
		} else {
			return mid;
		}
	}
	
	return -mid-1;
}

 

原理解析:

假定有一个经过升序排列的数组int a[], 二分查找首先会找到位于数组中间的数即插入点a[mid]与所要查找的数值key比较大小

key > a[mid]  >>>>  key可能在a[mid+1]至a[end]之间, 故start = mid+1继续进行循环

key < a[mid]  >>>>  key可能在a[mid-1]至a[start]之间, 故end = mid-1继续进行循环

key == a[mid]  >>>>  已找到key, 返回插入点mid

 

优缺点分析:

二分查找每一次判断即可筛选掉一半数据, 效率比全遍历的线性查找的确高很多, 但是其只能返回一个值, 若查找数值在数组中存在多个, 其局限性立即显露出来, 还有若是数组中存在一些不可相互比较的元素(比如字符串), 无法根据其元素的自然顺序对数组进行排序, 因此结果是不确定的.

 

因此, 在选择查找方法时需要根据对所要查找的数组类型以及查找用途(若是仅查找是否存在在该数组中便可使用二分搜索, 若是查找该数在数组中的全部位置则忽略二分法)等多种因素考虑.

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值