- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ds8-查找算法
第8章 查找算法;8.1 查找的基本概念;(2)查找表指由具有同一类型(属性)的数据元素组成的集合。
静态查找表只允许进行查找,不能改变表中的数据元素。
动态查找表不仅可以实现查找,还允许向表中插入或删除数据元素。
(3)查找是指在查找表中查找键值与待查元素值相等的过程。
(4)平均查找长度是指查找过程中对键需要执行的平均比较次数,是一个查找算法优劣的衡量标准。
对n个对象记录进行查找时,平均查找长度为:;8.2 静态查找表;顺序表类的定义如下:
算法8.2:顺序表类的定义
class Sqtable{
private:
datanode r[MAXSIZE]; //数组,查找表
int n; //数据元素个数,表长
public:
Sqtable(); //构造函数
void create();
void output();
int sq_search(KeyType k); //顺序查找
int binary_search(KeyType k); //折半查找
};
;8.2.1 顺序表的查找;已知表r,关键字数据K,表长n:
算法8.3:顺序查找算法
int Sqtable::sq_search(KeyType K){
r[n].key=K; //设置监视哨
int i=0;
while(r[i].key!=K) i++;
if(in) return i; //查找成功,该记录下标为i
else return -1; //查找失败
}
;顺序表的性能分析:;改进:自组织表
对顺序表的查找有如下三种改进策略(自组织表):
① 每次成功查找将被查元素移动到查找表的表头;
② 每次成功查找将被查元素向前移动一个位置;
③ 给每个元素增加一个频率域,每次成功查找时,更新该元素的频率并且移动元素的位置,以保持查找表中的元素按频率从大到小存储。
根据“二八规律”,80%的查找都会在前20%部分成功。
;8.2.2 折半查找;【例8.1】已知一个有11个数据元素的有序表(关键字即为数据元素的值):(04,15,20,27,39,46,59,61,78,82,95),以折半查找方法查找关键字为27和86的数据元素。
其中:方括号表示当前的查找区间,“↑”指向中间、下界和上界位置。
;(1)如查找给定值key=27的元素;(2)如查找给定值key=86;算法8.5:折半查找的递归算法
int Sqtable:: binary_search(KeyType k, int low, int high){
if ( low high ) return –1;
int mid = (low + high) / 2;
if ( k == r[mid] ) return mid;
else if ( k r[mid] ) return binary_search(k, low, mid-1);
else return binary_search(k, mid+1, high);
}
;算法8.4:折半查找的非递归算法
int Sqtable:: binary_search(KeyType K){
int mid,low,high,find;
low=0;high=n-1;find=0;
do{
mid=(low+high)/2;
if(K==r[mid].key){
find=1;
return mid; //查找成功,该记录下标为mid
} else if(Kr[mid].key) high=mid-1;
else low=mid+1;
}while(find==0low=high);
if(find==0) return -1; //查找失败!
}
;折半查找算法的复杂度分析:
折半查找可描述为二叉树的形式,称为折半查找判定树。设待查区间为[low..high],则折半查找判定树递归定义如下:
(1)如果lowhigh,则折半查找判定树为空。
(2)如果low=high,则折半查找判定树的根为mid=(low+high)/2,左子树的查找区间为[low..mid-1],右子树的查找区间为[mid+1..high]。
;?;折半查找的优点与缺点:;8.3 散列表;哈希冲突:;8.3.1 哈希函数的常用构建方法;直接定址法
哈希函数Hash(key)=a*key+b,其中a和b都为常数。
直接定址法取关键字的某个线性函数值为哈希地址。
此类哈希函数计算方法最简单,是一对一的映射,一般不会产生冲突。但是,直接
原创力文档


文档评论(0)