- 1、本文档共51页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)