1.做这个项目之前,因为之前在OO课中做过一些项目,这钟算法也非常熟悉,因此算上单纯的词法算法,和C#语言中文件操作的学习,预计一天之内应该可以写好。
2.实际上做起来时,我发现c#与之前学过的java还是有些差别的,算法非常简单,但是学习使用c#花了许多时间,零零碎碎共做了2天。
3.原本一直认为程序的最大资源使用会是单词按词频排序,但是经过算法的分析,还是单词+空格+单词这种格式的判断比较耗费时间
我的算法是这样的:读入一个文本文件的所有字符,以一个字符串形式储存。从头到尾遍历字符串,认为大小写字母和数字都是“字符”,其他都是分隔符,这样整个字符串就是这样的形式:
字符+分隔符+字符+分隔符+...
将所有字符按顺序存储于一个数组中,将所有分隔符也储存在一个数组中。
这样第i个分隔符的左右两个字符就是第i个字符和第i+1个字符(若i+1还在字符数组的范围内)
字符并不是等同于要求中的单词,需要经过检查。
建立单词类,由一个字符串“单词” 和一个整形数“数量”组成。
功能1:新建单词数组,从前往后遍历字符数组,有符合单词的条件的字符就加入数组。数组在加入单词时检查这个单词(无视大小写)是否存在过,若不存在新加单词,若存在则数量加1并更新这个单词的大小写。然后数组按单词词频排序,数量相等的单词按名称字典序升序排序。
功能2:新建“双单词”数组,遍历分隔符数组,若分隔符是单个空格,则检查这个分隔符两旁的字符是否都是单词(若越界则不检查),若都是单词,将这个“左单词”+“ ”+“右单词”
的字符串加入“双单词”数组中,处理方法同功能1,输出词频前10位。
功能3:新建“三单词”数组,遍历分隔符数组,若连续两个分隔符都是单个空格,则检查这两个分隔符附近的三个字符是否都是单词(若越界则不检查),若都是单词,将这个“左单词”+“ ”+“中单词”+“ ”+“右单词”的字符串加入“三单词”数组中,处理方法同功能1,输出词频前10位。
4.测试用例:共取了纽约时报上的10篇文章,有些位于测试文件目录下,有些位于测试文件目录中的文件目录下
与我的队友一起测试,将取得的结果进行对比。
5.要提高程序效率,一个好的算法非常重要,这少不了编程前的细致分析。另外,我注意到,我写的程序的可移植性很差,整体来看功能是可以的,但是内部几个部分的编程风格还是十分粘滞,我写其他程序时经常要把已经写过的功能再写一遍。这并不是什么好习惯,我在以后的编程过程中一定会注意。