weiyun

补发:Word Frequency总结

Word Frequency作业主要分为几个步骤

1.读取所有文件的内容

2.正确分词

3.排序并输出

为了节省时间,所以我用的都是.net自带的功能,看了一些同学的方法发现各部分的数据结构和实现方法

数据结构:

Hash:用Dictionary,插入删除查找速度快,需要最后手动排序。

平衡树:SortedDictionary,自动排序,但插入删除查找操作比较费时。

 

其他:KeyedCollection,类似Dictionary。

 

读取文件内容:

方法1:.net的Directory的GetFiles,参数使用所有子目录,一步获取所有文件,然后再判断扩展名,判断扩展名可用字符串函数或正则表达式

优点:方法简单,实现比较容易

缺点:GetFiles函数实现有问题,在遇到系统目录中的一些特殊情况会出现异常(如权限不足和指向上级目录的链接文件)

 

方法2:.net的Directory的GetFiles,参数使用当前层,递归获取所有文件,然后再判断扩展名

优点:如果实现较好可避免之前提到的问题

缺点:实现比较复杂

 

读取时可采用异步IO提升性能。

 

分词:

方法1:字符串的Split方法

此方法不太好,因为分隔符是除数字和字母外的所有字符,因此分隔符数组会非常大,而且必须保证编码读取正确才能保证结果正确。

方法2:正则表达式

优点:对于需求变动的情况修改非常容易,只需要修改正则的模式。

缺点:正则表达式计算MatchCollection开销很大,字符串过大时效率不高。

方法3:状态机

优点:性能较高,不需记录很多无关的数据和回溯。

缺点:需求变动时需修改状态和条件,容易出错。

 

排序并输出:

方法1:实现IComparer接口,用系统的排序算法排序。

优点:实现容易,且修改便捷。

缺点:系统默认使用的是快速排序,最坏时间复杂度较高。

 

方法2:自己实现排序算法

优点:可实现O(nlgn)的排序算法(如归并,堆排序),提高最坏时间复杂度较高。

缺点:实现复杂,占用空间大。

posted on 2012-10-19 16:52  weiyun  阅读(...)  评论(...编辑  收藏

My Links

Blog Stats