第十章查找4讲解学习.ppt

  1. 1、本文档共51页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十章 查找;一、基本概念;平均查找长度定义为:;线性表的顺序查找; 算法中监视哨R[n]的作用仍然是为了在while 循环中省去判定防止下标越界的条件 in, 从而节省比较的时间。 顺序查找的平均查找长度为:;线性表的二分查找;[05 13 19 21 37 56 64 75 80 88 92];[05 13 19 21 37 56 64 75 80 88 92];二分查找算法 int BINSEARCH(table R[],keytype K) { int low,mid,high; low=0; high=n-1; while (low=high) { mid=(low+high)/2; if (K=R[mid].key) return mid; if (KR[mid].key) high=mid-1; esle low=mid+1; } return -1; };算法分析;因此,在等概率假设下,二分查找的平均查找长度为:;可见,二分查找的算法复杂度为:;线性表的分块查找;13;分块查找索引表的结构 typedef struct /* 索引表结点结构 */ { keytype key; int addr; } IDtable; IDtabel ID[b]; /* 索引表 */ ;int BLKSEARCH(table R[],IDtable ID[],keytype K) { int i,low1,low2,mid,high1,high2; low1=0; high1=b-1; /* 置查找区间上下界的初值 */ while (low1=high1) { mid=(low1+high1)/2; if (k=ID[mid].key) high1=mid-1; else low1=mid+1; } /* 查找完毕,low1为找到的块号 */ if (low1b) /* 否则,K大于所有关键字 */ { low2=ID[low1].addr; /* 块起始地址 */ if (low1==b-1) high2=n-1; else high2=ID[low1+1].addr-1; for (i=low2;i=high2;i++) /* 在块内顺序查找 */ if (R[i].key==K) return i; /* 查找成功 */ } return(-1); /* 查找失败 */ };算法分析; 分块查找的性能介于顺序查找和二分查找之间的,例如,对长度为10000的线性表,它们的平均查找长度分别是:;三、树表的查找;四、散列表的查找;例1:已知一个含有70个结点的线性表,其关键字是两位十进制数字组成,则可将线性表存储在如下说明的散列表中: datatype HT1[100]; 其中,HT[i]存放关键字为i的结点,亦即散列函数为: H(key)=key;例2:已知线性表关键字集合为: S = { and, begin, do, end, for, go, if, repeat, then, until, while} 可设散列表为: char HT2[26][8]; 散列函数H(key)的值,取为关键字key中的第一个字母在字母表{a, b, c, ..., z}中的序号,即: H(key)=key[0] – ‘a’;例3:若在上例的集合S中增加4个关键字构成一个新的集合S1 = S + { else, array, with, up},此时虽然仍可取上例中的一维数组来存放S1对应的散列表,但是要修改散列函数,因为对于不同的两个关键字,由原来的散列函数得到的散列地址可能相同。可以这样定义新的散列函数:散列函数的值为key中首尾字母在字母表中序号的平均值,即: int H3(key) char key[]; int i; { i = 0; while ((i8) (key[i]!=‘\0’)) i++; return((key[0] + key(i-1) – 2*’a’) /2 ) };例3中关键字对应的散列表;由上面的例子可知: 在建立散列表时,若散列函数是一个一对一的函数, 则在查找时,只需根据散列函数对给定值进行某种运 算,即可得到待查结点的存储位置。 在一般情况下,散列表的空间必须比结点的集合大,

文档评论(0)

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

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

1亿VIP精品文档

相关文档