文本文件单词的检索与计数(实验准备)
一、实验内容
• 文本文件中每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写,统计给定单词在文本文件中出现的总次数,检索输出的某个单词出现在文本中的行号、在该行中出现的位置。
• 设计数据量大的文本,进行子串的查询处理,分析算法运行的时间效率,对所有输出的匹配位置结果进行验证,以证明算法设计和实现的正确性。
• 用朴素模式匹配算法或KMP算法实现字符串定位;
• 可正确读取,保存文本;
二编程语言
C++
三、项目设计思路
- 朴素模式匹配算法
1)概念简述
子串定位运算,在主串中找出子串出现的位置。
在串匹配中,将主串 S 称为目标(串),子串 T 称为模式(串)。如果在主串 S 中能够找到子串 T, 则称匹配成功,返回 第一个 和 子串 T 中 第一个字符 相等 的 字符 在主串 S 中的 序号,否则,称匹配失败,返回 0。
2)算法步骤
假设我们要从主串s="goodgoogle"找到t="google"这个子串的位置,我们需要下列步骤
1、主串s的第1位开始,s与t前三个字符都匹配成功,第四个字符不匹配(竖线表示相等,闪电状弯折表示不想等)
2、主串s的第2位开始,匹配失败
3、主串s的第3位开始,匹配失败
4、主串s的第4位开始,匹配失败
5、主串s的第5位开始,s与t,6个字符全部匹配成功
对主串的每一个字符作子串开头,要与匹配的字符串进行匹配。对主串作大循环,每一个字符开头作t长度的小循环,直到匹配成功或者全部遍历完为止。
2、设计功能的实现
2.1朴素的模式匹配算法
算法思路:对于主串的每一个字符作为子串的开头,与要匹配的字符串进行匹配,对主串做最大的循环,每个字符开头都做子串长度的小循环,直到匹配成功或者全部遍历完成为止。
更具体地说:设有三个指针i,j,k,用i指示主串S每次开始比较的位置;指
针 j,k分别指示主串S和模式串T中当前正在等待比较的字符位置;一开始从主串S的第一个字符(i=0;j=1)和模式T的第一个字符(k=0)比较,若相等,则继续逐个比较后续字符(j++,k++)。否则从主串的下一个字符(i++)起再重新和模式串(j=0)的字符开始比较。依此类推,直到模式T中的所有字符都比较完,而且一直相等,则称匹配成功,并返回位置 i;否则返回-1,表示匹配失败。
2.2给定单词的计数
该功能需要用到前一节中设计的模式匹配算法,逐行扫描文本文件。匹配一个,计数器加1,直到整个文件扫描结束;然后输出单词出现的次数。
其实现过程如下:
(1)输入要检索的文本文件名,打开相应的文件;
(2)输入要检索统计的单词;
(3)循环读文本文件,读入一行,将其送入定义好的串中,并求该串的实际长度,调用串匹配函数进行计数。具体描述如下:While (不是文件结束)读入一行并到串中;求出串长度;模式匹配函数计数;
(4)关闭文件,输出统计结果。
2.3检索单词在文本文件中行号、次数及其位置
这个设计要求与上一个类似,但要相对复杂一些。其实现过程描述如下:
(1)输入要检索的文本文件名,打开相应的文件;
(2)输入要检索统计的单词;
(3)行计数器置初值0;(4)while(不是文件结束){读入一行到指定串中;求出串长度;行单词计数器置0;调用模式匹配函数匹配单词定位、该行匹配单词计数;行号计数器加1;If(行单词计数器!=0)输出行号、该行有匹配单词的个数以及相应的位置;