对于一些单词,如"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