查找次数的定量分析.docx
- 文档编号:28474471
- 上传时间:2023-07-14
- 格式:DOCX
- 页数:23
- 大小:568.64KB
查找次数的定量分析.docx
《查找次数的定量分析.docx》由会员分享,可在线阅读,更多相关《查找次数的定量分析.docx(23页珍藏版)》请在冰豆网上搜索。
查找次数的定量分析
学号:
课程设计
题目
查找次数的定量分析
学院
计算机科学与技术学院
专业
软件工程
班级
软件工程****班
姓名
***
指导教师
***
年
月
日
课程设计任务书
学生姓名:
专业班级:
指导教师:
工作单位:
计算机科学与技术学院
题目:
查找次数的定量分析
初始条件:
理论:
学习了《数据结构》课程,掌握了一种计算机高级语言。
实践:
计算机技术系实验中心提供计算机及软件开发环境。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1、系统应具备的功能:
(1)选择书中3~5个查找算法,对它们稍作修改,即在算法中插入关于查找比较次数的统计语句。
用修改后的查找算法对同一组数据分别进行查找,统计查找过程中的比较次数。
(2)至少分析5组数据。
每组数据由键盘输入或者随机函数产生。
2、数据结构设计;
3、主要算法设计;
4、编程及上机实现;
5、撰写课程设计报告,包括:
(1)设计题目;
(2)摘要和关键字(中文和英文);
(3)正文,包括引言、需求分析、数据结构设计、算法设计、有关技术的讨论、设计体会等;
(4)结束语;
(5)参考文献。
时间安排:
2012年1月2日-6日(第18周)
1月2日查阅资料
1月3日系统设计,数据结构设计,算法设计
1月4日-5日编程并上机调试
1月6日撰写报告
1月7日验收程序,提交设计报告书。
指导教师签名:
2012年1月2日
系主任(或责任教师)签名:
年月日
目录
摘要2
1引言4
2需求分析5
3数据结构设计6
3.1顺序查找6
3.2二分查找6
3.3二叉排序树6
3.4哈希查找7
4算法设计8
4.1顺序查找8
4.1.1查找过程分析8
4.1.2算法实现7
4.1.3运行结果9
4.2二分查找10
4.2.1查找过程分析10
4.2.2算法实现10
4.2.3运行结果12
4.3二叉排序树13
4.3.1查找过程分析13
4.3.2算法实现14
4.3.3运行结果16
4.5统计比较次数,分析结果20
5有关技术的讨论21
6设计体会22
结束语23
参考文献24
摘要:
我的课程设计是对四种查找算法的查找次数进行定量分析。
首先,要编写相对应的四种算法,然后,对四种算法随机地输入同一组数据,统计它们各自在查找过程中的比较次数,按此过程进行五组数据输入。
我选择的四种算法是顺序查找,二分查找,二叉排序树和哈希查找。
顺序查找,二分查找,哈希查找都采用数组存储,二叉排序树采用二叉链表存储。
最后,在各个已编好的原程序中加入用于统计比较次数的语句,并将比较次数输出。
关键词:
顺序查找,二分查找,二叉排序树,哈希查找,查找次数
Abstract:
Mycourseisdesignedtofindfourkindsofsearchalgorithmsforquantitativeanalysisofthenumberofsearch.First,Ineedtowritethecorrespondingfouralgorithms.Then,inputthesamesetofdatarandomlytothefouralgorithms.Gathertheirnumberofcomparisonsduringthesearchprocess.
Dothisprocessforinputtingfivesetsofdata.ThefouralgorithmsIchooseisare:
Sequentialsearch,Binarysearch,BinarysearchtreeandHashsearch.Sequentialsearch,BinarysearchandHashsearchalluseanarrayofstorage,butBinarysearchtreeusesbinaryliststored.Finally,addthestatementsforgatheringthenumberofsearchinalltheoriginalprogramandoutputthenumberofsearchcomparison.
Keywords:
Sequentialsearch,Binarysearch,Binarysearchtree,Hashsearch,thenumberofsearch.
1引言
程序由数据结构和算法组成,而数据结构包括数据的存储结构、逻辑结构和基本操作。
同一个问题可能可以选择多种存储结构,选择了恰当的存储结构,确定其逻辑关系,才会使我们的程序更简单易懂。
在决定好数据结构后算法的设计也非常关键,这关系着你程序的最终实现。
查找在数据结构中占了一定的地位,我们在很多程序实现中都要运用查找。
查找有多种算法,其存储结构也不完全相同。
各种查找算法有其各自的优缺点,我们最关心的是查找的时间复杂度,怎样查找最快。
本课程设计选择了四种查找算法(顺序查找,二分查找,二叉排序树,哈希查找),对其进行算法的实现,并统计各自比较次数。
2需求分析
(1)确定要选的四种算法;
(2)在《数据结构》书中找到各算法的存储结构;
(2)顺序查找的算法实现;
选择了以顺序表的存储结构,再次结构基础上进行查找算法编写。
(3)二分查找的算法实现;
二分查找的前提是顺序存储的有序序列,所以也选择顺序表存储,还要在最开始用简单的排序方法将其排成有序。
(4)二叉排序树的算法实现;
二叉排序树是在二叉链表存储结构上的操作,首先需建立一个二叉链表,查找其实也是二叉树的一种遍历。
(5)哈希查找的算法实现;
选择用顺序表存储后,用除留取余法构造哈希函数,将输入数据存储,查找过程中选用线性探测解决冲突,进行查找。
(6)四种算法的查找比较次数的统计;
在原有程序中合适位置加入统计比较次数的语句,统计查找过程中比较的次数。
(7)四个程序输入同一组数据;
四个程序都输入所需的10个数据。
(8)各自比较次数的输出;
每个程序在同一组数据中查找相同的关键字,输出比较次数。
(9)重复输入五组数据,每组各算法查找同一个数
(10)对最后一组数据输入一个不存在的数,统计并比较各算法查找不成功时的次数
3数据结构设计
3.1顺序存储的存储结构
typedefintElemtype;
typedefstruct
{
Elemtypeelem[20];//存储关键字的顺序表
intlength;//表长
}SStable;
intcount=1;//全局变量,统计比较次数
3.2二分查找的存储结构
typedefintElemtype;
typedefstruct
{
Elemtypeelem[20];//存储关键字的顺序表
intlength;//表长
}SStable;
intcount=0;//全局变量,统计比较次数
3.3二叉排序树的存储结构
typedefintElemtype;
typedefstructTnode
{
Elemtypegukey;//关键字
structTnode*lchild;//左孩子
structTnode*rchild;//右孩子
}Tnode;//二叉链表存储
intcount=0;//全局变量,统计比较次数
3.4哈希查找的存储结构
typedefintElemtype;
typedefstruct
{
Elemtype*elem;//存储关键字的顺序表
intlength;//关键字个数
}Hashtable;
intcount=0;//全局变量,统计比较次数
4算法设计
4.1顺序查找
4.1.1查找过程描述
a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a[length]
key
↑哨兵←↑
下表为0的位置存储要查找的关键字,作监视哨。
查找从下标为length的位置找起,逐渐向前,直至找到。
4.1.2算法实现
#include
typedefintElemtype;
intcount=1;
typedefstruct{
Elemtypeelem[20];
intlength;
}SStable;
intsearch(SStableS,Elemtypekey)//查找算法
{
inti;
S.elem[0]=key;//哨兵
for(i=S.length;S.elem[i]!
=key;i--)
count++;
returni;
}
voidmain()
{
SStableA;
A.length=10;
for(inti=1;i<11;i++)
cin>>A.elem[i];//数据的输入
inta;
cout<<"pleaseenteramenber:
";
cin>>a;
intb=search(A,a);
cout<<"It'sNo."<
cout<<"比较次数为:
"< } 4.1.3运行结果 第一组数据结果: 第二组数据结果: 第三组数据结果: 第四组数据结果: 第五组数据结果: 查找不成功时结果: 4.2二分查找 4.2.1查找过程描述 a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a[length] ↑↑↑ lowmidhigh 二叉排序树前提要求是对有序序列,顺序存储时的查找。 定义low,hign,mid“三个 指针”,当查找关键字小于mid下标位置的值,high指向mid的前一个;否则low指向 mid的下一个。 如此重复,直至查找成功。 4.2.2算法实现 #include typedefintElemtype; intcount=0; typedefstruct{ Elemtypeelem[20]; intlength; }SStable; intsearch(SStableA,Elemtypekey)//查找算法 { intlow,high,mid; low=1; high=A.length; while(low<=high) { count++; mid=(low+high)/2; if(A.elem[mid]==key)returnmid; elseif(A.elem[mid]>key)high=mid-1; elselow=mid+1; } return0; } voidBubblesort(ElemtypeR[],intn)//起泡排序 { for(inti=n,change=1;i>1&&change;i--)//i表示趟数,最多n-1趟 { change=0; for(intj=2;j<=i;j++) if(R[j] { inttemp=R[j]; R[j]=R[j-1]; R[j-1]=temp; change=1; } } } voidmain() { SStableA; A.length=10; for(inti=1;i<11;i++) cin>>A.elem[i]; Bubblesort(A.elem,A.length);//二分查找必须在有序的前提下,先 inta;//用起泡排序将原有数据排成有序 cout<<"pleaseenteramenber: "; cin>>a; intb=search(A,a); cout<<"It'sNo."< cout<<"比较次数为: "< } 4.2.3运行结果 第一组数据结果: 第二组数据结果: 第三组数据结果: 第四组数据结果: 第五组数据结果: 查找不成功时结果: 4.3二叉排序树 4.3.1查找过程描述 二叉排序树查找,首先用二叉链表将所有数据存储,第一个数据为头结点,后面的数据如果比第一个小,则在其左子树上;否则在右子树上,如此存完。 查找时,从头结点开始查找,比其小,在左子树上继续找;否则在右子树上找。 查找时运用递归算法。 4.3.2算法实现 #include staticintcount=0;//全局变量,统计比较次数 typedefstructTnode { intkey;//关键字 structTnode*lchild;//左孩子 structTnode*rchild;//右孩子 }Tnode;//二叉链表存储 Tnode*buildTree(Tnode*head,intnumber) { Tnode*p; p=newTnode; p->key=number; p->lchild=p->rchild=NULL; if(head==NULL) { returnp; } else { if(p->key head->lchild=buildTree(head->lchild,number); else head->rchild=buildTree(head->rchild,number); returnhead; } } Tnode*search(Tnode*head,intkey) { count++; if(head==NULL) returnNULL; if(head->key==key) returnhead; else { if(key search(head->lchild,key); else search(head->rchild,key); } } voidmain() { cout<<"pleaseenterallthenumber: "; Tnode*head=NULL; intnum; cin>>num; while(num! =-1) { head=buildTree(head,num); cin>>num; } cout<<"pleaseenterthenumbertobesearched: "; intn; cin>>n; search(head,n); cout<<"比较次数为: "< } 4.3.3运行结果 第一组数据结果: 第二组数据结果: 第三组数据结果: 第四组数据结果: 第五组数据结果: 查找不成功时结果: 4.4哈希查找 4.4.1查找过程描述 a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a[10] 哈希函数用除留取余法构造,用线性探测法解决冲突。 将输入的每个数据存储在以其除以11后余数未下表的位置,若该位置已存储,存储位置后移,对数组进行循环存储。 查找时,先从下标为其余数的位置找起,若不是,查找位置后移,但注意存储循环。 4.4.2算法实现 #include typedefintElemtype; typedefstruct { Elemtype*elem;//存储关键字的顺序表 intlength;//关键字个数 }Hashtable; intcount=0;//全局变量,统计比较次数 voidHash(ElemtypeR[],Elemtypex) { inti; i=x%11; while(R[i]! =0) i=(i+1)%11; R[i]=x; } voidHashsearch(HashtableS,Elemtypekey) { inti; i=key%11; while(key! =S.elem[i]) { count++; i=collision(i);//线性探测法解决冲突 if(count>11) { cout<<"查找不成功! "< break; } } cout<<"比较次数为: "< } voidmain() { HashtableA; A.elem=newint[11]; A.length=10; intnum; cout<<"pleaseenteranum: "< cin>>num; if(num! =-1) { Hash(A.elem,num); cin>>num; } cout<<"pleaseenteranumber: "; intk; cin>>k; Hashsearch(A,k); } 4.4.3运行结果 第一组数据结果: 第二组数据结果: 第三组数据结果: 第四组数据结果: 第五组数据结果: 4.5统计比较次数,分析结果 第一组数据各算法的比较次数为: 3,2,6,5 第二组数据各算法的比较次数为: 8,3,3,1 第三组数据各算法的比较次数为: 7,2,4,2 第四组数据各算法的比较次数为: 4,4,5,3 第五组数据各算法的比较次数为: 2,3,9,3 查找不成功时各算法比较次数为: 11,4,6,6 5有关技术的讨论 本课程设计,我主要实现顺序查找,二分查找,二叉排序树,哈希查找四个算法,比较它们在同一组数据的情况下查找过程中的比较次数。 所有程序都运用了一个全局变量以统计比较次数,将全局变量合理利用。 在顺序查找的算法中,本可以用线性链表和顺序表存储,但顺序表更为简单。 在顺序表的查找中将0下标位置作监视哨,避免了每次查找都要判断是否查找完毕。 在开始时将全局变量初始化为1,因为每次if语句运行都比较了一次,而当满足if条件后,实际也比较了一次,如若初始化为0,则少了最后的那一次比较,初始化为1才正确。 此算法中比较次数不管成功与否都能正确统计。 在二分查找的算法中,因为二分查找必须在有序的顺序存储的序列前提下,所以首先用起泡排序将输入数据排成有序序列。 low,high,mid三个“指针”的运用也很好。 此程序将各个作用不同的子程序分块使得主函数更明了。 此算法不管查找是否成功也都能统计。 在二叉排序树算法中,首先我需要知道如何建立一颗二叉树并加以条件成二叉排序树以存储输入数据。 二叉链表存储结构是有关树的最基本存储结构。 二叉排序树查找过程实际也是二叉树的遍历过程。 在哈希查找算法中,首先我需要构造一个哈希函数,选择比较简单的除留取余法 将数据处理并存储。 查找过程中,选择较通用的线性探测法,进行查找。 6设计体会 刚拿到这个题目时我感觉特没底,觉得题目很难,包含的内容很多,需要编好几个程序,不知如何下手。 但困难还是要自己一步一步去战胜,自己一点一点去克服。 我开始在书本的基础上慢慢地去构思程序,设计出算法。 在决定好去做后,我选择了顺序查找,二分查找,二叉排序树,哈希查找四种查找方法,这四种算法相对来说是我们比较熟悉的,课堂上了解得深一些。 在实现顺序查找时,我选择了顺序表做存储结构,相对地说数组比链表更容易操作(因为我不需要删除与插入)。 二分查找是必须要顺序存储,在将输入序列变为有序时,选择简单的起泡排序实现,二叉排序树则更进一步让我巩固了树方面的知识,二叉链表存储结构,二叉树的建立等等。 哈希表的实现则学到另一种逻辑结构---散列。 四个查找算法的实现,统计出同一组数据下的比较次数,也更让我了解各种算法的特色,什么情况用那种查找算法会更快的查找。 在实现这四个算法的过程中遇到很多问题,有时甚至会因此烦躁不已,但自己的问题需要自己去解决,这样才能有进一步的提高,在发现错误,改正错误的过程中去完善程序。 总之,这一次的程序设计虽然过程曲折但也真正的自己一个人去编写,运行程序,学到很多东西,体会到程序编写运行成功的喜悦。 结束语 这次课程设计,我终于完成了,内心无比喜悦。 在这个过程中我一步一步思考编写程序,在发现问题与解决问题的过程中提高。 四种查找算法的实现与比较,我更进一步深入体会查找过程和其各自的优缺点。 这次课程设计也让我懂得了理论与实际操作相结合的重要性。 只有书本,却没有自己去编完整的程序,永远不会发现自己在编程的时候会出现什么问题。 自己实际的动手对我们软件工程的学生来说是很重要的过程。 在以后的学习生活中我也会谨记这一条不变的真理。 参考文献 [1]严蔚敏吴伟民.《数据结构(C语言版)》[M]北京: 清华大学出版社,2008. [2]温秀梅,丁学钧.《VisualC++面向对象程序设计教程与实验》[M]北京: 清华大学出版社,2005. [3]ThomasH.Cormen,CharlesE.Leiserson,RonaldL.Rivest,Clifford.Introducti算法导论[M]潘金贵,顾铁龙等译.北京: 机械工业出版社,2006. [4]王晓东.计算机算法设计与分析[M].北京: 电子工业出版社,2002. [5]谭浩强.C语言程序设计(第四版)[M].北京: 清华大学出版社,2008 [6]屈婉玲,耿素云.离散数学[M].北京: 高等教育出版社,2004 [7]谭浩强.C++语言程序设计[M].北京: 清华大学出版社,2004
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 查找 次数 定量分析