【软件工程】Word frequency program
一、开始写代码前的规划:
1、尝试用C#来写,之前没有学过C#,对于C++也不熟,所以打算先花1天的时间学习C#
2、整个程序基本分为文件遍历、单词提取、单词匹配、排序、输出几个模块,各个模块大致时间如下:
- 文件遍历,这个应该就是个递归,应该不会太花时间,加上查阅资料,预计最多半个小时
- 单词提取,用正则表达式应该挺简单的,5分钟
- 单词匹配,这个对我来说才是最难的,怎么样保证两个模式下的匹配正确,而且匹配的时候不区分大小写,输出要分大小写,还要同时记录出现次数……先给3个小时
- 排序,自己写个快排和插入,20分钟吧
- 输出,到了这儿就全部结束了,一个循环输出就全部结束了,这个时间就忽略了
3、调试以及优化,这个比较难预计,估计半天到一天吧。
其实除了这些时间,对于我这种反应比较慢的人,最开始还要想想程序的逻辑结构,简单写下整体的算法,这个预计要花半个小时。
总共预计:两天半
二、实际用时:
- 学习C#:总的加起来大概用了1天。
- 程序逻辑结构设计20分钟左右。
- 文件遍历,这个我看的书上有现成代码,我只改了很小部分,用了20分钟左右。
- 单词提取:正则表达式不熟练,导致写出来的匹配老有问题,花了我一个小时……
- 单词匹配:用C#中的Dictionary,轻松了不少,但是Dictionary不可修改,而且要是要直接找key的话只能遍历所有的keys,这个比较纠结,最后大概用2个小时。
- 排序:本来想捡便宜,用C#中的ArrayList sort(),但是用了发现并不是按ascii排序,自己写快排,30分钟。
- 调试以及优化,前面编的没什么问题,调试的时候遇到的问题也比较轻松的解决了,代码优化花了比较多的时间,而且有时候用自己想的方法优化发现比不优化前还差,总共用大概2个小时吧。
总共用时:30小时。
三、性能优化
从一开始写代码,我尽量用自己想到的效率最快的方法完成。第一次写完后根据性能分析报告再找优化方法花了我两个小时左右的时间。
测试数据(大概11MB的文本文件,除了1个文件是我自己为了测试结果的正确性编的数据,其他的全都是.txt的英语小说):
1、优化前性能分析结果:
从分析报告看,String.ToLower()和Dictionary的key值判断对性能影响较大,所以我就自己写了一个将大写转换成小写的函数lower(),而仔细看代码,很多地方是可以不用进行大小写转换的,最后尽量减少大小写的转换。
另外一个就是Dctionary的优化,很多同学都说hash表很快,而C#中正好用hashTable,但是后来我查阅了些资料,还是坚持用Dictionary,理由如下:
- 在不指定Capacity的时候数据量较少时,hashtable的插入性能确实比dictionary高,但在其他情况下,dictionary的性能基本都高于hashtable。
- Dic是类型安全的,这有助于我们写出更健壮更具可读性的代码,而且省却我们强制转化的麻烦。
- Dic是泛行的,当K或V是值类型时,其速度远远超过Hashtable。(我其中的v就是)
- 如果K和V都是引用类型,如eaglet所测,Hashtable比Dic更快(参看文章http://www.cnblogs.com/lucifer1982/archive/2008/06/18/1224319.html)
除了这两个我就没想到还能从哪能比较好的优化代码了,后来添添补补对代码循环内的一些定义和变量进行了更改,但是影响好像不大。
2、优化后的分析报告:
四、测试用例:
- 空文件夹
- 空文本文件
- 在simple模式下测试分词结果,文本文件包含不符合单词规则的字符串(1)
- 在simple模式下测试分词结果,文本文件包含不符合单词规则的字符串(2)
- 在simple模式下测试词频统计,文本文件包含多个相同单词(完全相同和仅大小写有区别)
- 在simple模式下测试词频统计,文本文件包含多个相同单词(完全相同和仅大小写有区别)
- 在extend模式下测试仅单词最末数字不同的情况
- 在extend模式下完整测试文件中有特殊符号、单词大小写不同、单词末尾数字不同等特殊情况
- 在simple模式下对大文件进行性能测试
- 在extend模式下对大文件进行性能测试
五、学习与收获
其实程序写完后发现,并不是很难,之前觉得比较困难,主要还是自己对C#不熟悉,这是我写的第一个C#程序,总的来说对C#有了一个基本的了解,包括基本语法、文件处理、字符串处理、键值对、哈希表、以及正则表达式。
简单记录下现在我还有较深印象的3点,都是些看起来不起眼的问题,但是是我遇到的最大障碍,这些东西以后应该还用得着:
1、C#中Dictionary是不能更改的,但可以删了重新添加,如果一定要进行更新,可以再设一个Dictinary进行同步更新。
2、正则表达式中,零宽度正回顾后发断言(?<=exp),断言自身出现的位置的前面能匹配表达式exp。但是像这次的程序中如果仅仅这样考虑是不行的,如果直接用
- (?<=[^A-Za-z0-9])[A-Za-z]{4}[A-Za-z0-9]*
进行单词匹配,会导致每行的第一个单词不能匹配,因为它前面没有其他字符了!一个解决办法是每次在读取一行后在行首添加个空格(insert不会改变原来的字符串的,需要设一个临时变量!)
3、C#中可以用TrimEnd去掉字符串末尾指定的字符(串),如去掉s后的1234
- char[] inte = { '', '', '', '', '', '', '', '', '', '' };
- string s = "abcd1234";
- string result = s.TrimEnd(inte);
【软件工程】Word frequency program的更多相关文章
- 关于软件工程个人作业 Word frequency program 的总结
一.预计花在程序各部分的时间: (1)对所给命令行参数的判断和处理,看它是否合法.是哪种模式.预计用时20min; (2)关于目录操作:遍历给定目录下的所有文件,包括子目录和非目录文件.预计用时40m ...
- 软件工程个人项目-Word frequency program by11061167龚少波
(一)工程设计时间预计 1.代码编写:4小时 熟悉Visual studio 2012的使用 : 程序代码部分主要分为三个步骤: (1)主函数的构建,包括各种函数调用及输入输出部分: (2)对目标文件 ...
- 软件工程个人项目--Word frequency program
(一)工程设计时间预计 1.代码编写:2小时 (1)文件夹的遍历以及筛选: (2)文件夹的读取,以及对读取字符的操作: (3)所得结果排序,以及文件输出. 2.程序调试:1小时 (1)编写数据. (2 ...
- Individual Project - Word frequency program by HJB
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;us ...
- Limeng:Individual Project: Word frequency program -BUAA Advanced Software Engineering
11061190-李孟 Implement a console application to tally the frequency of words under a directory (2 mod ...
- Individual Project - Word frequency program - Multi Thread And Optimization
作业说明详见:http://www.cnblogs.com/jiel/p/3978727.html 一.开始写代码前的规划: 1.尝试用C#来写,之前没有学过C#,所以打算先花1天的时间学习C# 2. ...
- Individual Project - Word frequency program——12061154Joy
Description&Requirement: http://www.cnblogs.com/jiel/p/3978727.html 项目时间估计 理解项目要求: 1h 构建项目逻辑: 1h ...
- Individual Project - Word frequency program
1.项目预计用时 -计划学习C#和百度一些用法的时间:5小时 -项目本身打算写两个类,一个是遍历搜索文件夹的,另外一个用来统计单词.计划用时:5小时 2.项目实际用时 学习C#以及正则表达式的用法:3 ...
- Record for Individual Project ( Word frequency program )
1. 预计时间 ● 对问题总体的理解.规划:10 min ● 设计编写程序:5 h ● 调试: 分模块-40 min; 总体-40min ● 测试(性能分析).改进:1 h 2. 实际用时 ● 对 ...
随机推荐
- URAL 1057 Amount of Degrees (数位DP,入门)
题意: 求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K个互不相等的,B的整数次幂之和.例如,设X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足了要求: 17 = 24+2 ...
- 【UML】对象图Object diagram(转)
http://blog.csdn.net/sds15732622190/article/details/48894751 前言 今天要说的是UML中的对象图.他与类图,合作图都有关系,是类图的实例化. ...
- tpcc-mysql 实践
一.TPCC 介绍 TPC:全称Transaction Processing Performance Council (事务处理性能委员会),是一家非盈利性组织,该组织制定各种商业应用的基准测试规范, ...
- FreeRTOS_事件标志组
FreeRTOS事件标志组 事件标志组简介 1. 事件位(事件标志) 事件位用于表明某个事件是否发生,事件位通常用作事件标志,比如下面的几个例子: 当收到一条消息并且把这条消息处理掉以后就可以将某个位 ...
- Java的引用StrongReference、 SoftReference、 WeakReference 、PhantomReference
1. Strong Reference StrongReference 是 Java 的默认引用实现, 它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收 @Te ...
- stm32F042 (二) 按键触发中断
已经实现GPIO口输出高低电平控制LED,这里实现按键触发中断来改变LED闪亮的频率,因为PB3连着LED,所以PB3的输出模式没有改变,随意选一个GPIO口PA7接按键产生中断.因为nucleo开发 ...
- Eclipse+Tomcat搭建jsp服务器
首先,安装java sdk 环境,这里就不多说了,附上java sdk的下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk ...
- mount命令的用法,以及技巧光盘镜像文件、移动硬盘及U盘的方法
本文介绍mount命令的用法,以及技巧光盘镜像文件.移动硬盘及U盘的方法. 一,挂接命令(mount) 挂接(mount)命令的使用方法. 命令格式: 复制代码 代码如下: mount [-t vfs ...
- centos7无法切换startx
centos光盘安装后,显示命令行模式,通过startx无法进入图形界面? 解决方法:1.使用yum grouplist查看,根据显示的结果采用不同的界面格式,我用的是 yum groupinstal ...
- python入门:UTF-8转换成GBK编码
#!/usr/bin/env python # -*- coding:utf-8 -*- #UTF-8转换成GBK编码 #temp(临时雇员,译音:泰坡) #decode(编码,译音:迪口德) #en ...