- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第九章 查找表;何谓查找表 ?;对查找表经常进行的操作:;仅作 前两种即查询和检索操作的查找表。
即检索的前后不会改变查找表的内容。; 检索是确定数据元素集合中是否存在数据元素等于特定元素或是否存在元素满足某种给定特征的过程。 ;是数据元素(或记录)中某个数据项的值,用以标识(识别)一个数据元素(或记录)。; 根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录) ;如果查找表中的数据元素之间不存在明显的组织规律,则不便于查找。
例:查阅英文单词时,由于字典是按单词的字母在字母表中的次序编排的,因此查找时不需要从字典中第一个单词比较起,而只要根据待查单词的每个字母在字母表中的位置查到该单词。; 线性结构是数据元素间最常见的数据结构,基于线性表的检索运算在各类程序中应用非常广泛,我们介绍三种在线性表上进行检索的方法,它们分别是顺序检索、二分法检索与分块检索。为简化问题,本节所介绍的检索方法均视为是基于静态查找表上的操作。 ;9.1
静 态 查 找 表;数据对象D:; Create(ST, n);;
构造一个含n个数据元素
的静态查找表ST。
;销毁表ST。;若 ST 中存在其关键字等于
key 的数据元素,则函数值为该元素的值或在表中的位置,否则为“空”。 ;按某种次序对ST的每个元素调用函数Visit()一次且仅一次,一旦Visit()失败,则操作失败。;typedef struct {
// 数据元素存储空间基址,建表时
// 按实际长度分配,0号单元留空
int length; // 表的长度
} SSTable;;数据元素类型的定义为:;一、顺序查找表; 以顺序表或线性链表表示静态查找表。
从表的一端开始,顺序(逐个)扫描线性表,依次将扫描到的结点关键字和给定值Key相比较,若当前扫描到的结点关键字与Key相等,则检索成功;若扫描结束后,仍未找到关键字等于Key的结点,则检索失败。
;i;ST.elem;int Search_Seq(SSTable ST,
KeyType key) {
// 在顺序表ST中顺序查找其关键字等于
// key的数据元素。若找到,则函数值为
// 该元素在表中的位置,否则为0。
ST.elem[0].key = key; // “哨兵”
for (i=ST.length; ST.elem[i].key!=key; --i);
// 从后往前找
return i; // 找不到时,i为0
} // Search_Seq; 定义: 查找算法的平均查找长度
(Average Search Length)
也就是为确定某一结点在数据集合中的位置,给定值
与集合中的结点关键字所需进行的比较次数。
其中: n 为表长,Pi 为查找表中第i个记录的概率,
且 Ci为找到该记录时,曾和给定值
比较过的关键字的个数;
在等概率查找的情况下,
顺序表查找的平均查找长度为:
; 若查找概率无法事先测定,则查找过程采取的改进办法是,可以在记录中附设一个访问频度域,使查找概率大的记录在查找过程中不断后移,以便在以后的查找过程中减少比较次数; 上述顺序查找表的查找算法简单,
但平均查找长度较大,特别不适用于表长较大的查找表。;1.设表长为n,low、high和mid分别指向待查元素所在区间的上界、下界和中点,k为给定值。2.初始时,令 low=1,high=n,mid=?(low+high)/2? 让k与mid指向的记录比较 若k==r[mid].key,查找成功 若kr[mid].key,则high=mid-1 若kr[mid].key,则low=mid+13.重复上述操作,直至lowhigh时,查找失败。;ST.elem;int Search_Bin ( SSTable ST, KeyType key ){
low = 1; high = ST.length; // 置区间初值
while (low = high) {
mid = (low + high) / 2;
if (EQ (ke
原创力文档


文档评论(0)