- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
查找的基本概念 查找表(Search Table):由同一类型的数据元素(或记录)构成的集合,是一种以集合为逻辑结构、以查找为核心运算的数据结构。 静态查找表:只对查找表进行查询某个特定的数据元素或某个特定数据元素的各种属性的操作。如:查询成绩表中是否有某学生或该学生某门课程的成绩。 动态查找表:对查找表进行插入或删除某个数据元素的操作。如:插入某个学生某门课程的成绩。 查找的基本概念 关键字:是数据元素中某个数据项的值,它可以标识一个数据元素 主关键字:可以唯一标识一个记录的关键字 次关键字:可以标识若干个记录的关键字 查找(Search):也称检索,是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录或数据元素。 查找成功:即找到满足条件的数据对象,这时作为结果可报告该对象在结构中的位置, 还可给出该对象中的具体信息。 查找不成功:或搜索失败。作为结果应报告一些信息, 如失败标志、位置等。 查找的基本概念 衡量查找算法的标准: 平均查找长度ASL(Average Search Length):为确定记录在表中的位置,需和给定值进行比较的关键字个数的期望值称为查找算法在查找成功时的平均查找长度。 n:记录的个数 pi:查找第i个记录的概率 ( 通常认为pi =1/n ) ci:找到第i个记录所需的比较次数 算法所需要的存储量和算法的复杂性等 9.1.1 顺序查找(线性查找) 查找方式:从表的第一个元素开始,将给定的值与表中逐个元素的关键字进行比较,直到两者符合,查到所要找的元素为止。否则就是表中没有要找的元素,检索不成功。 适用范围:顺序表或线性链表表示的静态查找表,表内元素之间无序。 顺序表的表示 typedef struct { ElemType *elem; //表基址 int length; //表长 }SSTable; 顺序查找实现 int LocateELem(SqList L,ElemType e){ for (i=0;i L.length;i++) if (L.elem[i]==e) return i+1; return 0;} 9.1.1 顺序查找 int Search_Seq( SSTable ST , KeyType key ){ //若成功返回其位置信息,否则返回0 ST.R[0].key =key; for( i=ST.length; ST.elem[ i ].key!=key; - - i ); //不用for(i=n; i0; - -i) 或 for(i=1; i=n; i++) return i; } 9.1.1 顺序查找 顺序查找方法的特点 表结构为有序表、无序表均可适用; 存储结构为顺序存储和链式存储的表均适用; 适合于短表,方法简单; 时间复杂度为O(n); 平均查找长度比其他方法大,查找成功时: 9.1.2 折半查找 查找方法:首先选择表中间的一个记录,比较其关键字与要查找关键字的值;若要找的记录的关键字值大,则再取表的后半部的中间记录进行比较;否则取前半部的中间记录进行比较,如此反复,直到找到为止。 适用范围:采用顺序存储结构的有序表 9.1.2 折半查找 折半查找的实现 令low=1,high=n, mid= ?(low+high)/2? ? 若kelem[mid].key,则high=mid-1 若kelem[mid].key,则low=mid+1 9.1.2 折半查找 9.1.2 折半查找 算法描述 设表长为n,low、high和mid分别指向待查元素所在区间的上界、下界和中点,k为给定值。 初始时,令low=1,high=n,mid= ?(low+high)/2? ? 让k与mid指向的记录比较 若k==elem[mid].key,查找成功 若kelem[mid].key,则high=mid-1 若kelem[mid].key,则low=mid+1 重复上述操作,直至lowhigh时,查找失败 9.1.2 折半查找 int Search.Bin ( SSTable ST,KeyType key) { // 在有序表ST中折半查找其关键字等于key的数据元素。若找到,则函数值为 该元素在表中的位置,否则为0。 low = 1; high = ST.length; //置区间初值 while (low=high)
文档评论(0)