ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:42.99KB ,
资源ID:6600423      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6600423.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构课程设计实验报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构课程设计实验报告.docx

1、数据结构课程设计实验报告课程设计实验报告 班级:10031101 学号:2011302645 姓名:王康 题目:单词(词组)检索现在有一个英文字典(每个单词都是由小写的a-z组成),单词量很大,达到100多万的单词,而且还有很多重复的单词。此外,我们现在还有一些 Document,每个Document 包含一些英语单词。 针对这个问题,请你选择合适的数据结构,组织这些数据,使时间复杂度和空间复杂度尽可能低,并且解决下面的问题和分析自己算法的时间复杂度。 1)基本型问题(必须采用字符串哈希,hash散列算法)(1)将所有的英文单词生成一个字典Dictionary。(2)给定一个单词,判断这个单词

2、是否在字典Dictionary中。如果在单词库中,输出这个单词总共出现的次数。否则输出NO。(3)输出Dictionary中出现次数最高的10个单词。(必须采用快速排序或堆排序算法)2)扩展型问题(可选择合适的数据结构)(4)给定一个单词,按字典序输出字典 Dictionary 中所有以这个单词为前缀的单词。例如,如果字典 T=a,aa, aaa, b, ba, 如果你输入 a,那么输出应该为a, aa, aaa。(5)给定一个单词,输出在Dictionary 中以这个单词为前缀的单词的出现频率最高的10个单词,对于具有相同出现次数的情况,按照最近(即最后)插入的单词优先级比较高的原则输出。对

3、于以下问题,需采用2种不同的数据结构(hash散列与Trie树,并针对以下题目,比较两种数据结构的优缺点。)3)高级型问题 (6)现在我们有一些Document,每个Document 由一些单词组成,现在的问题就是给你一个word,检索出哪些 Document包含这个word,输出这些Document的DocumentID(就如同搜索引擎一样,即输入一些关键字,然后检索出和这些关键字相关的文档)。(7)在第(6)问中,我们只考虑了一个word在哪些Document中的情况,我们进一步考虑2个相邻word的情况,检索出同时包含这两个相邻word的DocumentID。 4)挑战型问题 (8)现在

4、我们再对(7)的问题进行扩展,把(7)中的只检索相邻2个word推广到可以检索多个word(即连续的k个word,其中k=2),检索出同时包含k个连续word的DocumentID。 一、需求分析本演示程序中,Vocabulary 文件夹下的vocabulary.txt 是英文字典的数据总共有120 多万个单词,由此生成一个字典树。SearchWordInVocabulay 文件夹下对应的是问题(2)中的数据,其中SearchWordInVocabulary.txt 是要在字典中检索的数据,需要生成一个SearchWordInVocabulary_Result.txt 来保存检索的结果,其中结

5、果的格式为对于每个输入的Word,首先输出CASE ID: ID 表示这个Word 是输入的第ID 个WORD,然后如果这个Word 在字典中,输出这个Word 出现的次数,否则输出“NO”。 TotPrefixWord 文件夹下对应的是问题(3)中的数据,其中TotPrefixWord.txt 是要在字典中检索的前缀的数据,需要生成一个TotPrefixWord_Result.txt 文件来保存检索的结果,对于TotPrefixWord.txt 中的一个输入prefix,输出格式同样是先输出CASE ID:,然后按字典序输出字典中以prefix 为前缀的所有word(不能重复)。Prefix

6、Frequence 文件夹下对应的是问题(4)中的数据,其中PrefixFrequence.txt是要在字典中检索的前缀的数据,需要生成一个PrefixFrequence_Result.txt 文件来保存为检索的结果,对于PrefixFrequence.txt 中的一个输入prefix,输出格式同样是先输出CASE ID:,然后按(4)中定义的优先级输出字典中优先级最高的10 个以prefix 为前缀word 和这个word 出现的次数,如果不足10 个,就全部输出)。对于问题(5),需要生成一个MostFrequenceWord.txt 文件包含出现次数最多的10个单词和单词出现的次数。2.

7、演示程序以用户和计算机的对话方式执行,即在计算机终端上显示提示信息,告诉用户已完成那些题目。3.程序执行的命令包括:(1)构造哈希表;(2)查找单词出现的次数;(3)找出前缀相同的单词并输出;(4)找出前缀相同出现次数最多的十个单词;(5)找出字典中出现次数最多的十个单词;(6)结束。4.测试数据根据要求得出结果,由给的软件判断结果是否正确。2、概要设计本程序包括五个模块:(1)主程序模块;(2)构造哈希表模块;(3)查找单词模块;(4)查找前缀相同单词模块;(5)查找前缀相同出现次数最高的十个单词模块;(6)查找出现次数最多的十个单词模块;(7)模块调用图:主程序模块构造哈希表模块查找单词模

8、块查找前缀相同单词模块查找前缀相同出现次数最高的十个单词模块查找出现次数最多的十个单词模块3、详细设计1、数据结构定义#include#include#include#include#define MAX 100000/=typedef struct char * Pword;/存储的单词地址 int times;/单词出现的次数Data,*PData;/存储结构体 Data DicMAX;typedef struct char * Pword; int times;RedType;typedef struct RedType datasMAX; long int length;HeapTyp

9、e;HeapType heaps;typedef struct Trie_node_stru int count; /记录该处终结的单词个数 struct Trie_node_stru *next26;/指向各个子树的指针,下标0-25代表26字符 int tag; TrieNode, *Trie; 2、哈希表的创建unsigned int ELFHash(char *str) /* ELF Hash Function */ unsigned int hash = 0; unsigned int x =0; while(*str) hash = (*str+)+(hash24); hash =

10、 hash&(x); return(hash&0x7FFFFFFF)%39989);void CreatHT() int i; printf(初始化哈希表,请稍后.nn); for(i=0;iMAX;i+) Dici.times=0; Dici.Pword=0; printf(哈希表初始化完成n);int GetTimes(char ch,int i) if(n=ch|-1=ch) return i+1; else return i; 3、哈希表的初始化和建立 int Push_hash(char *word,unsigned int pos) int tag=0; unsigned int

11、i=pos; int j=0; if(Dicpos.times=0) Dicpos.Pword=word; Dicpos.times+; else if(Dicpos.times!=0) if(strcmp(Dicpos.Pword,word)=0) Dicpos.times+; tag=1; else pos=(pos+1)%MAX; tag=Push_hash(word, pos); return tag;int Read() FILE *fp; char ch=0; unsigned int POS=1; int i=0/*单词的下标*/; int TJ=0; printf(t开始构建哈

12、希表.n); printf(n请稍等n); if(!(fp=fopen(vocabulary.txt,r) printf(Cannot open the file.Creat_Hash_Listn); exit(0); while(!(feof(fp) char *Inf,tmp50=; int j=0; Inf=Allwords+i; do ch=fgetc(fp); TJ=GetTimes(ch,TJ); if(ch=n) tmpj=Allwordsi=0; else tmpj=Allwordsi=ch; i+; j+; while(ch!=n&!feof(fp); POS=ELFHash

13、(tmp); if(!feof(fp) if(Push_hash(Inf,POS) i=Inf-Allwords; else if(-1=*Inf) break; Push_hash(Inf,POS); break; /while TJ-; fclose(fp); printf(t哈希表构建over!n单词共有:%7d个(重复计数)nn,TJ);。 return 0;long int NoRepetition() int i; long int j=0; for(i=0;iMAX;i+) if(Dici.times!=0) j+; return j;4、创建字典void Search_Hash

14、() char a50; char tag; unsigned int poss; printf(请输入您要搜索的单词:); gets(a); poss=ELFHash(a); if(!strcmp(Dicposs.Pword,a) printf(查询到此单词!共出现%7d次n,Dicposs.times); else while(Dicposs.times&strcmp(Dicposs.Pword,a) poss+; if(!Dicposs.times) printf(查无此词!nn); else printf(查询到此单词!共出现%7d次n,Dicposs.times); printf(继

15、续查询?Y/N); scanf(%c,&tag); getchar(); if(tag=Y|tag=y) Search_Hash(); 5、最热的10个单词的查找void start_heap(long int longs) int i, j=1; printf(初始化堆.n); for(i=0;iMAX;i+) if(Dici.times) heaps.datasj.times=Dici.times; heaps.datasj.Pword=Dici.Pword; j+; heaps.length=longs; printf(堆初始化完成n); void HeapAdjust(HeapType

16、 &H, int s, int m) / 算法10.10 / 已知H.rs.m中记录的关键字除H.rs.key之外均满足堆的定义, / 本函数调整H.rs的关键字,使H.rs.m成为一个大顶堆 / (对其中记录的关键字而言) int j; RedType rc; rc = H.datass; for (j=2*s; j=m; j*=2) / 沿key较大的孩子结点向下筛选 if (jm & H.datasj.times= H.datasj.times) break; / rc应插入在位置s上 H.datass = H.datasj; s = j; H.datass = rc; / 插入 / H

17、eapAdjustvoid HeapSort(HeapType &H) / 算法10.11 / 对顺序表H进行堆排序。 int i; RedType temp; for (i=H.length/2; i0; -i) / 把H.r1.H.length建成大顶堆 HeapAdjust ( H, i, H.length ); for (i=H.length; i1; -i) temp=H.datasi; H.datasi=H.datas1; H.datas1=temp; / 将堆顶记录和当前未经排序子序列Hr1.i中 / 最后一个记录相互交换 HeapAdjust(H, 1, i-1); / 将H.

18、r1.i-1 重新调整为大顶堆 / HeapSortvoid PrintFQ(HeapType &H,long int total) FILE *out; long int i; if(out=fopen(MostFrequenceWord.txt,w)=NULL) printf(can not open filen); exit(0); for(i=total;itotal-10;i-) fprintf(out,%sn%dn,heaps.datasi.Pword,heaps.datasi.times); 四、程序使用说明及测试结果1.程序使用说明(1)本程序的运行环境为VC6.02.测试结果

19、根据所给的软件,测出所得文件正确3.调试中的错误及解决办法 (遇到时给出)4.运行界面由于文件内没有单词,暂时是这样。五、实验总结在这次程序的编写中,从来没有哪一次编程会用这么长的时间,刚开始就被题目的背景懵了,不知道从哪儿下手来写这个程序,后来一步步来,慢慢有了大体的框架,分布完成这个程序,首先花费了不少时间理解书上的算法,虽然有些挺难懂的,但是在空间和时间上都是很节约的算法。指向结构体的指针和指向字符型数据的指针的指针在一定程度上比较难理解。还有文件函数的应用很不熟悉,有些函数还是上网找的资料才会运用的,这次编程还有一个问题,就是自己虽然理解书本上的算法,可是自己不能独立写出来,这让我有点担心数据结构的考试,此次编程对我的启发是,以后要通过编程调试来做到对数据结构的深度了解。只有通过实际编程,调试,找到错误,才能去改正它,才能做到真正的懂得。这个程序的设计开始很不顺利,在实际编程过程中,许多问题都是我未曾预料到的,一些小的错误很难发现,得花大量的时间才能找到。因此我觉得,只把教材中的东西理解是远远不行的,必须在不断地编程中锻炼对数据结构的理解与应用,也只有不断训练,才能真正提高自己的编程能力。说实话,这两个星期对我的锻炼真的很大,我一直以为我的C语言学的还不错,这次课程设计不仅是对我编程能力极大的提高,更加增加了我对C语言的兴趣,最喜欢自己的程序编出来的那份喜悦。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1