数据结构C语言版教程1单元.ppt

  1. 1、本文档共657页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
mid =(low+high)/2; /*整除*/ if (kr[mid].key) high=mid-1; else if (kr[mid].key) low=mid+1; else { i=mid; find=1; } } if (!find) i=0; return (i); } 算法分析:折半查找函数找到一个记录的过程恰好是一条从判定树的根到被查找结点的一条路径,而比较的次数恰好是树深。借助于二叉判定树很容易求得折半查找的平均查找长度。假设表长为n ,树深h= lb(n+1),则平均查找长度为 因此,折半查找法的平均查找长度为O(lbn),与顺序查找方法相比,折半查找的效率比顺序查找高,速度比顺序查找快,但折半查找只能适用于有序表,需要对n个元素预先进行排序,仅限于顺序存储结构(对线性链表无法进行折半查找)。 8.1.3 索引顺序表的查找 分块查找又称为索引顺序查找,是顺序查找的一种改进,其性能介于顺序查找和折半查找之间。分块查找把线性表分成若干块,每一块中的元素存储顺序是任意的,但块与块之间必须按关键字大小排序,即前一块中的最大关键字小于(或大于)后一块中的最小(或最大)关键字值。另外,还需要建立一个索引表,索引表中的一项对应线性表中的一块,索引项由关键字域和链域组成,关键字域存放相应块的最大关键字,链域存放指向本块第一个结点的指针。索引表按关键字值递增(或递减)顺序排列。 分块查找的查找函数分为两步进行:首先确定待查找的结点属于哪一块,即查找其所在的块;然后在块内查找要查的结点。由于索引表是递增有序的,采用折半查找时,块内元素个数较少,采用顺序法在块内查找,不会对执行速度有太大的影响。 例8.3 对于关键字序列为{8,20,13,17,40,42,45,32,49,58,50,52,67,70,78,80}的线性表采用分块查找法查找关键字为50的元素。假定分块索引和索引表如图8.3所示。 序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ? 8 20 13 17 40 42 45 32 49 58 50 52 67 79 78 80 (a) key low high 20 1 4 45 5 8 58 9 12 80 13 16 图8.3 块表与索引表 (a) 块表;(b) 索引表 分块查找过程是:先在索引表中采用二分查找法查找关键字50所在的块,即在第3块中有4个元素,其关键字分别为49,58,50,52,在其中按顺序查找法进行查找,找到第3个元素(即总序号为11的元素)即关键字为50的元素。 索引表的定义如下: struct indexterm { KeyType key; int low,high; } typedef struct indexterm index[MAXITEM]; 这里的KeyType是关键字的数据类型,可以是任何相应的数据类型,这里默认为int型。 分块查找的函数如算法8.3,其功能是在线性表r中分块查找关键字为k的结点,若找到,则返回其位置i;若找不到,返回0。 /*算法描述8.3 分块查找*/ int blksearch (r,idx,k,kug) sqlist r; index idx; int k,kug; { /*kug为块的个数*/ int i,low 1=1,high1=kug,mid1,db,find=0; while (low=high1 !find) /*二分查找索引表*/ { mid1=(low1+high1)/2; if (kidx[mid1].key) high1=mid1-1; else if(kidx[mid1].key) low1=mid1+1; else { high1=mid1-1; find=1; ???} } if (low1kug) /*k小于索引表内最大值*/ { i=idx[low1].low; /*在索引表中定块起始地址*/ db=idx[low1].high; /*在索引表中定块终止地址*/ } /*在指定的块内采用顺序方法进行

您可能关注的文档

文档评论(0)

精品课件 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档