JAVA数据结构--伪二分法查找

单纯的二分思想

个人认为,数据结构中的二分查找,可以简化到一种最基础的查找思想,分化思想。

二分查找

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
二分法需要不断的二分 ,需要递归

伪二分法的写法:

public class EFF {
private int []arr;
	public EFF() {
		arr= new int [0];
	}
	public int  getlength() {
		return arr.length;
	}
	public void Dichotomoussearch(int []we,int target) {
		String z="所需要查找的目标元素在原数组中的下标是:";
		if(we[we.length/2+we.length%2]<target) {
			for(int a=we.length/2+we.length%2;a<we.length;a++) {
				if(we[a]==target) {
					z=z+a;
				}
			}
		}else if(we[we.length/2+we.length%2]>target) {
			for(int a=0;a<we.length/2;a++) {
				if(we[a]==target) {
					z=z+a;
				}
			}
		}
		System.out.println(z);
	}
}

缺点
这种二分法只能进行一次二分,无法解决大的数据要求,如果数据是比较庞大的数组,那么这种方法只会给机器带来负担,并不能加快机器的运行速度,反而会拉低运算速度。

如何改变呢?

————————设置参数 不断二分

根据百度介绍:
计算公式:
当顺序表有n个关键字时:
查找失败时,至少比较a次关键字;查找成功时,最多比较关键字次数是b。
注意:a,b,n均为正整数。
二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.
时间复杂度无非就是while循环的次数!
总共有n个元素,
渐渐跟下去就是n,n/2,n/4,…n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数
由于你n/2^k取整后>=1
即令n/2^k=1
可得k=log2n,(是以2为底,n的对数)
所以时间复杂度可以表示O(h)=O(log2n)
下面提供一段二分查找实现的伪代码:
BinarySearch(max,min,des)
mid-<(max+min)/2
while(min<=max)
mid=(min+max)/2
if mid=des then
return mid
elseif mid >des then
max=mid-1
else
min=mid+1
return max
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是:(这里假设数组元素呈升序排列)将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止;如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x;如果x>a[n/2],则我们只要在数组a的右 半部继续搜索x。

正确二分法的思想表现代码:

public class erfenfa3  {
private int []arr;
	public erfenfa3() {
		arr= new int [0];
	}
	public int  getlength() {
		return arr.length;
	}
	public String Dichotomoussearch(int []we,int target,int L,int R) {
	//设置参数为左右固定的边界
	//这里写法简单,只是将二分思想更形象了一些
	//注意,二分法一定要注意边界问题,防止数据越界
		String z="所需要查找的目标元素在原数组中的下标是:";
		if(we[L]==target) {
			return z+L;
		}else if(we[R]==target){
			return z+R;
		}else {
			int mid=(R+L)/2;
			if(target<we[mid]) {
				Dichotomoussearch(we,target,L,mid);
			}else {
				Dichotomoussearch(we,target,mid+1,R);
			}
		}
		return z;
	}
}

以下是伪二分法的运行结果:若当数据较大时,0-99999999999时候,这是伪二分法就完全不奏效了!
在这里插入图片描述
在这里插入图片描述

还没研究完,未完待续嘻嘻嘻

发布了15 篇原创文章 · 获赞 29 · 访问量 5416

猜你喜欢

转载自blog.csdn.net/weixin_44085593/article/details/99825084