实验五:查找算法应用

上传人:无*** 文档编号:85650410 上传时间:2022-05-06 格式:DOC 页数:21 大小:268.50KB
收藏 版权申诉 举报 下载
实验五:查找算法应用_第1页
第1页 / 共21页
实验五:查找算法应用_第2页
第2页 / 共21页
实验五:查找算法应用_第3页
第3页 / 共21页
资源描述:

《实验五:查找算法应用》由会员分享,可在线阅读,更多相关《实验五:查找算法应用(21页珍藏版)》请在装配图网上搜索。

1、word实验报告学院(系)名称:计算机与通信工程学院* *学号* *专业计算机科学与技术班级2015级*班实验项目实验五: 查找算法应用 课程名称数据结构与算法课程代码0661013实验时间年 月 日第节实验地点7-*考核标准实验过程25分程序运行20分回答问题15分实验报告30分特色功能5分考勤违纪情况5分成绩成绩栏其它批改意见: 教师签字:考核容评价在实验课堂中的表现,包括实验态度、编写程序过程等容等。功能完善, 功能不全有小错无法运行正确基本正确有提示无法回答完整较完整一般容极少无报告有无有无一、实验目的实验目的:理解二叉排序树、AVL 树的查找、插入、删除、建立算法的思想及程序实现;掌

2、握散列存储结构的思想,能选择合适散列函数,实现不同冲突处理方法的散列表的查找、建立。能运用所学查找结构与算法等解决实际问题。二、实验题目与要求1.折半查找算法 1)问题描述:从键盘读入一串整数和一个待查关键字,查找在该整数串中是否有这个待查关键 字。如果有,输出它在整数串中的位置;如果没有,输出-1 2)实验要求: 利用折半查找算法查找 用递归和非递归两种方式实现折半查找算法 3) 实现提示: 递归实现参考书上折半查找算法的实现 非递归算法利用栈实现 2.构造二叉排序树,并进行中序遍历(实验类型:综合型) 1)问题描述:从键盘读入一串整数构造一棵二叉排序树,并对得到的二叉排序树进行中序遍历,

3、得到有序序列。 2)实验要求:该二叉排序树以二叉链表存储 3)实现提示:二叉排序树的构成,可从空的二叉树开始,每输入一个结点数据,就建立一个新 结点插入到当前已生成的二叉排序树中,所以它的主要操作是二叉排序树插入运算。在二叉排序树 中插入新结点,只要保证插入后仍符合二叉排序树的定义即可。 3哈希表查找 1)问题描述:针对某个集体的“人名”构造哈希表,解决按“人名”进行查找的索引结构。 2)实验要求:要求表的平均查找长度不超过 R(R 可以从键盘输入确定),完成相应的建表和 查表程序。 4. 拼写检查 1)问题描述:现在有一些英语单词需要做拼写检查,你的工具是一本词典。需要检查的单词, 有的是词

4、典中的单词,有的与词典中的单词相似,你的任务是发现这两种情况。单词 A 与单词 B 相 似的情况有三种: 删除单词 A 的一个字母后得到单词 B; 用任意一个字母替换单词 A 的一个字母后得到单词 B; 在单词 A 的任意位置增加一个字母后得到单词 B。 2)实验要求:发现词典中与给定单词相同或相似的单词。 实验过程与实验结果应包括如下主要容: 数据结构定义 数表的查找方法通常适用于动态集合。动态集合的特点是集合结构本身在查找过程中动态生成,即对于给定值k,若集合中存在关键字等于k的记录,则查找成功,否则插入关键字为k的新记录。 二叉排序树,又叫二叉查找树或二叉搜索树。它或者是一棵空树,或者是

5、一棵具有如下特征的非空二叉树: 1)若它的左子树非空,则左子树上所有节点的关键字均小于根节点的关键字。 2)若它的右子树非空,则右子树上所有节点的关键字均大于根节点的关键字。 3)左、右子树也分别是二叉排序树。 平衡二叉树的定义是:若一棵二叉排序树中每个节点的左、右子树的高度之差的绝对值不超过1,则称这样的二叉排序树为平衡二叉树。 算法设计思路简介 1、 数据有序,用折半查找法,通过即可快速找到关键字。 2、 二叉树表实际上就是个二叉树,就像建立一个普通的二叉树一样建立树,只是在插入节点的时候要和当前节点的值比较,若当前节点为空则插入当前节点;否则,若小于当前值则插入左子树大于当前节点就插入右

6、子树。对建立好的树进行中序遍历即可得到有序序列。 3、 人的姓一般有很大可能性相同,但是人名的第二个字一般是不同的,既然人名示例是拼音形式姑且认为第二个字母即为第二个字。将其ASCLL码模49作为哈希函数,将各人名分类存在不同的链表中,提高查询效率。 算法描述:可以用自然语言、伪代码或流程图等方式4、以单词中字母的数目为标准将单词分类,若字母数想等或相差一则进行细致的比较(下面有详细描述),否则根本不相似。1、开始输入ai,keyi = 1,2,3,nlow = 1,high = nmid = (low+high)/2mid = key?=high = mid-1k amid?是 否low =

7、 mid+1low = high?是 否return midreturn -1输出mid输出-1结束2、(1)创建普通二叉树节点。(2)输入要插入的值k。(3)将k插入二叉树节点中,若当前节点为空则申请节点空间并将k存入当前节点的data域中,令其左右子树均为空;若当前节点不为空且k小于当前节点的data值,则将k存入当前节点的左子树中去,若当前节点不为空且k大于当前节点的data值,则将k存入当前节点的右子树中去。(4)中序遍历此二叉树。3、 (1)录入人名。 (2)以人名的第二个字母的ASCLL码模49(所用数组空间为50),得到的数作为下标,将此人名存入相应的邻接表中。 (3)输入待查人

8、名。 (4)以人名的第二个字母的ASCLL码模49得到的数字为下标找到相应的链表,若链表为空则表明待查人名不在中,输出0;若不为空,则与链表中的每一个名字做比较,入股在下标对应的整个链表中都找不到此名字则说明待查人名不在中,输出0,否则表明待查人名在中,输出1。4、(1)输入单词列表并存入字典中。(2)输入待查单词。(3)将待查单词和字典中的每个单词做比较。(3)计算字典中单词列表中每个单词的长度和待查单词的长度。分三种情况: 若字典中单词的长度等于待查单词的长度,将字典中单词的每个字母和待查单词的每个字母做比较,若相同的字母数和单词长度相同则说明两单词完全相同,若或比人名长度少一则说明两单词

9、只有一个字母不同属于替换一个字母就相同的情况。两种情况均打印1.若字典中的单词长度等于待查单词长度减一,将字典中单词的每个字母和待查单词的每个字母作比较,若相同字母数为字典中单词的长度,则说明待查单词与字典中的单词相似,只是多了一个字母,打印1.若字典中单词长度等于待查单词长度加一,将字典中的每个字母和待查单词的每个字母作比较,若相同字母数为字典中单词长度减一,则说明待查单词与字典中的单词相似,只是少了一个字母,打印1.其余情况均不相似,打印0. 算法的实现和测试结果:包括算法运行时的输入、输出,实验中出现的问题及解决办法等 1、 2、 3、 4、 算法时间复杂度分析 1、 O(log2n).

10、 2、 最差情况(单枝树)O(n) 一般情况O(log2n) 3、 O(1) 4、 O(mn) m:字典中的单词数 n:待查单词数四、收获与体会之前只知道查找这回事,以为以现在计算机的性能查找已经变得很方便了。跟戴老师学习了查找之后才发现大数据的可怕,无论多少条记录我们都希望在几秒完成。那么在短时间计算机性能无法大幅度提高的前提下就要考虑查找的算法了(其实就算计算机性能再好,优化算法也能提高查找效率)。顺序查找肯定是不学都会,折半查找之前也听说过,如何让查找表变得有序也是让人头疼的事。就说这个散列查找,竟然能达到O(1)阶的查找效率,真让人感叹人类的智慧了。做完了图那章的实验,感觉这次实验简单

11、多了。数据结构真的是越来越有趣了,慢慢感受到了编程的魅力。五、源代码清单 1、#includeusingnamespace std;int binarysearch(intarray,int Key,int N)int low = 1;int high = N;int mid;while(low = high)mid = (low+high)/2;/cout mid: mid endl;if(arraymid = Key) return mid;elseif(Key n;cin key;for(int i = 1;i ai;result = binarysearch(a,key,n);cout

12、 result;return 0;2、#includeusingnamespace std;int count = 0;int N = 0;typedefstruct BitNodeint data;struct BitNode *lchild,*rchild;BitNode,*BitTree;void insert(BitTree &T,int k)if(T = NULL)T = (BitNode*)malloc(sizeof(BitNode);T-data = k;T-lchild = T-rchild = NULL;elseif(k data) insert(T-lchild,k);el

13、seif(k T-data) insert(T-rchild,k);elseif(k = T-data) insert(T-lchild,k);void InOrder(BitNode *T) if(T = NULL) return;InOrder(T-lchild);cout data;count+;/cout N = N endl;/cout count = count endl;if(count N)cout rchild);int main()BitNode *root;root = NULL;int a20 = 0;for(int j = 0;j aj;N+;if(aj = -1)N

14、-;break;int i = 0;while(ai != -1)insert(root,ai);i+;/cout haha endl;InOrder(root);count = 0;N = 0;return 0;3、#include#includeusingnamespace std;typedefstruct Hashchar data50;struct Hash *next;Hash;typedefstructint data;struct Hash *next;FirstHash30;int main()int n,q;int counts;cin n;cin q;char name5

15、050;char checkname5050;FirstHash *h;h = (FirstHash*)malloc(sizeof(FirstHash50);for(int i = 0;i data = i;hi-next = NULL;for(int i = 0;i namei;/cout namei1 = namei1 endl;counts = (int)namei1 % 49;/cout counts = counts data,namei);/cout data: data next = hcounts-next;hcounts-next = hash;/以?上?程序没?问题afor

16、(int i = 0;i checknamei;for(int i = 0;i next = NULL)cout 0 next;while(temp!= NULL & strcmp(temp-data,checknamei) != 0)temp = temp-next;if(temp = NULL)cout 0 endl;elsecout 1 endl;return 0;4、#includeusing namespace std;char Dic5050;char Check5050;int getLength(char array)/得到单词的长度 int i = 0;while(array

17、i != 0)i+;return i;int research(char array1,char array2)/字典,待查词汇 ,字典中的某个单词与某个待查单词是否相似 int count1 = 0;int count2 = 0;int simble = 0;count1 = getLength(array1);count2 = getLength(array2);/cout count1 = count1 endl;/cout count2 = count2 endl;if(count1 = count2)/单词长度相等,替换任一字母 simble = 0;int i = 0;while(

18、i = count1-1)return 1;elsereturn 0;else if(count1 = count2-1)/比字典长度长1 simble = 0;int i = 0,j = 0;while(j count2 & i = count1)return 1;elsereturn 0; else if(count1 = count2+1)/比字典长度短1 int i = 0,j = 0;simble = 0;while(i count1 & j = count1-1)return 1;elsereturn 0;elsereturn 0;int main()int n = 0;/字典中的单词数量 int q = 0;/待查单词数量 int count = 0;/字典中的单词与某个待查单词相似的数目 cin n;cin q;for(int i = 0;i Dici;for(int j = 0;j Checkj;for(int i = 0;i q;i+)/将i号待查单词与字典中的每一个单词进行比较 count = 0;for(int j = 0;j n;j+)count += research(Dicj,Checki);if(count = 0)cout 0 endl;elsecout 1 endl;return 0;21 / 21

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!