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#使用熟练度上上升了好几个百分点,也终于学到了听起来很厉害的正则表达式,对程序测试的大致流程也有了较多了解。

      

Individual Project - Word_frequency的更多相关文章

  1. Individual Project - Word frequency program-11061171-MaoYu

    BUAA Advanced Software Engineering Project:  Individual Project - Word frequency program Ryan Mao (毛 ...

  2. Note: SE Class's Individual Project

    虽然第一个Project还有点小问题需要修改,但是大体已经差不多了,先把blog记在这里,算是开博第一篇吧! 1.项目预计的用时 本来看到这个题的时候想的并不多,但是看了老师的要求才觉得如此麻烦ORZ ...

  3. Individual Project Records

    At the midnight of September 20, I finished my individual projcet -- a word frequency program. You c ...

  4. 《软件工程》individual project开发小记(一)

    今天周四没有想去上的课,早八点到中午11点半,下午吃完饭后稍微完善了一下,目前代码可以在dev c++和vs2012上正常运行,性能分析我看资料上一大坨,考虑到目前状态不太好,脑袋转不动了,决定先放一 ...

  5. SoftwareEngineering Individual Project - Word frequency program

    说实话前面c#实在没怎么学过.这次写起来感觉非常陌生,就连怎么引用名空间都忘记了.在经过恶补后还是慢慢地适应了. 1.项目预计用时: 构建并写出大概的数据结构,程序框架及模块: 30min 实现文件夹 ...

  6. Individual Project - Word frequency program

    1.项目预计用时 -计划学习C#和百度一些用法的时间:5小时 -项目本身打算写两个类,一个是遍历搜索文件夹的,另外一个用来统计单词.计划用时:5小时 2.项目实际用时 学习C#以及正则表达式的用法:3 ...

  7. Individual Project - Word frequency program - Multi Thread And Optimization

    作业说明详见:http://www.cnblogs.com/jiel/p/3978727.html 一.开始写代码前的规划: 1.尝试用C#来写,之前没有学过C#,所以打算先花1天的时间学习C# 2. ...

  8. 1415-2个人项目Individual Project

    作业要求: 个人独立完成,实践PSP相关知识. 时 间: 两周. (本来截止4月30日,考虑到刚迁移平台,延缓至5月7日) 实践目标: Github基本源代码控制方法 利用Junit4进行程序模块的测 ...

  9. Project: Individual Project - Word frequency program----11061192zmx

    Description & Requirements http://www.cnblogs.com/jiel/p/3311400.html 项目时间估计 理解项目要求: 1小时 构建项目逻辑: ...

随机推荐

  1. Hadoop2.7.6_05_mapreduce-Yarn

    1. MAPREDUCE原理 Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架: Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认 ...

  2. ping 127.0.0.1和ping本地ip分别测试什么?

    ping 127.0.0.1 是你本地的回环地址! 实际上只要是127.0.0.1到127.255.255.255都是回环地址!都是可以PING检查的! 它能ping通,说明你的TCP/IP协议栈没问 ...

  3. cpu的控制单元与语言中的控制逻辑有没有关系?

    cpu的控制单元与语言中的控制逻辑有没有关系?

  4. Java没有头文件的原因

    http://bbs.csdn.net/topics/100134244 C/C++ 之所以需要头文件(.h),有两个用处,一个是在开发编译的时候,在各个编译单元(Compile Unit)之间共享同 ...

  5. pku1365 Prime Land (数论,合数分解模板)

    题意:给你一个个数对a, b 表示ab这样的每个数相乘的一个数n,求n-1的质数因子并且每个指数因子k所对应的次数 h. 先把合数分解模板乖乖放上: ; ans != ; ++i) { ) { num ...

  6. 转载 锁机制与原子操作 <第四篇>

    一.线程同步中的一些概念 1.1临界区(共享区)的概念 在多线程的环境中,可能需要共同使用一些公共资源,这些资源可能是变量,方法逻辑段等等,这些被多个线程共用的区域统称为临界区(共享区),临界区的资源 ...

  7. MATLAB的两种移位运算

    MATLAB的两种移位运算: 1)circshift矩阵移位 circshift:循环移位数组 语法:B = circshift(A,shiftize) 说明: B  = circshift(A,sh ...

  8. 六大主流开源SQL引擎

    导读 本文涵盖了6个开源领导者:Hive.Impala.Spark SQL.Drill.HAWQ 以及Presto,还加上Calcite.Kylin.Phoenix.Tajo 和Trafodion.以 ...

  9. Html5 标签二(超链接)

    1.五种超链接形式 2.超链接属性 一 五种超链接 <!DOCTYPE html> <html lang="en"> <head> <me ...

  10. 一、java虚拟机内存区域

    内存区域 java虚拟机在java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.java虚拟机规范将JVM管理的内存分为:程序计数器.本地方法栈.Java虚拟机栈.方法区.Java堆.如下 ...