{信息技术}第九章查找欢迎光临青岛科技大学信息科学技术学院
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(信息技术)第九章查找欢迎光临青岛科技大学信息
科学技术学院
第九章查找
本章中介绍下列主要内容:
静态查找表及查找算法:顺序查找、折半查找
动态查找表及查找算法:二叉排序树
哈希表及查找算法
第壹节基本概念
查找表用于查找的数据元素集合称为查找表。查找表由同壹类型的数据元素(或记录)构成。
静态查找表若只对查找表进行如下俩种操作:(1)于查找表中查见某个特定的数据元素是否于查找表中,(2)检索某个特定元素的各种属性,则称这类查找表为静态查找表。静态查找表于查找过程中查找表本身不发生变化。对静态查找表进行的查找操作称为静态查找。
动态查找表若于查找过程中能够将查找表中不存于的数据元素插入,或者从查找表中删除某个数据元素,则称这类查找表为动态查找表。动态查找表于查找过程中查找表可能会发生变化。对动态查找表进行的查找操作称为动态查找。
关键字是数据元素中的某个数据项。唯壹能标识数据元素(或记录)的关键字,即每个元素的关键字值互不相同,我们称这种关键字为主关键字;若查找表中某些元素的关键字值相同,称这种关键字为次关键字。例如,银行帐户中的帐号是主关键字,而姓名是次关键字。
查找于数据元素集合中查找满足某种条件的数据元素的过程称为查找。最简单且最常用的查找条件是"关键字值等于某个给定值",于查找表搜索关键字等于给定值的数据元素(或记录)。若表中存于这样的记录,则称查找成功,此时的查找结果应给出找到记录的全部信息或指示找到记录的存储位置;若表中不存于关键字等于给定值的记录,则称查找不成功,此时查找的结果能够给出壹个空记录或空指针。若按主关键字查找,查找结果是唯壹的;若按次关键字查找,结果可能是多个记录,即结果可能不唯壹。
查找表的存储结构查找表是壹种非常灵活的数据结构,对于不同的存储结构,其查找方法不同。为了提高查找速度,有时会采用壹些特殊的存储结构。本章将介绍以线性结构、树型结构及哈希表结构为存储结构的各种查找算法。
查找算法的时间效率查找过程的主要操作是关键字的比较,所以通常以"平均比较次数"来衡量查找算法的时间效率。
第二节静态查找
正如本章第壹节所述:静态查找是指于静态查找表上进行的查找操作,于查找表中查找满足条件的数据元素的存储位置或各种属性。本节将讨论以线性结构表示的静态查找表及相应的查找算法。
1.顺序查找
1.1顺序查找的基本思想
顺序查找是壹种最简单的查找方法。其基本思想是将查找表作为壹个线性表,能够是顺序表,也能够是链表,依次用查找条件中给定的值和查找表中数据元素的关键字值进行比较,若某个记录的关键字值和给定值相等,则查找成功,返回该记录的存储位置,反之,若直到最后壹个记录,其关键字值和给定值均不相等,则查找失败,返回查找失败标志。
1.2顺序表的顺序查找
下面是顺序表的类型定义:
#defineMAX_NUM100//用于定义表的长度
typedefstructelemtype{
keytypekey;
anytypeotherelem;
}Se_List[MAX_NUM],Se_Elem;
假设于查找表中,数据元素个数为n(n 下面我们给出顺序查找的完整算法。 intseq_search(Se_Lista,keytypek) {//于顺序表中查找关键字值等于k的记录, //若查找成功,返回该记录的位置下标序号,否则返回0 i=1; while(i<=n&&a[i].key!=k)i++; if(i<=n)retruni; elsereturn0; } 改进算法: intseq_search2(Se_Lista,keytypek) {//设置了监视哨的顺序表查找,查找关键字值等于指定值k的记录, //若查找成功,返回记录存放位置的下标值,否则返回0 i=n; a[0].key=k; while(a[i].key!=k)i--; return(i); } 1.3链表的顺序查找 链表的顺序查找是指将查找表作为线性表且以链式存储结构存储,用顺序查找方法查找和指定关键字值相等的记录。 链表的类型定义如下所示: typedefstructlinklist{ keytypekey;//结点的关键字类型 anytypeotherelem;//结点的其他成分 structlinklist*next;//指向链表结点的指针 }Link_Linklist,*Link; 将查找表中的数据元素用这种结构的结点表示,且以指向头结点的指针标识。 对链表实现顺寻查找就是于有头结点的链式查找表中查找关键字值等于给定值的记录,若查找成功,返回指向相应结点的指针,否则返回空指针。 Link_Linklist*link_search(Linkh,keytypek) {//link为带头结点链表的头指针,查找关键字值等于k的记录, //查找成功,返回指向找到的结点的指针,查找失败返回空指针 p=h->next; while((p!=NULL)&&(p->key!=k))p=p->next; returnp; } 顺序查找算法简单,对表的结构无任何要求;可是执行效率较低,尤其当n较大时,不宜采用这种查找方法。 2.折半查找 2.1折半查找的基本思想 折半查找要求查找表用顺序存储结构存放且各数据元素按关键字有序(升序或隆序)排列,也就是说折半查找只适用于对有序顺序表进行查找。 折半查找的基本思想是:首先以整个查找表作为查找范围,用查找条件中给定值k和中间位置结点的关键字比较,若相等,则查找成功,否则,根据比较结果缩小查找范围,如果k的值小于关键字的值,根据查找表的有序性可知查找的数据元素只有可能于表的前半部分,即于左半部分子表中,所以继续对左子表进行折半查找;若k的值大于中间结点的关键字值,则能够判定查找的数据元素只有可能于表的后半部分,即于右半部分子表中,所以应该继续对右子表进行折半查找。每进行壹次折半查找,要么查找成功,结束查找,要么将查找范围缩小壹半,如此重复,直到查找成功或查找范围缩小为空即查找失败为止。 2.2折半查找过程示例 。 2.3折半查找算法 假设查找表存放于数组a的a[1]~a[n]中,且升序,查找关键字值为k。 折半查找的主要步骤为: (1)置初始查找范围:low=1,high=n; (2)求查找范围中间项:mid=(low+high)/2 (3)将指定的关键字值k和中间项a[mid].key比较 若相等,查找成功,找到的数据元素为此时mid指向的位置; 若小于,查找范围的低端数据元素指针low不变,高端数据元素指针high更新为mid-1; 若大于,查找范围的高端数据元素指针high不变,低端数据元素指针low更新为mid+1; (4)重复步骤(2)、(3)直到查找成功或查找范围空(low>high),即查找失败为止。 (5)如果查找成功,返回找到元素的存放位置,即当前的中间项位置指针mid;否则返回查找失败标志。 折半查找的完整算法如下: intbin_search(Se_Lista,keytypek)