【经典算法】:基于中文字符分析的统计频率算法实现

来源:互联网 发布:海岛奇兵导弹数据 编辑:程序博客网 时间:2024/06/14 06:12

前言

//这篇文章和我的上篇文章 :英文频率统计
//息息相关,可以作为参考

正文:

在生活中,我们会有这样的困扰,比如说要统计一篇作文中 某个字符出现的次数,该咋办?

人工肯定会这么弄,把一篇文章从第一个数到最后一个,然后统计出来

这样确实不错,但是当文章足够大时就显得特别费劲,并且特别笨重,所以就一定要智能的完成这个功能,这篇文章所介绍的技术就是这个,当然基于这个基础还能干很多的事,这得需要探讨才能发现。

技术基础

关于计算机里面中文和英文的存储区别:
中文:用两个字节存储
英文:用一个字节存储
这里参考我一篇文章:中文的计算机存储格式
所以中文在分离时就要用一些特殊的方法,我这里用了一个存储结构
1)用字符串存满文章的各个字,不管是中文还是英文都存进字符串里面去
2)用一个特殊的结构来存储字符,这样保证中文和英文都能分离
3)利用类似冒泡排序的方法查找重复的元素,然后统计,最后输出结果

技术实现

1)文件读取技术,把txt文件里面的数据读取出来
2)数据分离:把txt里面的中英文分离,放到指定的存储结构里面去(struct 结构体)
3)数据统计:把数据放进统计的结构体里面去,同时记录其值

代码

//author :seen//time: 2015-10-11#include <iostream>#include <fstream>#include <iomanip>using namespace std;struct data{  //存储文章内容    char s[3];}D[1000];struct res{    //存储各不相同的字符    char s[3];    int value;}R[1000];int Is(char s[3],int k){    for(int i=0;i<k;i++){        if(strcmp(s,R[i].s)==0) return 0;    }    return 1;}void  main(){    char s[50000];    fstream f("d:\\数据.txt",ios::in ||ios::out);    if(!f) cout<<"mistake"<<endl;    int count=0;    while(f>>s[count] &&!f.eof()){        count++; //count统计中英文字符共多少字节    }    cout<<count<<endl;    int new_count=0;  //new_count统计中英文字符共有多少个    for(int i=0;i<count;i++){        if((int)s[i]<0){            D[new_count].s[0] = (int)s[i];            i++;            D[new_count].s[1] = (int)s[i];            D[new_count].s[2] = '\0';            new_count++;        }        else if((int)s[i]>0){            D[new_count].s[0] = (int)s[i];            D[new_count].s[1] = '\0';            new_count++;        }    }    cout<<new_count<<endl;    int pos = 0;    //pos统计中英文字符共多少类    for(i=0;i<new_count;i++){        if(Is(D[i].s,pos)){   //如果是新出现的数就返回1            strcpy(R[pos].s,D[i].s);            pos++;            R[pos].value = 1;        }        else{            for(int j=0;j<pos;j++){                if(strcmp(R[j].s,D[i].s)==0){                    R[j].value++;                }            }        }    }    cout<<"种类"<<pos<<endl;    for(i=0;i<pos;i++) cout<<setw(2)<<i+1<<" "<<setw(3)<<R[i].s<<" "<<setw(2)<<R[i].value<<endl;//格式化输出,依次为字符标号,字符,统计的数量}

截图

txt文件截图:
这里写图片描述

运行截图:
这里写图片描述

0 0