数据结构查找算法课程设计_第1页
数据结构查找算法课程设计_第2页
数据结构查找算法课程设计_第3页
数据结构查找算法课程设计_第4页
数据结构查找算法课程设计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、存档编号: 西安*课程设计说明书设计题目:查找算法性能分析系别:计算机学院专业:计算机科学班级:计科*姓名:王*(共 页)2015年 01月07 日* 计算机科学 专业课程设计任务书姓名:*班级:计科*学号:*一、设计或实践题目查找算法性能分析二、内容及要求设计程序,对比分析顺序查找、折半查找、索引查找、二叉排序树查找和散列查找五种查找算法的性能1、测试数据的个数不少于50个;2、对每一种查找算法设计实现适应的存储结构;3、输出每种查找算法的查找成功时的平均长度三、完成形式1、设计报告;2、源程序四、系(部)审核意见指导教师:*发题日期:2015-01-05完成日期:2015-01-09一 需

2、求分析1. 1问题描述查找又称检索,是指在某种数据结构中找出满足给定条件的元素。查找是一种十分有用的操作。而查找也有内外之分,若整个查找过程只在内存中进行称为内查找;若查找过程中需要访问外存,则称为外查找,若在查找的同时对表做修改运算(插入或删除),则相应的表成为动态查找表,反之称为静态查找表。由于查找运算的主要运算是关键字的比较,所以通常把查找过程中对关键字的平均比较次数(也叫平均查找长度)作为一个查找算法效率优劣的标准。平均查找程度ASL定义为: ASL=PiCi(i从1到n)其中Pi代表查找第i个元素的概率,一般认为每个元素的查找概率相等,Ci代表找到第i个元素所需要比较的次数。查找算法

3、有顺序查找、折半查找、索引查找、二叉树查找和散列查找(又叫哈希查找),它们的性能各有千秋,对数据的存储结构要求也不同,譬如在顺序查找中对表的结果没有严格的要求,无论用顺序表或链式表存储元素都可以查找成功;折半查找要求则是需要顺序表;索引表则需要建立索引表;动态查找需要的树表查找则需要建立建立相应的二叉树链表;哈希查找相应的需要建立一个哈希表。1. 2基本要求(1) 输入的形式和输入值的范围;在设计查找算法性能分析的过程中,我们调用产生随机数函数: srand(int)time(0);产生N个随机数。注:折半查找中需要对产生的随机数进行排序,需要进行排序后再进行输入,N<50;(2) 输出

4、形式;查找算法分析过程中,只要对查找算法稍作修改就可以利用平均查找长度的公式: ASL=PiCi(i从1到n)输出各种查找算法的平均查找长度。注:平均查找长度=总的平均查找长度/N;(3) 程序所能达到的功能通过输出几种查找算法的ASL,我们很显然能得在数据量较小时(N<100)我们在实现静态查找时应该选择如何调用哪种查找算法。二 概要设计说明本程序中用到的所有抽象数据类型的定义。主程序的流程以及各程序模块之间的层次(调用)关系。1、 数据结构顺序查找:在进行顺序查找顺序表类型定时需要定义typedef int KeyType;顺序表类型为SeqList类型。 typedef NodeT

5、ype SeqList【MaxSize】;/它的基本思路是:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k相比较,若当前扫描到的关键字与k相等,查找成功。折半查找:在进行顺序查找顺序表类型定时需要定义typedef int KeyType,并且需要调用排序函数对其进行排序。折半查找类型为SeqList类型。 typedef NodeType SeqList【MaxSize】;折半查找又叫二分查找,效率较高,但折半查找要求被查找的表示顺序表,它的基本思路是:设R【low.high】是当前的查找区间,首先确定该区间的中点位置mid= (low+high)/2 ,然后将待查的k值与R

6、【mid】.key。 如果中点值的值是k,返回该元素的逻辑符号; 如果中点值>k,则中点值之后的数都大于k,所以k值在该表的左边,所以确定一个新的查找区间; 如果中点值<k,则中点值之后的数都小于k,k值在该表的右边,再在该表的右边确定一个新的查找区间; 依次循环。索引查找:/索引存储结构是在存储数据的同时还建立附加的索引表,索引表包括关键字和地址。索引表的数据类型 KeyType key、int link,link代表对应块的起始下标。typedef IdxType IDXMaxSize /索引表的类型分块查找又称索引顺序查找,它的性能介于顺序查找和折半查找之间的一种算法,它的分

7、块的思想是: 将表均分成b块,前b-1块中的关键字个数为s=n/b; 每一块的关键字不一定有序,但前一块中的最大关键字必须小于后一块中的最小关键字; 取各块中最大的关键字及该块在R中的起始位置。注:索引表是一个递增有序表 分块查找的基本思路是: 首先查找索引表,因为索引表是有序表,所以可以采用折半查找或者顺序查找,来确定待查元素在哪一块; 再已确定的块中进行顺序查找(因为块内元素无序,所以只能用顺序查找)列:设有一个线性表采用顺序存储,有20个元素,将其分成4(b=4)部分,每部分有5个元素(s=5),该索引表的存储结构如下图所示: 081142639014410534522106663415

8、85718LinkKey81993110401138125413661446157116781780188519100在如图所示的存储结构中,查找关键字k=80时,首先将k和索引表中个关键字比较,直到找到大于等于k的值,因此若关键字k=80存在则必定在第四块中,由IDX3.link找到起始地址15,从该地址开始在R【1519】中进行查找,直到找到关R【8】.key=k为止,如果查找不成功说明不存在关键字k=80。二叉树查找:线性表可以有三种查找法,其中折半查找的效率最高,但是折半查找要求元素时顺序表,而且不能用链式存储结构,因此有表的插入或删除操作时,需要移动大量元素,这时候二叉树查找的优势就

9、体现出来了。即动态查找时就需要用到链式存储结构。二叉排序树(BST)又称二叉查找树,其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: 若它的左孩子非空,则左子树上的所有元素的值均小于根元素的值; 若它的右孩子非空,则左子树上的所有元素的值均大于根元素的值; 左右子树本身是一颗二叉树。重要性质:中序遍历二叉排序树所得到中序序列是以一个递增有序序列。二叉排序树算法思想:它可以看做是一个有序表,所以在二叉树上查找,和折半查找类似,也是一个逐步缩小查找范围的过程,运用递归查找算法SearchBST()。哈希表查找:在用哈希表查找时先建立一个哈希表,哈希表主要用于快速查找,哈希表的查找过程和

10、建表过程类似。它的算法是: 设给定的值为k,根据建表时设定的散列函数h(k)计算哈希地址; 存储的个数为n,设置一个长度为M(M>n)的连续内存单元,以线性表中的每个对象Ki为自变量,通过h(k)把Ki映射为内存单元的地址,并把该对象存储字这个内存单元中。哈希函数的构造有直接定址法、除留余数法和数字分析法,常用的是除留余数法,它是用关键字k除以某个不大于哈希表长度m的数p,将所得到的余数作为哈希地址。除留余数法的哈希函数h(k): H(k)=K mod P(mod为取余运算,p<=m)2、 程序模块顺序查找:int SeqSearch(SeqList R,int n,KeyType

11、 k) /*函数的返回值是整型,有三个参数分别是顺序表SeqList、元素个数n和需要查找的关键字k*/int i=0;while (i<n && Ri.key!=k) /*从表头开始找*/i+;if(i>=n) /*未找到返回0/*return 0;elsereturn i+1; /*找到时返回逻辑符号i+1*/折半查找:int BinSearch(SeqList R,int n,KeyType k)/*函数的返回值是整型,有三个参数分别是顺序表SeqList、元素个数n和需要查找的关键字*/int low=0,high=n-1,mid;int count=0;w

12、hile(low<=high) /*当前区域存在元素时循环*/count+; /*每循环一次count+*/mid=(low+high)/2;if(Rmid.key=k) /*如果查找成功返回其逻辑序号mid+1*/return mid+1;if(Rmid.key>k) /*继续在R【lowmid-1】中查找*/high=mid-1;else /* 继续在R【mid+1high】中查找*/return count+1; /*返回的是总的平均查找长度*/索引查找:int IdxSearch(IDX I,int b,SeqList R,int n,KeyType k) /*索引查找函数

13、值返回的是整型,函数有五个参数,分别是索引表I、分的块数b、顺序表R、关键字个数和关键字*/int low=0,high=b-1,mid,i,count=0;int s=n/b; /*s为每块的元素个数,应为n/b的向上取整*/while(low<=high) /*索引表中进行折半查找、找到的位置为high+1*/count+;mid=(low+high)/2;if(Imid.key>=k)high=mid-1;elselow=mid+1;/* 应在索引表的high+1中,再在对应的线性表中进行顺序查找*/i=Ihigh+1.link;while(i<=Ihigh+1.lin

14、k+s-1&&Ri.key!=k)if(i<=Ihigh+1.link+s-1) /* 查找成功*/i+;count+;return count+1;int SearchBST(BSTNode *bt,KeyType k) /*二叉排序树查找函数的返回值是BSTNode类型,函数有两个参数分别是二叉排序树bt和关键字k*/if(bt=NULL|bt->key=k) /*递归的终结条件*/return 1;if(k < bt->key) return SearchBST(bt->lchild ,k) + 1; /*在左子树中的递归查找*/elsere

15、turn SearchBST(bt->rchild ,k) + 1; /*在右子树中的递归查找*/int SearchHT(HashTable ha,int p,KeyType k) /*哈希查找的返回值是整型有三个参数,分别是哈希表ha、小于哈希表长度的最小素数p和关键字k*/ int i=0,adr=0;int m=50;adr =k%p;while (haadr.key!=NULLKEY && haadr.key!=k) /*采用线性探查法查找下一个地址*/i+; adr =(adr+1)%m; /*adr=(adr+1)mod m*/if(haadr.key=k)

16、return i+1; /*查找成功*/elsereturn -1; /*查找失败*/3、 各模块之间的调用关系以及算法设计函数的调用关系图:MainSeqSearchBinSearchIdxSearchSearchHTSearchBSTCreateHTInsertHTCreateBSTInsertBST在主函数中需要定义一个SeqList R的顺序表;HashTable ha 哈希表;索引表IDX I。用srand函数(产生随机数)随机产生50个1到100的整数并输出,因为折半查找需要的是顺序表,所以再对产生的50个随机数再进行排序。调用SeqSearch、BinSearch、IdxSear

17、ch、SearchHT、SearchBST(CreateBST)。依次进行输出。注意:每次都要给sum重新赋值为零。三 详细设计#include<stdlib.h>#include<stdio.h>#include<time.h>#define MAXL 100#define MAXI 100#define NULLKEY -1#define DELKEY -2typedef int KeyType;typedef int InfoType;typedef structKeyType key;int link;IdxType;typedef IdxType

18、IDXMAXI; typedef structKeyType key;InfoType data;NodeType;typedef NodeType SeqListMAXL;typedef struct nodeKeyType key;InfoType data;struct node *lchild,*rchild;BSTNode;typedef structKeyType key;InfoType data;int count;HashTableMAXL;int SeqSearch(SeqList R,int n,KeyType k) /顺序查找int i=0;while(i<n &

19、amp;& Ri.key!=k)i+;return i+1;int BinSearch(SeqList R,int n,KeyType k) /折半查找int low=0,high=n-1,mid,count=0;while(low<=high)count+;mid=(low+high)/2;if(Rmid.key=k) return count+1;if(Rmid.key>k)high=mid-1;elselow=mid+1;return 0;int IdxSearch(IDX I,int b,SeqList R,int n,KeyType k) /索引查找int low

20、=0,high=b-1,mid,i;int count=0;int s=n/b;while(low<=high)count+;mid=(low+high)/2;if(Imid.key>=k)high=mid-1;elselow=mid+1;i=Ihigh+1.link;while(i<=Ihigh+1.link+s-1&&Ri.key!=k)count+;i+;if(i<=Ihigh+1.link+s-1)return count+1;else return 0;int SearchHT(HashTable ha,int p,KeyType k) /散列

21、查找 int i=0,adr=0;int m=50;adr =k%p;while (haadr.key!=NULLKEY && haadr.key!=k)i+; adr =(adr+1)%m;if(haadr.key=k)return i+1;elsereturn -1;void InsertHT(HashTable ha,int &n,KeyType k,int p) /哈希表的插入int i,adr;adr=k%p;if(haadr.key=NULLKEY|haadr.key=DELKEY)haadr.key=k;haadr.count=1;elsei=1;doad

22、r=(adr+1)%p;i+;while(haadr.key!=NULLKEY&&haadr.key!=DELKEY);haadr.key=k;haadr.count=i;n+;void CreateHT(HashTable ha,KeyType x,int n,int m,int p) /哈希表的创建int i,n1=0;for(i=0;i<m;i+)hai.key=NULLKEY;hai.count=0;for(i=0;i<n;i+)InsertHT(ha,n1,xi,p);int InsertBST(BSTNode * &p,KeyType k) /二

23、叉排序树的插入if(p=NULL)p=(BSTNode *)malloc(sizeof(BSTNode);p->key=k;p->lchild=p->rchild=NULL;return 1;else if(k=p->key)return 0;else if(k<p->key)return InsertBST(p->lchild,k);elsereturn InsertBST(p->rchild,k);BSTNode *CreateBST(KeyType a,int n) /二叉排序树的创建BSTNode *bt=NULL;int i=0;whi

24、le (i<n)InsertBST(bt,ai);i+;return bt;int SearchBST(BSTNode *bt,KeyType k) /二叉排序树查找if(bt=NULL|bt->key=k)return 1;if(k < bt->key) return SearchBST(bt->lchild ,k) + 1;elsereturn SearchBST(bt->rchild ,k) + 1;void main()SeqList R;int i;int e;int a;int b;HashTable ha;int T50;IDX I;doubl

25、e j,k,m,n,sum=0;srand(int)time(0);for(i=0;i<50;i+)Ri.key=1+(int)(50.0*rand()/(RAND_MAX+1.0);printf("%dt",Ri.key);printf("*n");for(i=0;i<50;i+) for(a=i+1;a<50;a+)if(Ri.key>Ra.key)e=Ri.key;Ri.key=Ra.key;Ra.key=e;for(i=0;i<50;i+)Ti=Ri.key;for(i=0;i<50;i+)sum=sum+Se

26、qSearch(R,50,Ri.key);printf("顺序查找平均查找长度:%6.2fn",sum/50.0);sum=0;for(i=0;i<50;i+)sum=sum+BinSearch(R,50,Ri.key);printf("折半查找平均查找长度:%6.2fn",sum/50.0);sum=0;for(i=0;i<5;i+)Ii.link=i*10;Ii.key=Ri*10+9.key;for(i=0;i<50;i+)sum=sum+IdxSearch(I,5,R,50,Ri.key);printf("索引查找平均

27、查找长度:%6.2fn",sum/50.0);sum=0;CreateHT(ha,b,50,53,53);for(i=0;i<50;i+)sum=sum+SearchHT(ha,53,hai.key);printf("哈希表查找平均查找长度:%6.2fn",sum/50.0);sum=0;for(i=0;i<50;i+)sum=sum+SearchBST(CreateBST(b,50),bi);printf("二叉树查找平均查找长度:%6.2fn",sum/50.0);四 测试与分析输出结果:结果分析: 由结果显然可以看出,在线性表存储结构中折半查找的效率最高

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论