Individual Project - Word_frequency

0x00 预先准备和时间规划

  1.因为要用到visual studio 2013,准备学习C#,预计一天时间能基本使用。

  3.了解需求并设计基本数据结构与大致流程  20min

  2.根据提议实现simple mode  30min

  3.扩展simple mode的功能完成extend mode  1h

0x01 实际用时和实现过程

  1.关于C#的学习,看了一下基本模式和C++、Java差不多,而且在写代码的过程中能更快地熟悉语言,实际只准备了20分钟就提刀上阵了。

  2.了解需求并了解需求并设计基本数据结构与大致流程。

      1) 需求分析很快,核心功能是字符串的处理,词频统计,其中需要注意的是大小写的处理、排序、单词长度和单词的模式("^[a-zA-z][0-9]*");

      2)最开始面临的问题是文件的递归扫描,利用如下代码即可得到所有满足要求的文件名称。

Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".txt") || s.EndsWith(".cpp") || s.EndsWith(".h") || s.EndsWith(".cs"));

      3)接下来是字符串的处理,词频统计这一功能是很容易实现的,利用容器Dictionary来存储键值对即可。由于要处理大小写,这里用到了两个Dictionary。

static Dictionary<string, int> wordtable = new Dictionary<string, int>();
static Dictionary<string, string> word = new Dictionary<string, string>();

      4)其中wordtable的key是单词的小写形式,value是频度;word的key是单词的小写形式,value是优先级最高的单词形式,(如word["file"] = "File"; wordtable["file"] = 1;),再考虑到排序是先value在key,即可完成simple mode;

      5)对于extend mode,字符串处理的方法是先从文件中得到形如“word1 wrod2 ... wordn”形式的长字符串,再对这个字符串不断匹配符合要求的“word1 word2”(或“word1 word2 word3”)形式的字符串,把它当作wordtable中的key,其他方法和simple mode中的一样。

      整个过程,大概花了7h左右的时间,主要是C#语言许多方法不熟悉,以及在编程过程中遇到了许多技术问题。其中,为了高效地完成匹配,在正则表达式的学习上就花了不少时间,还有从Simple mode到extend mode的过程中进行了许多尝试、debug。

0x10性能分析及代码优化

  1.Word_frequency.exe D:\test   316ms

  2.Word_frequency.exe -e2 D:\test  475ms

  3.Word_frequency.exe -e3 D:\test  559ms

  由此可见,程序运行的性能主要取决于正则匹配的性能,三次测试时间的变化主要源于匹配的单词的复杂度的提升,但这方面是没有跟多优化空间的,颗星的提升性能的办法就是采用多线程,同时对多个文件进行处理,可以有效减少程序运行时间,牺牲部分内存提升性能。

0x11事后诸葛亮总结

  1) 万万没想到,终于还是在deadlin前完成了。这次作业虽然完成了全部的功能,但从程序性能还是自己代码风格,都没做到很好。C#才接触,多线程实现有心无力,虽然对于少量文件来说没什么影响,但在大量文件测试线表现平平;代码中有很多可以复用的代码段,但我可耻得选择了ctrl C+V,使得代码冗余度很高,希望在下一次项目中能尽量避免。

  2)项目过程中的不足:

     .对于常用类、方法的认识严重不足,查找一个参数都花了很长世间;

     .在码代码的过程中老是想着有现成的方法可以用,算法思想都去哪了?!

     .还是没写出多线程。。。

  3) 收获还是不小,c#使用熟练度上上升了好几个百分点,也终于学到了听起来很厉害的正则表达式,对程序测试的大致流程也有了较多了解。

      

时间: 2024-10-21 23:44:50

Individual Project - Word_frequency的相关文章

Scrutiny of Partner&#39;s individual project Code

因为队友的代码并没有完整的实现个人项目的完整功能. 已实现功能: 1.对单个单词进行词频统计 2.能够按照老师的要求的格式对制定的有效字符串进行匹配,并且输出至指定文件. 未实现: 1.对连续多个单词进行匹配以及计数 2.对已存储的单词进行排序输出. 代码优点: 1.逻辑严谨 2.格式规范优美 代码缺点: 1.注释较少,代码可读性差,建议在较难或者核心的代码语句或者函数部分配上详细注释或者为程序本神配上文档 2.模块责任分割不均,模块之间功能有少许重复. 3.使用c++进行工程项目,却并没有使用

Individual Project Records

At the midnight of September 20, I finished my individual projcet -- a word frequency program. You can find requirements in details at http://www.cnblogs.com/jiel/p/3978727.html Before beginning coding, I suppose I can finfish it in about 4 hours or

SoftwareEngineering Individual Project - Word frequency program

说实话前面c#实在没怎么学过.这次写起来感觉非常陌生,就连怎么引用名空间都忘记了.在经过恶补后还是慢慢地适应了. 1.项目预计用时: 构建并写出大概的数据结构,程序框架及模块: 30min 实现文件夹递归方问方法 :30min 实现从文件中读出符合要求的单词并统计 :2-3h 实现对单词的排序 : 1h 输出:10min 细节修改及错误排查:2-3h 程序优化: 1h 2.项目的实际用时: 构建并写出大概的数据结构,程序框架及模块: 30min 实现文件夹递归方问方法 :30min 实现从文件中

Individual Project - Word frequency program

1.做这个项目之前,因为之前在OO课中做过一些项目,这钟算法也非常熟悉,因此算上单纯的词法算法,和C#语言中文件操作的学习,预计一天之内应该可以写好.2.实际上做起来时,我发现c#与之前学过的java还是有些差别的,算法非常简单,但是学习使用c#花了许多时间,零零碎碎共做了2天. 3.原本一直认为程序的最大资源使用会是单词按词频排序,但是经过算法的分析,还是单词+空格+单词这种格式的判断比较耗费时间 我的算法是这样的:读入一个文本文件的所有字符,以一个字符串形式储存.从头到尾遍历字符串,认为大小

Individual Project复审

复审代码的来源:12061162 王骜 王骜同学的代码注释较多,读起来还是比较容易懂. 代码遵从模块化思想,各个模块之间分工明确,功能重复少,模块之间联系紧密,相互调用明确. 处理单词过程运用了正则表达式,方便快捷,减少了编码的工作量. 诸如此类做的比较好的地方还有不少,在此就不一一列举,下面提几点还可以改进的地方. 1. 在程序中,还有一小部分变量的命名可以给出完整英文描述,使其更有意义,可读性更好,就像类和函数的命名一样,让阅读者一看就知道其功能作用. (多数变量名称可读性还是比较好的) i

软件工程:Individual Project - Word frequency program

千辛万苦敲完了这个项目的代码,说实话真的没想到会花费这么多的时间,在现实的强烈对比下才发现自己真的是图样图森破. 1.预计用时 因为上个学期的OO课做过类似的程序,想一想觉得再做一遍so easy,于是感觉心理有谱,预计用4个小时搞定,再用最多1个小时做测试. 2.现实的残酷性 前3个小时是用来干杂务的(写宏函数,建树,写小函数,对命令行情况的分类讨论,设计整个项目的结构), 再有3个小时是找各种资料的(文件流,模板库,string类,还有忘得差不多了的二叉树遍历), 再一个3个小时是用来敲代码

Individual Project - Word frequency program by HJB

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks; using System.Collections;namespace ConsoleApplication1{ class v { public int n { get;

个人项目 Individual Project

一.题目简介 目前的计算机日历程序,比较典型的是Windows各版本中的日历程序以及基于该程序所开发的各种应用程序中的日历程序.然而,这些程序都是千篇一律的局限于一个很短的时间内.但是,很多情况下,特别是在众多的科学领域中,一个时间跨度比较大的程序是有参考价值的.Java程序设计语言充分发挥了其自身无与伦比的优越性,用极短的程序文本就弥补了这一领域的空白. 万年历作为日常中的一种小工具,它具有多方面的小功能,主要在日期的显示上给人以直观的表达效果,在日期的查询上方便简洁,还有就是在某些节日的提醒

Individual Project &quot;写一个能自动生成小学四则运算题目的程序&quot;

一.题目简介 写一个能自动生成小学四则运算题目的程序. 初步拟定要实现的功能后,估计一下自己需要花多长时间.编程过程中记录自己实际用了多长时间. 然后和同学们比较一下各自程序的功能.实现方法的异同等等. 二.源码的github链接 https://github.com/gaino1/IndividualProject 三.所设计的模块测试用例.测试结果截图 四.问题及解决方案.心得体会 要想学好C语言,要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自