查找

参考:《数据结构与算法-java语言版》

查找的概念

首先介绍几个与查找有关的基本概念。

查找表(search table)是由同一类型的数据元素(或记录)构成的集合。由于数据元 素之间存在着完全松散的关系,因此查找表是一种非常灵活的结构,可以利用任意数据结构 实现。

关键字(key)是数据元素的某个数据项的值,用它可以标识查找表中一个或一组数据 元素。如果一个关键字可以唯一标识查找表中的一个数据元素,则称其为主关键字,否则为 次关键字。当数据元素仅有一个数据项时,其关键字即为该数据元素的值。

查找(search)根据给定的关键字值,在查找表中确定一个关键字与给定值相同的数据 元素,并返回该数据元素在查找表中的位置。若找到相应数据元素,则称查找成功,否则称 查找失败,此时返回空地址。

对于查找表的查找,一般有两种情况:一种是静态查找,指在查找过程中只是对数据元 素进行查找;另一种是动态查找,指在实施查找过程中,插入查找失败的元素,或从查找表 中删除已查到的某个元素,即允许表中元素发生变化。

平均查找长度(average search length , ASL)是为确定数据元素在查找表中的位置,需 要和给定的值进行比较的关键字个数的期望值,称为查找算法在查找成功时的平均查找长 度。


其中:Pi为查找查找表中第i个数据元素的概率,Ci为找到表中第i个数据元素时,已经进行

的关键字的比较次数。 需要注意,这里讨论的平均查找长度是在查找成功的情况下进行的讨论,换句话说,我们认为每次查找都是成功的。前面提到查找可能成功也可能失败,但是在实际应用的大多数 情况下,查找成功的可能性要比不成功的可能性大得多,特别是查找表中数据元素个数 n 较大时,查找不成功的概率可以忽略不计。由于查找算法的基本运算是关键字之间的比较操 作,所以平均查找长度可以用来衡量查找算法的性能。在一个结构中查找某个数据元素的过程依赖于这个数据元素在结构中所处的位置因

此,对表进行查找的方法取决于表中数据元素以何种关系组织在一起,该关系是为进行查找人为加在数据元素上的。为此查找有基于线性结构的查找还有基于树结构的查找,而这些查 找都是基于关键字的比较进行的,都属于比较式的查找;另一类查找法是计算式查找法,也 称为 HASH 查找法。

(偷懒摘得原文。。。)

查找方法的介绍

基于线性结构的查找主要介绍两种最常见的查找方法:顺序查找和折半查找。

  • 顺序查找

特点:用所给的关键字与线性表中各元素的关键字逐个进行比较,直到成 功或失败。

基本思想:在查找表的一端设置一个称为“监视哨”的附加单元,存放要查找 的数据元素关键字。然后从表的另一端开始查找,如果在“监视哨”位置找到给定关键字, 则失败,否则成功返回相应元素的位置。

  • 二分查找:

 特点 :这种查找方法需要待查的查找表满足两个条件:首先,查找 表必须使用顺序的存储结构;其次,查找表必须按关键字大小有序排列。

基本思想 :首先,将查找表中间位置数据元素的关键字与给定关键字比较,如 果相等则查找成功;否则利用中间元素将表一分为二,如果中间元素关键字大于给定关键字, 则在前一子表中进行折半查找,否则在后一子表中进行折半查找。重复以上过程,直到找到 满足条件的元素,则查找成功;或直到子表为空为止,此时查找不成功。

实现举例:

public class BinaryFind {
	public static void main(String[] args) {
		int[] num = new int[ ]{1,2 ,3,8,9,11,32 ,33 ,53,90} ;
		BinaryFind bf = new BinaryFind() ;
	bf.binaryFind( 0 , num.length-1 , 11, num) ;
	bf.binFind( 0 , num.length-1 , 5, num) ;
	bf.binFind( 0 , num.length-1 , 111, num) ;
	}

//递归写法
	public void binaryFind(int leftIndex , int rightIndex , int val , int[] num){	
		if(leftIndex <= rightIndex){
			int mid = (leftIndex + rightIndex) / 2 ;	
			if ( num[ mid ] > val ){
				//要查的数在mid 的左边,在左边继续按二分法查找(中间的数已经比较过了,所以是----mid - 1
				binaryFind(leftIndex , mid -1 , val , num );
			}else if ( num[ mid ]< val  ){
				binaryFind(mid + 1 , rightIndex , val , num );
			}else if (  num[ mid ] == val ){
				System.out.println("找到下标" + mid);
			}
			if(rightIndex == leftIndex && val>num[rightIndex]){
				System.out.println("你找的数不存在,rightIndex ="+ rightIndex);
			}
			if(rightIndex == leftIndex && val<num[rightIndex]){
				System.out.println("你找的数不存在,rightIndex ="+ rightIndex);
			}
		}
	}

	//非递归写法
	public void binFind(int leftIndex , int rightIndex , int val , int[] num){	
		while(leftIndex <= rightIndex ){
			int mid = ( leftIndex + rightIndex ) / 2 ;
			if ( num[ mid ] > val){
				rightIndex = mid -1 ;
			}else if ( num[ mid ] < val){
				leftIndex = mid + 1 ;
			}else if ( num[ mid ] == val ){
					System.out.println("找到下标" + mid);
					break ;
			}
			if(rightIndex == leftIndex && val>num[rightIndex]){
				System.out.println("你找的数不存在,rightIndex ="+ rightIndex);
			}
			if(rightIndex == leftIndex && val<num[rightIndex])
				System.out.println("你找的数不存在,rightIndex ="+ rightIndex);
			
		}
	}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值