1、(7)在第(6)问中,我们只考虑了一个word在哪些Document中的情况,我们进一步考虑2个相邻word的情况,检索出同时包含这两个相邻word的DocumentID。4)挑战型问题 (8)现在我们再对(7)的问题进行扩展,把(7)中的只检索相邻2个word推广到可以检索多个word(即连续的k个word,其中k=2),检索出同时包含k个连续word的DocumentID。 一、需求分析本演示程序中,Vocabulary 文件夹下的vocabulary.txt 是英文字典的数据总共有120 多万个单词,由此生成一个字典树。SearchWordInVocabulay 文件夹下对应的是问题(2
2、)中的数据,其中SearchWordInVocabulary.txt 是要在字典中检索的数据,需要生成一个SearchWordInVocabulary_Result.txt 来保存检索的结果,其中结果的格式为对于每个输入的Word,首先输出CASE ID: ID 表示这个Word 是输入的第ID 个WORD,然后如果这个Word 在字典中,输出这个Word 出现的次数,否则输出“NO”。 TotPrefixWord 文件夹下对应的是问题(3)中的数据,其中TotPrefixWord.txt 是要在字典中检索的前缀的数据,需要生成一个TotPrefixWord_Result.txt 文件来保存检
3、索的结果,对于TotPrefixWord.txt 中的一个输入prefix,输出格式同样是先输出CASE ID:,然后按字典序输出字典中以prefix 为前缀的所有word(不能重复)。PrefixFrequence 文件夹下对应的是问题(4)中的数据,其中PrefixFrequence.txt是要在字典中检索的前缀的数据,需要生成一个PrefixFrequence_Result.txt 文件来保存为检索的结果,对于PrefixFrequence.txt 中的一个输入prefix,输出格式同样是先输出CASE ID:,然后按(4)中定义的优先级输出字典中优先级最高的10 个以prefix 为前
4、缀word 和这个word 出现的次数,如果不足10 个,就全部输出)。对于问题(5),需要生成一个MostFrequenceWord.txt 文件包含出现次数最多的10个单词和单词出现的次数。2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示提示信息,告诉用户已完成那些题目。3.程序执行的命令包括:(1)构造哈希表;(2)查找单词出现的次数;(3)找出前缀相同的单词并输出;(4)找出前缀相同出现次数最多的十个单词;(5)找出字典中出现次数最多的十个单词;(6)结束。4.测试数据根据要求得出结果,由给的软件判断结果是否正确。2、概要设计本程序包括五个模块:(1)主程序模块;(2)构
5、造哈希表模块;(3)查找单词模块;(4)查找前缀相同单词模块;(5)查找前缀相同出现次数最高的十个单词模块;(6)查找出现次数最多的十个单词模块;(7)模块调用图:主程序模块构造哈希表模块查找单词模块查找前缀相同单词模块查找前缀相同出现次数最高的十个单词模块查找出现次数最多的十个单词模块3、详细设计1、数据结构定义#includestring.hstdlib.hmalloc.h#define MAX 100000/=typedef struct char * Pword;/存储的单词地址 int times;/单词出现的次数Data,*PData;/存储结构体 Data DicMAX;RedT
6、ype; RedType datasMAX; long int length;HeapType;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;
7、 while(*str) hash = (*str+)+(hash24); hash = hash&(x); return(hash&0x7FFFFFFF)%39989);void CreatHT() int i; printf(初始化哈希表,请稍后.nn); for(i=0;iMAX;i+) Dici.times=0; Dici.Pword=0; 哈希表初始化完成nint GetTimes(char ch,int i) if(n=ch|-1=ch) return i+1; else return i;3、哈希表的初始化和建立 int Push_hash(char *word,unsigned
8、 int pos) int tag=0; unsigned int i=pos; int j=0; if(Dicpos.times=0) Dicpos.Pword=word; Dicpos.times+; 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/*单词的
9、下标*/; int TJ=0;t开始构建哈希表.nn请稍等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= tmpj=Allwordsi=0 else tmpj=Allwordsi=ch; i+; j+; while(ch!=&!feof(fp); POS=ELFH
10、ash(tmp); if(!feof(fp) if(Push_hash(Inf,POS) i=Inf-Allwords; if(-1=*Inf) break; Push_hash(Inf,POS); break; /while TJ-; fclose(fp);t哈希表构建over!n单词共有:%7d个(重复计数)nn,TJ);。 return 0;long int NoRepetition() long int j=0; if(Dici.times! return j;4、创建字典void Search_Hash() char a50; char tag; unsigned int poss;
11、请输入您要搜索的单词: gets(a); poss=ELFHash(a);strcmp(Dicposs.Pword,a)查询到此单词!共出现%7d次n,Dicposs.times); else while(Dicposs.times& poss+;Dicposs.times) printf(查无此词!nn继续查询?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;初始化堆.n if(Dici.times) heap
12、s.datasj.times=Dici.times; heaps.datasj.Pword=Dici.Pword; heaps.length=longs;堆初始化完成nvoid HeapAdjust(HeapType &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 (
13、jm & H.datasj.times= H.datasj.times) break; / rc应插入在位置s上 H.datass = H.datasj; s = j; H.datass = rc; / 插入 / HeapAdjustvoid HeapSort(HeapType &H) / 算法10.11 / 对顺序表H进行堆排序。 RedType temp; for (i=H.length/2; i0; -i) / 把H.r1.H.length建成大顶堆 HeapAdjust ( H, i, H.length ); for (i=H.length;1; -i) temp=H.datasi;
14、H.datasi=H.datas1; H.datas1=temp; / 将堆顶记录和当前未经排序子序列Hr1.i中 / 最后一个记录相互交换 HeapAdjust(H, 1, i-1); / 将H.r1.i-1 重新调整为大顶堆 / HeapSortvoid PrintFQ(HeapType &H,long int total) FILE *out; long int i; if(out=fopen(MostFrequenceWord.txtw)=NULL)can not open filen for(i=total;itotal-10;i-) fprintf(out,%sn%dn,heaps
15、.datasi.Pword,heaps.datasi.times);四、程序使用说明及测试结果1.程序使用说明(1)本程序的运行环境为VC6.02.测试结果根据所给的软件,测出所得文件正确3.调试中的错误及解决办法 (遇到时给出)4.运行界面由于文件内没有单词,暂时是这样。五、实验总结在这次程序的编写中,从来没有哪一次编程会用这么长的时间,刚开始就被题目的背景懵了,不知道从哪儿下手来写这个程序,后来一步步来,慢慢有了大体的框架,分布完成这个程序,首先花费了不少时间理解书上的算法,虽然有些挺难懂的,但是在空间和时间上都是很节约的算法。指向结构体的指针和指向字符型数据的指针的指针在一定程度上比较难
16、理解。还有文件函数的应用很不熟悉,有些函数还是上网找的资料才会运用的,这次编程还有一个问题,就是自己虽然理解书本上的算法,可是自己不能独立写出来,这让我有点担心数据结构的考试,此次编程对我的启发是,以后要通过编程调试来做到对数据结构的深度了解。只有通过实际编程,调试,找到错误,才能去改正它,才能做到真正的懂得。这个程序的设计开始很不顺利,在实际编程过程中,许多问题都是我未曾预料到的,一些小的错误很难发现,得花大量的时间才能找到。因此我觉得,只把教材中的东西理解是远远不行的,必须在不断地编程中锻炼对数据结构的理解与应用,也只有不断训练,才能真正提高自己的编程能力。说实话,这两个星期对我的锻炼真的很大,我一直以为我的C语言学的还不错,这次课程设计不仅是对我编程能力极大的提高,更加增加了我对C语言的兴趣,最喜欢自己的程序编出来的那份喜悦。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1