经典算法:折半查找


活动地址:CSDN21天学习挑战赛

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…


欢迎参与CSDN学习挑战赛,成为更好的自己,请参考活动中各位优质专栏博主的免费高质量专栏资源(这部分优质资源是活动限时免费开放喔~),按照自身的学习领域和学习进度学习并记录自己的学习过程。您可以从以下3个方面任选其一着手(不强制),或者按照自己的理解发布专栏学习作品,参考如下:

**

什么是算法

一、数据、数据元素、数据项和数据对象

1.数据:是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称
2.数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理
3.数据项:是组成数据元素的、有独立含义的、不可分割的最小单位
4.数据对象:是性质相同的数据元素的集合,是数据的一个子集

二、数据结构

1.数据结构定义:是相互之间存在一种或多种特定关系的数据元素的集合。数据结构包括逻辑结构和存储结构
2.逻辑结构:数据的逻辑结构是从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。因此数据的逻辑结构可以看做是从具体问题抽象出来的数学模型
3.存储结构:数据对象在计算机中的存储表示称为数据的存储结构,也称为物理结构。把数据对象存储到计算机时,通常要求既要存储各数据元素,又要存储数据元素之间的逻辑关系,数据元素在计算机内用一个结点来表示。数据元素在计算机中有两种基本的存储结构,分别是顺序存储结构和链式存储结构

三、算法定义和特性

  1. 定义:是为了解决某类问题而规定的一个有限长的操作序列
  2. 特性:
    (1)有穷性:一个算法必须总是在执行有穷步后结束,且每一步都必须在有穷时间内完成
    (2)确定性:对于每种情况下所应执行的操作,在算法中都有确切的规定,不会产生二义性,使算法的执行者或阅读者都能明确其含义及如何执行
    (3)可行性:算法中的所有操作都的可以通过已经实现的基本操作运算执行有限次来实现
    (4)输入:一个算法有零个或多个输入,当用函数描述算法时,输入往往是通过形参表示的,在它们被调用时从主调函数获得输入值
    (5)输出:一个算法有一个或多个输出,它们是算法进行信息加工后得到的结果,无输出的算法没有任何意义,当用函数描述算法时,输出多用返回值和引用类型的形参表示

四、评价算法优劣的基本标准

1.正确性。在合理的数据输入下能够在有限的运行时间内得到正确的结果
2.可读性。一个好的算法首先应便于人们理解和相互交流,其次才是机器可执行性,可读性强的算法有助于人们对算法的理解,而难懂的算法易于隐藏错误,且难以调试和修改
3.健壮性。当输入的数据非法时,好的算法能适当地做出正确的反应或进行相应处理,而不会产生一些莫名其妙的输出结果
4.高效性。高效性包括时间和空间两个方面。时间高效是指算法设计合理执行效率高,可以用时间复杂度来度量;空间高效性是指算法占用存储容量合理,可以用空间复杂度来度量。时间复杂度和空间复杂度是衡量算法的两个主要指标

**

顺序查找

**
一、查找的基本概念

1.查找表:查找表是由同一类型的数据元素(或记录)构成的集合。由于“集合”中的数据元素之间存在着完全松散的关系,因此查找表是一种非常灵便的数据结构,可以利用其他的数据结构来实现,如线性表、树表及散列表等
2.关键字:关键字是数据元素(或记录)中某个数据项的值,用它可以标识一个数据元素(或记录)。若此关键字可以唯一地标识一个记录,则称此关键字为主关键字(对不同的记录,其主关键字均不同)。反之,称用以识别若干记录的关键字为次关键字。当数据元素只有一个数据项时,其关键字即为该数据元素的值
3.查找:查找是指根据给定的某个值,在查找表中确定一个其关键字等于给定值的记录或数据元素。若表中存在这样的一个记录,则称查找成功,此时查找的结果可给出整个记录的信息,或指示该记录在查找表中的位置;若表中不存在关键字等于给定值的记录,则称查找不成功,此时查找的结果可给出一个“空”记录或“空”指针
4.动态查找表和静态查找表:若在查找的同时对表做修改操作(如插入和删除),则相应的表称之为动态查找表,否则称之为静态查找表。换句话说,动态查找表的表结构本身是在查找过程中动态生成的,即在创建表时,对于给定值,若表中存在其关键字等于给定值的记录,则查找成功返回;否则插入关键字等于给定值的记录
5.平均查找长度:为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值,成为查找算法在查找成功时的平均查找长度

二、折半查找
1.折半查找定义

折半查找也称二分查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列,在下面及后续的讨论中,均假设有序表是递增有序的。
折半查找的查找过程为:从表的中间记录开始,如果给定值和中间记录的关键字相等,则查找成功;若给定值大于或小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找,这样重复操作,直到查找成功,或者在某一步中查找区间为空,则代表查找失败。
折半查找每一次查找比较都使查找范围小一半,与顺序查找相比,很显然可以提高查找效率。
为了标记查找过程中每一次的查找区间,下面分别用low和high来表示当前查找区间的下界和上界,mid为区间的中间位置。

2.算法描述
1).置查找区间初值,low为1,high为表长
2).当low小于等于high时,循环执行以下操作:

①mid取值为low和high的中间值;
②将给定值key与中间位置记录的关键字进行比较,若相等则查找成 功,返回中间位置mid;
③若不相等则利用中间位置记录将表对分成前、后两个子表。如果key比中间位置记录的关键字小,则high取为mid-1,否则low取为mid+1。

3).循环结束,说明查找区间为空,则查找失败,返回0。

3.例:

int Search Bin(SSTable ST,KeyType key)			//在有序表ST中折半查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0
{
	low=1;high=ST.length;						//置查找区间初值
	while(low<=high)
	{
		mid=(low+high)/2;
		if(key==ST.R[mid].key) return mid;		//找到待查元素
		else if(key<ST.R[mid].key) high=mid-1;	//继续在前一子表进行查找
		else low=mid+1;							//继续在后一子表进行查找
	}											//while
	return 0;									//表中不存在待查元素
}

4.算法分析

折半查找过程可用二叉树来描述。树中每一结点对应表中一个记录,但结点值不是记录的关键字,而是记录在表中的位置序号。把当前查找区间的中间位置作为根,左子表和右子表分别作为根的左子树和右子树,由此得到的二叉树称为折半查找的判定树。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值