- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章 查找 查找有关的概念与术语 关键字 :标识一个数据元素的某个数据项或组合项的值 查找表:具有同一类型(属性)的数据元素(记录)组成的集合 ,分为静态查找表和动态查找表两类. 查找: 按给定的某个值kx,在查找表中查找关键字为给定值kx的数据元素(记录)。 数据元素类型说明 typedef struct { KeyType key; /* 关键字字段,可以是整型、字符串型、构造类型等*/ …… /* 其它字段 */ } ElemType; 查找方法评价 查找速度 占用存储空间多少 算法本身复杂程度 平均查找长度ASL(Average Search Length):为确定记录在表中的位置,需和给定值进行比较的关键字的个数的期望值叫查找算法的~ 静态查找表结构 静态查找表结构:静态查找表是数据元素的线性表,可以是基于数组的顺序存储或以线性链表存储。 静态查找表的顺序存储结构 顺序存储结构 typedef struct { ElemType *elem; /* 数组基址 */ int length; /* 表长度 */ }S_TBL; 静态查找表的链式存储结构 链式存储结构 typedef struct NODE { ElemType elem; /* 结点的值域 */ struct NODE *next; /* 下一个结点指针域 */ }NodeType; 静态查找——顺序查找 查找过程:从表的一端开始逐个进行记录的关键字和给定值的比较 以顺序存储为例,数据元素从下标为1的数组单元开始存放,0号单元留空。 int s_search(S_TBL tbl,KeyType kx) { /*在表tbl中查找关键字为kx的数据元素,若找到返回该元素在数组中的下标,否则返回0 */ tbl.elem[0].key = kx; /* 存放监测,这样在从后向前查找失败时,不必判表是否检测完,*/ for( i = tbl.length ; tbl.elem[i].key kx ;i-- ); /* 从标尾端向前找 */ return i; } 静态查找——折半查找 条件:有序表——表中数据元素按关键字升序或降序排列。 折半查找的思想是:每次将待查记录所在区间缩小一半 折半查找的算法 ① low=1;high=length; // 设置初始区间 ② 当lowhigh时,返回查找失败信息 // 表空,查找失败 ③ low≤high,mid=(low+high)/2; // 取中点 a. 若kxtbl.elem[mid].key,high=mid-1; 转② // 查找在左半区进行 b. 若kxtbl.elem[mid].key,low=mid+1; 转② // 查找在右半区进行 c. 若kx=tbl.elem[mid].key,返回数据元素在表中位置 // 查找成功 折半查找算法 折半查找算法 int Binary_Search(S_TBL tbl,KEY kx) { /* 在表tbl中查找关键字为kx的数据元素,若找到返回该元素在表中的位置,否则,返回0 */ int mid,flag=0; low=1;high=length; /* ①设置初始区间 */ while(low=high) /* ②表空测试 */ { /* 非空,进行比较测试 */ mid=(low+high)/2; /* ③得到中点 */ if(kxtbl.elem[mid].key) high=mid-1; /* 调整到左半区 */ else if(kxtbl.elem[mid].key) low=mid+1/* 调整到右半区 */ else { flag=mid;break;} /* 查找成功,元素位置设置到flag中 */ }return flag; } 静态查找——有序表的插值查找思想 静态查找——有序表的斐波那契查找 斐波那契查找通过斐波那契数列对有序表进行分割,查找区间的两个端点和中点
文档评论(0)