软件工程第一次作业词频统计

一、写在前面

在此之前本人从未使用过c#来编写程序,但是既然老师提了这个要求,那就尽量完成。本计划花三天共计8小时来学习c#的基础知识,用一个晚上约4小时进行代码的编写工作,用另一个晚上进行调试,最后一个晚上进行优化。可是对于学渣来说,一周之内完成这项任务好像有点不太现实,更何况还有一些别的事干扰,结果导致到时间没有完成计划。还好老师把时间节点往后延了一周,才能完成这次作业。

二、计划的具体实施

关于刚才说到的计划,现在具体说一下。关于代码实现这块,计划用一个小时实现文件的查找与打开,一个小时实现分词,一个小时实现排序,一个小时实现扩展功能。但是实际实施的过程中文件的查找和打开用时较短,大概30分钟;分词和排序花费的时间较多,有个2个半小时;扩展功能的实现还是请教了别的同学。又一次感到自己怎么这么渣。。。

三、关于代码优化

其实在代码的实现过程中,就参考了一些学长的博客,也请教了班里的几位大神。他们告诉我了一些算法,这些算法的效率都很高,我就不在这里赘述了。第一次写完程序,并成功运行后,一个140K的文件跑完要20s左右。。。其实可以优化的地方很多,比如排序算法我是用的基本的冒泡排序,效率很低。当然也考虑过List.Sort(),但是因为该排序是快排,而由于我的算法设计的问题,快排会导致一些错误的出现,因此只好放弃。我只在一些小地方进行了一些改进。比如比较两个单词是否相同的算法,其中有一句:

1 if (aword.Length != bword.Length)
2     return 1;
3 else
4     return string.CompareOrdinal(aword, bword);

可以将长度不等的单词滤除,可节省一定的时间。

但这就是杯水车薪啊。我看了学长的博客,提到了hash什么的,但是我完全看不懂。。。于是我就做了性能测试,想从这里找到突破口,结果又一次被打击。完全不知道从哪里下手!后来请教了一些大牛,但为时已晚,想要优化就要把整个程序的架构重写,这显然不现实。因此只好作罢。花了差不多一个晚上考虑优化的问题,结果倍受打击,没有什么实质性的结果。

这里贴上最后的性能测试结果,可以看出确实比优化之前快一点。

                       

四、关于测试用例

先用一些规模小的文件来验证程序的正确性,再用规模较大的文件来测试性能。比如前期,在一个文件中只输入三个单词:File、file、FILE,以此来验证排序的正确性。最后做测试的文件是31000字,140K的一个txt文件。我请同学也用该文件进行测试,结果是一致的。

 

五、收获与感想

最大的收获就是用c#写出了一个完整的程序,并体验了代码优化的过程。当然,还有学到了一些大牛的算法,也算是锻炼了自己的代码实践能力。最令我感触深的一点就是,优化程序真的是一件很令人头疼的事。但是这也提醒我在设计算法的时候也应把时间空间复杂度考虑一下,以免造成不必要的麻烦。

 

posted @ 2013-09-25 00:55  VforVincent  阅读(222)  评论(0编辑  收藏  举报