统计单词出现的频度

对于一些单词,如"aaa aa b aa bbb aaa",统计各个单词出现的频度。

资料出处:编程珠饥 15.1

方法一:用标准库的map。

map<string,int> m;

对于string s;

++m[s];即可统计字符串的个数,因为m[s],如果s存在,则自增,如果s不存在,则m[s]会创建,并初始化为int()即是0,并自增。由于map使用的平衡树,对n个单词,搜索的时间复杂度为n*log(n)。

方法二:对每个字符串进行散列,文中以统计圣经中的单词为例,由于圣经中出现的单词不同种类的个数为299131。将这些单词散列到一个长度为29989的数组上。如果hash函数设计的足够好,就能够用O(1)的时间实现查询的功能。

定义散列函数:

unsigned int hash(const char * str)
{
  unsigned int h = 0;//散列值
  while(*str != '\0')
  {
    h = h * 31 + *str;
    ++str;
  }
  return h%29989;
}

下面是我实现的所有源代码,由于分割字符串的有" ;:!?\n"这些个字符,所以又定义了嵌入cin的facet。

// 单词出现的频度.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <map>
#include 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值