词频统计 List Array
c# 使用数组进行词频统计
1.先考虑要是使用的数据结构:
Array在在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单,但是数组存在一些不足的地方。在数组的两个数据间插入数据是很麻烦的,而且在声明数组的时候必须指定数组的长度,数组的长度过长,会造成内存浪费,过段会造成数据溢出的错误。如果在声明数组时我们不清楚数组的长度,就会变得很麻烦。
ArrayList对象的大小是按照其中存储的数据来动态扩充与收缩的。所以,在声明ArrayList对象时并不需要指定它的长度。但是ArrayList会把所有插入其中的数据当作为object类型来处理,在我们使用ArrayList处理数据时,很可能会报类型不匹配的错误,也就是ArrayList不是类型安全的。在存储或检索值类型时通常发生装箱和取消装箱操作,带来很大的性能耗损。
List<T>类是 ArrayList 类的泛型等效类。该类使用大小可按需动态增加的数组实现 IList<T> 泛型接口。不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换,是类型安全的。
2.Array 进行词频统计
要使用Array进行词频统计就需要提前规定一个大小够用的数组,确保不会越界。使用二维数组,一维存储单词另一维存放单词出现次数。
每次查询单词是否在数组(单词维度)中存在,若存在则获取到在数组中的位置下标,根据下标更新对应的单词出现次数。若存在将单词写入数组,次数为1。
效能分析结果图:

程序运行总时间16s


占用最多的函数项ArrayContains() 该函数用于判定单词是否已存在数组之中,若存在返回1及下标,若不存在返回0及数组为空的位置以便继续写入。
数组的赋值和修改都很简单,查找占用较多。
2.List<> 进行词频统计
使用List<T>来进行词频统计。定义类 Item包含下面两个属性
private int total;//单词出现次数
private string word;//单词
List<Item>无需设定长度,每次查询单词是否存在,若存在则获取到在List中位置,删除对应位置的数据Item,若不存在将单词写入,次数记为1.
效能分析结果图:

程序运行总时间130s


占用最多的函数项 IsExAndgetIndexAndValue(List<Item> itemList, string word)
该函数用于判定单词是否已存在List之中,若存在返回1、位置(index)及单词出现出次数(value)组成的int数组,若不存在返回0、0 、0组成的数组
根据是否存在确定下一步要进行的操作:①存在:删除对应位置Item,将新Item(word,value+1)写入
②不存在:写入Item(word,1)
3.HashTable 词频统计(博客:http://www.cnblogs.com/WeSure6/p/5257024.html)
效能分析结果(博客:http://www.cnblogs.com/WeSure6/p/5275715.html)
效能分析(代码部分调整:将一些功能写成独立函数)

程序运行总时间 3s


占用百分比较高的部分是对标点符号的替换(TxtToWords()函数部分)

其余为判断单词是否存在于HashTable中

4.总结
就程序运行总时间看,使用HashTable的程序运行时间最短只有3s,使用二维数组稍长16s,而使用List<T>最长130S(严重超出预期,有待思考,还未想明缘由)
CPU使用情况上,使用HashTable的程序优于使用二维数组优于List<>
*以上结论依据个人程序
词频统计 List Array的更多相关文章
- 【原创】大数据基础之词频统计Word Count
对文件进行词频统计,是一个大数据领域的hello word级别的应用,来看下实现有多简单: 1 Linux单机处理 egrep -o "\b[[:alpha:]]+\b" test ...
- 用Python实现一个词频统计(词云+图)
第一步:首先需要安装工具python 第二步:在电脑cmd后台下载安装如下工具: (有一些是安装好python电脑自带有哦) 有一些会出现一种情况就是安装不了词云展示库 有下面解决方法,需看请复制链接 ...
- 利用python实现简单词频统计、构建词云
1.利用jieba分词,排除停用词stopword之后,对文章中的词进行词频统计,并用matplotlib进行直方图展示 # coding: utf-8 import codecs import ma ...
- C# 词频统计 东北师范大学 软件项目管理 第一次作业
一.作为杨老师的学生第一次听杨老师讲课,印象最深的就是:工程中所有步骤之间是乘法,如果任何一步为0,工程就做不出来了.以前所有老师讲到的都是不要太在乎结果,努力的过程很重要,但是这在软件工程中不合适了 ...
- 使用SparkSQL编写wordCount的词频统计
# 使用SparkSQL编写wordCount的词频统计 ## word.txt```hello hello scala sparkjava sql html java hellojack jack ...
- 【python】利用jieba中文分词进行词频统计
以下代码对鲁迅的<祝福>进行了词频统计: import io import jieba txt = io.open("zhufu.txt", "r" ...
- Python之利用jieba库做词频统计且制作词云图
一.环境以及注意事项 1.windows10家庭版 python 3.7.1 2.需要使用到的库 wordcloud(词云),jieba(中文分词库),安装过程不展示 3.注意事项:由于wordclo ...
- 作业3-个人项目<词频统计>
上了一天的课,现在终于可以静下来更新我的博客了. 越来越发现,写博客是一种享受.来看看这次小林老师的“作战任务”. 词频统计 单词: 包含有4个或4个以上的字 ...
- C语言实现词频统计——第二版
原需求 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 新需求: 1.小文件输入. 为表明程序能跑 2.支持命 ...
随机推荐
- if语句(初学者)
用if语句可以构成分支结构.它根据给定的条件进行判断,以决定执行某个分支程序段.C语言的if语句有三种基本形式. 1.基本形式:if(表达式)语句 其语义是:如果表达式的值为真,则执行其后的语句,否则 ...
- 深入浅出RxJava(三:响应式的好处)
在第一篇中,我介绍了RxJava的基础知识.第二篇中,我向你展示了操作符的强大.但是你可能仍然没被说服.这篇里面,我讲向你展示RxJava的其他的一些好处,相信这篇足够让你去使用Rxjava. 错误处 ...
- 【洛谷】【模拟+栈】P4711 「化学」相对分子质量
[题目传送门:] [戳] (https://www.luogu.org/problemnew/show/P4711) [算法分析:] 关于一个分子拆分后的产物,一共有三种情况: 原子 原子团 水合物 ...
- Spring 注解大全
@Autowired 自动注入 (存在多个可注入Bean时,通过 @Qualifier 指定)@Resource 与@Autowired作用相同@Repository 只能标注在 DAO 类上.该注解 ...
- PHP开发小技巧①①—php实现手机号码显示部分
从个人信息保护性的角度来讲,我们在开发过程中总会想办法去保护用户的一些个人信息.就如本篇博文所讲,我们有时会将用户的手机号码只显示出部分,这是很多网站都有做的功能.这个功能实现起来也是特别的简单,只需 ...
- 20145236《网络对抗》Exp8 WEB基础实践
20145236<网路对抗>Exp8 WEB基础实践 一.基础问题回答 什么是表单 表单在网页中主要负责数据采集功能 一个表单有三个基本组成部分: 表单标签 表单域:包含了文本框.密码框. ...
- k8s访问服务时,解析不了域名
1)访问 http://eureka-server-0.eureka-server:8101/eureka 出现UnknowHostExecption异常 2)问题定位kube-dns问题 3)doc ...
- http/2 多路复用技术
虽然 HTTP 1.1 默认启用长TCP连接,但所有的请求-响应都是按序进行的(这里的长连接可理解成半双工协议.即便是HTTP 1.1引入了管道机制,也是如此).复用同一个TCP连接期间,即便是通过管 ...
- Linux C++调试利器-gdb
在Linux上开发后台C++程序时,没有类似Windows VisualStudio那样强大的可视化IDE.为了提高调试效率,快速定位问题,需要掌握gdb工具的一些基本用法. 添加调试符号信息 co ...
- SkylineGlobe MFC C++ 开发示例代码
SkylineGlobe的SDK底层是跨平台的C++内核,面向不同平台封装原生的API,具有很高的执行效率, 下面是C++二次开发时的示例代码: #import "D:\Program Fi ...