1 项目概述
1.1 项目目标和主要内容
建立一个文本文件,统计给定单词在文本文件中出现的总次数及位置
1.2 项目的具体要求
- 文本文件中每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写,统计给定单词在文本文件中出现的总次数,检索输出的某个单词出现在文本中的行号、在该行中出现的位置。
- 设计数据量大的文本,进行子串的查询处理,分析算法运行的时间效率,对所有输出的匹配位置结果进行验证,以证明算法设计和实现的正确性。
- 用朴素模式匹配算法或KMP算法实现字符串定位;
- 可正确读取,保存文本;
2 项目设计
2.1 开发环境
编程语言:java
编译环境:JDK1.11
开发工具:IntelliJ IDEA 2019
2.2 数据结构设计
逻辑结构设计:集合
存储结构设计:数组
3 KMP算法理解
由于之前并没有接触过KMP算法,因此首先对KMP算法进行了学习与理解。
KMP算法的核心是PMT,PMT是一个被称为部分匹配表的数组,PMT中的值是字符串前缀集合和后缀集合交集中最长元素的长度。
也就是说,在KMP算法进行的过程中,字符串在进行匹配时,当出现失配时,根据此时PMT的值,可以得知目前已匹配成功的字符中的后几个与字符串的前几个相同,因此这几个可以省略重复匹配。
即假如在j位失配,影响j指针回溯位置的是j-1位的PMT值。因此,为了编程方便,在编程时不直接使用PMT数组,而是将PMT数组后移一位,这个数组称为next数组。同样的理由,为了编程方便,将PMT数组后移后,第0位的值就设置为-1。
求next数组的过程可以看成是字符串匹配的过程。即以模式字符串为主字符串,以模式字符串的前缀为目标字符串,一旦字符串匹配成功,那么当前next值就是匹配成功的字符串的长度。也就是从模式字符串的第一位开始对自身进行匹配,注意不包括第0位,这时,在任一位置,能够匹配的最长长度就是当前位置的next值。