- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6章 查找 对数据进行查找的方法取决于计算机中数据元素以何种关系组织在一起,而这种关系需要人为添加!即 存储手段或存储结构 §1 静态查找表 一、顺序查找 一、顺序查找 一、顺序查找 一、顺序查找 一、顺序查找 二、折半查找 二、折半查找 二、折半查找 二、折半查找 二、折半查找 二、折半查找 二、折半查找 三、分块查找 三、分块查找 三、分块查找 一、哈希表 二、哈希函数的构造 二、哈希函数的构造 二、哈希函数的构造 二、哈希函数的构造 三、处理冲突的方法 三、处理冲突的方法 三、处理冲突的方法 三、处理冲突的方法 a[1] … a[4] … a[10] … a[11] … a[20] … a[35] 0 … 34 … 90 … 100 … 190 … 340 允许元素冲突 1、直接定址法(自身函数) hash(key)=key 或 hash(key)=a?key+b 如统计从1岁到22岁的人口数字,则可以年龄 为关键字,取关键字本身为哈希函数。 若要统计从1949年至今出生的人口数,则可以 年份为关键字,哈希函数是hash(key)=key+(-1948)。 地址 年份 人数 01 1949 ...... ...... ...... 22 1970 2、取模法(模除函数) 又叫除留余数法。它的思想是将关键字值除以一 个整数m(m为接近表中允许的最大地址数N的一质数)后把所得余数作为哈希函数的值,m叫做模。 这样的函数为取模函数,记为H(key)=key MOD m。 例如,对于以下四个关键字及其内部代码用取模法时: 关键字 keya keyb keyc keyd 内部代码 7 25 18 33 key MOD 15 7 10 3 3 冲突 当hash函数的m取14时,则没有冲突。 关键字 keya keyb keyc keyd 内部代码 7 25 18 33 key MOD 14 7 11 4 5 不冲突 3、平方取中法; 4、叠加法; 5、随机法; 如前所述,均匀的哈希函数可以减少冲突,但不能避免冲突。所以,在哈希表中解决冲突现象是必须要考虑的。 常用的处理冲突的方法有开放地址法、链地址法。这里主要介绍开放地址法。 (一)开放地址法 用开放地址法处理冲突就是当冲突发生时 ,形成一个地址序列,沿着这个序列逐个探测,直到找出一个空的开放地址,将发生冲突的关键字值放到该地址中去。 * * 由于查找运算的使用频率很高,几乎在任何一个计算机系统软件和应用软件中都会涉及到,所以当问题所涉及的数据量相当大时,查找方法的效率就显得格外重要。在一些实时查询系统中尤其如此。因此,本章将系统地讨论各种查找方法,并通过对它们的效率分析来比较各种查找方法的优劣。 概 述 基本概念 查找也称检索,是根据给定的关键字值,在表中确定一个其关键字等于给定值的记录的过程。显然,若表中存在这样的一个记录,则称查找成功,返回值可以是该记录的地址;若表中不存在相应的记录,则查找不成功,返回值可为“空”记录或“空”指针。 查询大学入学考试成绩?168系统 查询电话号码?114系统 你如何做 §1 静态查找表 1、顺序查找 2、折半查找 3、分块查找 §3 哈希表及其查找 1、哈希表 2、哈希函数的构造 3、处理冲突的方法 §2 动态查找表 1、二叉排序树 2、平衡二叉树 主要内容 为确定要查找的记录位置,与给定值进行比较的关键字个数的期望值,称为查找算法在查找成功时的平均查找长度。对于 n 个记录的表,查找成功时的平均查找长度为: 基本概念 为查找表中第i个记录的概率,且 为找到表中其关键字与给定值相等的第i个 记录时,和给定值已进行过比较的关键值个数,且随查找过程不同而具有不同的值。 平均查找长度 1、基本思想 从表中最后一个或第一个记录开始,顺序扫描线性表,依次将扫描到的结点关键字和给定值K相比较。若当前扫描到的结点关键字与K相等,则查找成功;若扫描结束后,仍未找到关键字等于K的结点,则查找失败。 int seqsearch(NODE record[],int num,int k) { int i=num,n=num; /*记录序号*/ record[0]=k; /*设置监视哨*/ while(record[i--]!=k);
原创力文档


文档评论(0)