八查找.ppt

  1. 1、本文档共45页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
八查找

第八章 查找 本章内容 查找的概念 表的查找 散列技术 二叉查找树 8.1 查找的概念 查找(searching)也称检索(retrieval),是计算机信息处理最重要的应用之一,它是根据给定的查找值,在表中确定一个关键字等于给定查找值的记录的过程。 查找方法评价 查找速度 占用存储空间多少 算法本身复杂程度 平均查找长度 8.2 表的查找 顺序查找(Sequential search)又称线形查找(Liner search) 查找过程:从表的一端开始逐个进行记录的关键字和 给定查找值的比较,直至查找成功或查找失败。 算法描述: int Sqsearch(SqList L, keytype kcode) { for(int i=0; iL.length; i++) if(L.r[i].key= =kcode) break; } if(i= L.length) return -1; //查找失败 return i; } 8.2.2 折半查找 8.2.3 分块查找 查找过程:将表分成几块,块内无序,块间有序;先确定待查记录所在块,再在块内顺序查找。 适用条件:分块有序表。 算法实现 用数组存放待查记录,每个数据元素至少含有关 键字域。 建立索引表,每个索引表结点含有块最大关键 字域和指向块第一个结点的指针。 分块查找方法评价 8.3 散列技术 从例子可见: 哈希函数只是一种映射,所以哈希函数的设定可以很灵活,只要使任何关键字的哈希函数值都落在表长允许的范围之内即可。 哈希函数通常是一种压缩映射,所以冲突不可避免,只能尽量减少,冲突发生后,应该有处理冲突的方法。 数字分析法 构造:对关键字进行分析,取关键字的若干位或其组合作为哈希地址。 适于关键字位数比哈希地址位数大,且可能出现的关键字事先知道的情况。 取余法 平方取中法 折叠法 构造:将关键字分割成位数相同的几部分,然后取这几部 分的叠加和(舍去进位)做散列地址。 移位叠加:将分割后的几部分低位对齐相加。 间界叠加:从一端沿分割界来回折送,然后对齐相加。折叠法适于关键字位数很多,且每一位上数字分布大致均匀情况。 随机数法 处理冲突的方法 开放定址法(Open addressing)、再散列法(rehashing)和链地址法(Chaining)。 1.开放定址法 方法:当冲突发生时,形成一个探查序列;沿此序列逐个地址探查,直到找到一个空位置(开放的地址),将发生冲突的记录放到该地址中,即Hi=(H(key)+di)Mod m,i=1,2,……k(k?m-1) 其中:H(key)——哈希函数 m——哈希表表长 di——增量序列 分类 线性探测再散列:di=1,2,3,……m-1 二次探测再散列:di=12,-12,22,-22,32,……±k2(k?m/2) 伪随机探测再散列:di=伪随机数序列 2.再哈希法(双散列函数法) 方法:构造若干个哈希函数,当发生冲突时,计算下一个哈希地址,即:Hi=RHi(key) i=1,2,……k 其中:RHi——不同的哈希函数。 特点:计算时间增加 3.拉链地址法 方法:将所有关键字为同义词的记录存储在一个单链表中,并用一维数组存放头指针。 哈希查找过程及分析 哈希查找过程 哈希查找分析 哈希查找过程仍是一个给定值与关键字进行比较的过程 评价哈希查找效率仍要用ASL 哈希查找过程与给定值进行比较的关键字的个数取决于: 哈希函数 处理冲突的方法 哈希表的填满因子?=表中填入的记录数/哈希表长度 8.4 树表的查找 二叉排序树(Binary Sort Tree)又称为二叉查找数,它或者是一棵空树,或者是具有以下性质的二叉树(1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)它的左子树、右子树也分别为二叉排序树。 二叉排序树示意 二叉排序树结点的数据类型定义: struct BstNode { keytype key; Elemtype other; struct node *lchild,*rchild; }; 在二叉排序树中插入结点示意 二叉排序树的结点插入操作算法 BstNode *InsertBst(BstNode *t , BstNode *s) { //在二叉排序树中插入结点*s BstNode *p, *f; if((p=t)= =NULL) return s; while(p!=NULL)

文档评论(0)

taotao0c + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档