好
文学助手研究
[问题描述]文学研究人员需要统计某篇英文小说某些形容词出现次数与位置。试写一个实现这一目标的文字统计系统,称为“文学研究助手”。
[基本要求]英文小说存在于一个文本文件中。待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就会全部完成。程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计。
[测试数据]以你的C源程序模拟英文小说,C语言的保留字集作为待统计的词汇集。
[实现提示]约定小说中的词汇一律不跨行。这样,每读入一行,就统计每个词在这行中的出现次数。出现位置所在行的行号可以用链表存储。若某行中出现了不止一次,不必存多个相同的行号。
如果读者希望达到选作部分(1)和(2)所提出的要求,则首先应把KMP算法改写成如下的等价形式,再把它推广到多个模式的情形。
i=1;j=1;
while(i=!s.curlen+1&&j!=t.curlen+1){
while(j!=0&&s.h[I]!=t.ch[j]j=next[j];
//j==0或s.ch[I]==t.ch[j]
j++;I++;//每次进入循环体,I 只增加一次}
[选作内容]
(1)模式匹配要基于KMP算法。
(2)整个统计过程中只对小说文字扫描一遍以提高效率。
(3)假设小说中的每个单词或者从首行开始,或者前置一个空格符。利用单词匹配特点另写一个高效的统计程序,与KMP算法统计程序进行效率比较。
(4)推广到更一般的模式集匹配问题,并设待查模式串可以跨行(提示:定义操作GetAChar)。