统计文件中单词频率的各种算法实现
来源:互联网 发布:蒙泰设置打印端口 编辑:程序博客网 时间:2024/05/22 15:52
为了应付面试,最近一直在学习数据结构和算法。本文将通过统计文件中单词的频率,并按频率出现顺序和按字母顺序输出文件中的单词及出现次数。
比如“abc aa hello welcome hello aa abc hello”, 按频率次数的输出为:
hello 3
aa 2
abc 2
welcome 1
按字符顺序输出为:
aa 2
abc 2
hello 3
welcome 1
本文将尝试采用以下几种算法分别来实现
1.数组+冒泡排序
2.链表+哈希
3.二叉树
方案一:
首先构件如下结构体:
Typedef struct node *nodeptr
Typedef struct node
{
Char*word;//用来存放单词
Int count;//用来存放单词出现的个数
}node
数组的劣势在于需要事先知道文本文件中字符串的多少,如果太大会造成浪费太小又会造成数组溢出。
只能先定义一个足够大的数组
#define MAX_WORD_NUM 1024*1024
通过一个个读取文件中的字符串,将其按顺序存放在数组中,每次存放之前要比较当前字符串是否在数组中已经存在,
当存在时count++,不存在即存放在最后一个未被暂用的数组空间中。比较的时间复杂度为O(n)
由于数组的插入与删除操作是不方便的,所以排序是放在最后的。
针对按词频输出和按字母顺序输出都是一样的比较方法,采用冒泡排序
for(int i = 0 ; i < word_num; i++)
{
for(int j = 0 ; j < word_num - i ; j++)
{
if(a[j].count > a[j+1].count)
{
node temp ;
}
}
}
这种排序的时间复杂度为O(N*N)
方案二:
数组存在明显的弊端,需要事先知道文件中字符串的个数
那么可以改用链表,链表的优势在于插入与删除
在插入之前我们就保证链表是有序的,我们先按字母顺序插入,
比如aa就比abc要小,那么aa会插入在abc之前
查找插入的时间复杂度为O(n)
for(int i = 0 ; i <text.size; i++)
{
if()
}
- 统计文件中单词频率的各种算法实现
- 统计文件中单词出现的频率
- 有关统计单词频率的算法c语言实现
- 有关统计单词频率的算法c语言实现
- 有关统计单词频率的算法c语言实现
- 统计文件中各单词出现的频率(二叉排序树实现)
- 统计文件中各单词出现的频率(Hash表实现)
- shell 脚本---统计文件中单词的频率
- Hadoop Demo(一)【统计文件中单词出现的频率】
- java实现文件单词频率统计
- python实现统计文本中单词出现的频率
- 统计英文文件中单词数和各单词出现的频率(次数)
- 基于bf算法统计文本中某个单词出现的频率
- 统计一个文档中出现频率最多的k个单词的实现
- 统计一TXT文档中单词出现频率,输出频率最高的10个单词
- 统计一篇文章中单词出现的频率
- STL统计英文中单词出现频率的问题
- 统计文本中各单词出现的频率(JavaWeb)
- java对文件新建,删除,复制,剪切,重命名
- JAVA2游戏编程——Button(1)
- Spring下载地址
- HDU 5417-Victor and Machine(水题)
- 谈IO与fork结合
- 统计文件中单词频率的各种算法实现
- 二叉树中的数学性质
- mac 下更新 .bash_profile 文件
- ajax--检验用户是否存在
- 模糊识别的聚类分析+C代码
- 使用引导扇区维护工具BOOTICE编辑系统启动列表BCD文件
- win7 下jdk+tomcat配置
- ValueError: invalid literal for int() with base 10: '2.0'
- fastjson的使用