收藏 分享(赏)

学年论文-几种查找算法的比较与总结 马有华.doc

上传人:cjc2202537 文档编号:1135751 上传时间:2018-06-14 格式:DOC 页数:30 大小:177.50KB
下载 相关 举报
学年论文-几种查找算法的比较与总结  马有华.doc_第1页
第1页 / 共30页
学年论文-几种查找算法的比较与总结  马有华.doc_第2页
第2页 / 共30页
学年论文-几种查找算法的比较与总结  马有华.doc_第3页
第3页 / 共30页
学年论文-几种查找算法的比较与总结  马有华.doc_第4页
第4页 / 共30页
学年论文-几种查找算法的比较与总结  马有华.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

1、学 年 论 文题 目: 几种查找算法的比较与总结学 院: 计算机科学与工程 专 业: 计算机科学与技术班 级: 12 级计师 1班学生姓名: 马有华学 号: 201271030132指导教师: 曹素珍I摘 要查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算。文中介绍四种查找算法分别是顺序查找、二分查找、二叉排序树查找和哈希查找。并用 JAVA语言编写了相应程序代码,比较了查找同一个数据的时间复杂度和空间复杂度。关键词: 查找算法;时间复杂度;空间复杂度AbstractSearching is a commonly basic operation that can

2、 find a number of information in computer applications.In this paper,four tapyes of searching algorithm are introduced.They are squential earch,binary search tree,and bash search.The progarms codes based on java are complied. The time complexity and space complexity to look for the same data and com

3、pared.Key words: Searching Algorithm;Timecomplexity;Spacecomplexity23目 录摘 要 .11 算法概述 .11.1引言 .11.2 顺序查找 .21.3 二分查找 .21.3.1 二分查找要求 .21.3.2 优缺点 .21.3.3 算法思想 .21.3.4 算法复杂度 .31.4 分块查找 .31.4.1 方法描述 .31.4.2 操作步骤 .31.5 哈希表查找 .41.5.1 基本原理 .41.5.2 函数构造 .41.5.3 冲突处理 .41.5.4 支持运算 .42 算法实现 .72.1 顺序查找 .72.1.1 方法

4、分类 .72.2 二分查找 .82.2.1 算法要求 .82.2.2 算法复杂度 .82.2.3 代码示例 .92.2.4 递归实现 .112.3 分块查找 .162.3.1 方法描述 .162.3.2 操作步骤 .172.4 哈希表查找 .182.4.1 操作步骤 .182.4.2 解决冲突 .193 比较与总结 .223.1分类查找的依据 .223.2效率比较 .22参考文献 .2411 算法概述1.1引言用关键字标识一个数据元素,查找时根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素。在计算机中进行查找的方法是根据表中的记录的组织结构确定的。顺序查找也称为线形查找,从

5、数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值 k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于 k的结点,表示查找失败。二分查找要求线形表中的结点按关键字值升序或降序排列,用给定值 k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。分块查找也称为索引查找,把线形分成若干块,在每一块中的数据元素的存储顺序是任意的,但要求块与块之间须按关键字值的大小有序排列,还要建立一个按关键字值递增顺序排列的索引表,索引表

6、中的一项对应线形表中的一块,索引项包括两个内容:1)键域存放相应块的最大关键字;2)链域存放指向本块第一个结点的指针。分块查找分两步进行,先确定待查找的结点属于哪一块,然后在块内查找结点。哈希表查找是通过对记录的关键字值进行运算,直接求出结点的地址,是关键字到地址的直接转换方法,不用反复比较。假设 f包含 n个结点,Ri 为其中某个结点(1in),keyi 是其关键字值,在 keyi与 Ri的地址之间建立某种函数关系,可以通过这个函数把关键字值转换成相应结点的地址,有:addr(Ri)=H(keyi),addr(Ri)为哈希函数。21.2 顺序查找 顺序查找过程:从表中的最后一个记录开始,逐个

7、进行记录的关键字与给定值进行比较,若某个记录的关键字与给定值相等,则查找成功,找到所查的记录;反之,若直到第一个记录,其关键字和给定值比较都不相等,则表明表中没有所查的记录,查找失败。算法描述为:int Search(int d,int a,int n) /*在数组 a中查找等于 D元素,若找到,则函数返回 d在数组中的位置,否则为0。其中 n为数组长度*/int i ;/*从后往前查找*/for(i=n-1;a!=d;-i) 此处程序正确吗?return i ;/*如果找不到,则 i为 0*/1.3 二分查找二分查找又称折半查找,它是一种效率较高的查找方法。1.3.1二分查找要求1)必 须采

8、用顺序存储结构。2)必须按关键字大小有序排列。1.3.2优缺点折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。31.3.3算法思想首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此 时查找不成功。1.3.4算法复杂度假设其数组长度为 n,其算法复杂度为 O(log(

9、n),下面提供一段二分查找实现的伪代码:BinarySearch(max,min,des)mid-des then 此处程序正确吗?max=mid-1elsemin=mid+1return max折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用 O(log n)完成搜索任务。它的基本思想是,将 n个元素分成个数大致相同的两半,取 an/2与欲查找的 x作比较,如果 x=an/2则找到 x,算法终止。如 果xan/2,则我们只要在数组 a的右 半部继续搜索 x。1.4 分块查找step1 先选取各块中的最大关键字构成一个索引表。step2 查找分两个部分

10、:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。1.4.1方法描述4将 n个数据元素“按块有序“划分为 m块(m n)。每一块中的结点不 必有序,但块与块之间必须“按块有序“;即第 1块中任一元素的关键字都必须小于第 2块中任一元素的关键字;而第 2块中任一元素又都必须小于第 3块中的任一元素,1.4.2操作步骤step1 先选取各块中的最大关键字构成一个索引表。step2 查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。1.5 哈希表查找1.5.1基本原理从此处开始至正文最后

11、一页的文字部分格式,按照如下格式设置:字体:正文宋体;字号:小四;段落中的格式为:正文:两端对齐;首行缩进:2字符;间距:段前段后均为:0 行;行距:1.5 倍行距。具体图示如下:代码部分请仔细检查正误。然后按照上述正文设置格式以及代码缩进格式调整。5我们使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数, 也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标)相对应,于是用这个数组单元来存储这个元素;也可以简单的理解为,按照关键字为每一个元素“分类“,然后将这个元素存储在相应“类“所对应的地方。但是,不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现

12、对于不同的元素,却计算出了相同的函数值,这样就产生了“冲突“,换句话说,就是把不同的元素分在了相同的“类“之中。后面我们将看到一种解决“冲突“的简便做法。总的来说,“直接定址“与“解决冲突“是哈希表的两大特点。1.5.2函数构造构造函数的常用方法(下面为了叙述简洁,设 h(k) 表示关键字为 k 的元素所对应的函数值):1) 除余法选择一个适当的正整数 p ,令 h(k ) = k mod p这里, p 如果选取的是比较大的素数,效果比较好。而且此法非常容易实现,因此是最常用的方法。2) 数字选择法如果关键字的位数比较多,超过长整型范围而无法直接运算,可以选择其中数字分布比较均匀的若干位,所组

13、成的新的值作为关键字或者直接作为函数值。1.5.3冲突处理线性重新散列技术易于实现且可以较好的达到目的。令数组元素个数为 S ,则当 h(k) 已经存储了元素的时候,依次探查 (h(k)+i) mod S , i=1,2,3 ,直到找到空的存储单元为止(或者从头到尾扫描一圈仍未发现空单元,这就是哈希表已经满了,发生了错误。当然这是可以通过扩大数组范围避免的)。1.5.4支持运算哈希表支持的运算主要有:初始化(makenull)、哈希函数值的运算(h(x)、插入元素(insert)、查找元素(member)。设插入的元素的关键字为 x ,A 为存储的数组。初始化比较容易,例如const empt

14、y=maxlongint; / 用非常大的整数代表这个位置没有存储元素p=9997; / 表的大小procedure makenull;6var i:integer;beginfor i:=0 to p-1 doA :=empty;End;哈希函数值的运算根据函数的不同而变化,例如除余法的一个例子:function h(x:longint):Integer;beginh:= x mod p;end;我们注意到,插入和查找首先都需要对这个元素定位,即如果这个元素若存在,它应该存储在什么位置,因此加入一个定位的函数 locatefunction locate(x:longint):integer;

15、var orig,i:integer;beginorig:=h(x);i:=0;while (ix)and(A(orig+i)mod Sempty) doinc(i);/当这个循环停下来时,要么找到一个空的存储单元,要么找到这个元/素存储的单元,要么表已经满了locate:=(orig+i) mod S;end;插入元素procedure insert(x:longint);var posi:integer;beginposi:=locate(x); /定位函数的返回值if Aposi=empty then Aposi:=xelse error; /error 即为发生了错误,当然这是可以避免的end;查找元素是否已经在表中procedure member(x:longint):boolean;var posi:integer;beginposi:=locate(x);if Aposi=x then member:=true

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 毕业论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报