统计文章内各个单词出现的次数

算法的思路是:

  1. 从头到尾遍历文件,从文件中读取遍历到的每一个单词。
  2. 把遍历到的单词放到hash_map中,并统计这个单词出现的次数。
  3. 遍历hash_map,将遍历到的单词的出现次数放到优先级队列中。
  4. 当优先级队列的元素个数超过k个时就把元素级别最低的那个元素从队列中取出,这样始终保持队列的元素是k个。
  5. 遍历完hash_map,则队列中就剩下了出现次数最多的那k个元素。

具体实现和结果如下:

// 出现次数最多的K个单词.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <hash_map>
#include <string>
#include <fstream>
#include <queue>
#include <iostream>
#include <algorithm>
#include <boost/timer.hpp>
using namespace std;
using namespace boost;
void top_k_words()//出现次数最多的是个单词
{
    timer t;
    ifstream fin;
    fin.open("modern c.txt");
    if (!fin)
    {
        cout<<"can not open file"<<endl;
    }
    string s;
    hash_map<string,int> countwords;
    while (true)
    {
        fin>>s;
        countwords[s]++;
        if (fin.eof())
        {
            break;
        }

    }
    cout<<"单词总数 (重复的不计数):"<<countwords.size()<<endl;
    priority_queue<pair<int,string>,vector<pair<int,string>>,greater<pair<int,string>>> countmax;
    for(hash_map<string,int>::const_iterator i=countwords.begin();
        i!=countwords.end();i++)
    {
        countmax.push(make_pair(i->second,i->first));
        if (countmax.size()>10)
        {
            countmax.pop();
        }
    }
    while(!countmax.empty())
    {
        cout<<countmax.top().second<<" "<<countmax.top().first<<endl;
        countmax.pop();
    }
    cout<<"time elapsed "<<t.elapsed()<<endl;
}
int main(int argc, char* argv[])
{
    top_k_words();

    system("pause");
    return 0;
}

linux下不能使用hash_map,改为map来统计单词的个数:

// 出现次数最多的K个单词.cpp : Defines the entry point for the console application.
#include <map>
#include <string>
#include <fstream>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;

void top_k_words()//出现次数最多的是个单词
{
    ifstream fin;
    fin.open("modern c.txt");
    if (!fin)
    {
        cout<<"can not open file"<<endl;
    }
    string s;
    map<string,int> countwords;
    while (true)
    {
        fin>>s;
        countwords[s]++;
        if (fin.eof())
        {
            break;
        }

    }
    cout<<"单词总数 (重复的不计数):"<<countwords.size()<<endl;
    priority_queue<pair<int,string>,vector<pair<int,string>>,greater<pair<int,string>>> countmax;
    for(map<string,int>::const_iterator i=countwords.begin();  i!=countwords.end();i++)
    {
        countmax.push(make_pair(i->second,i->first));
        if (countmax.size()>10)
        {
            countmax.pop();
        }
    }
    while(!countmax.empty())
    {
        cout<<countmax.top().second<<" "<<countmax.top().first<<endl;
        countmax.pop();
    }
}
int main(int argc, char* argv[])
{
    top_k_words();

    return 0;
}
时间: 2024-09-29 03:44:13

统计文章内各个单词出现的次数的相关文章

统计一篇英文文章内每个单词出现频率,并返回出现频率最高的前10个单词及其出现次数

统计一篇英文文章内每个单词出现频率,并返回出现频率最高的前10个单词及其出现次数 from collections import Counter import re with open('a.txt', 'r', encoding='utf-8') as f: txt = f.read() c = Counter(re.split('\W+',txt)) #取出每个单词出现的个数 print(c) ret = c.most_common(10) #取出频率最高的前10个 print(ret) 原

N个任务掌握java系列之统计一篇文章中单词出现的次数

问题:统计一篇文章中单词出现的次数 思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词)数组中. (2)定义一个Map,key是字符串类型,保存单词:value是数字类型,保存该单词出现的次数. (3)遍历(1)中得到的字符串数组,对于每一个单词,考察Map的key中是否出现过该单词,如果没出现过,map中增加一个元素,key为该单词,value为1(第一次出现): 如果,在map的key中发现了该单词,则通过key找到对应的value(单词出现的次数)

python分析mysql-binlog,统计时间段内各表的操作次数_2016041301

小鹏鹏装逼课堂之:统计指定时间段数据库表的操作次数.处女作,需要大神帮忙优化.#####注:::以下脚本中路径可能需要各位自行进行修改 实现原理:   1.shell脚本:通过mysqlbinlog将binlog日志文件格式化输出        定制crontab任务,定时通过向mysql传递show master status查看binlog是否变化,若发生变化则格式化输出已经切换掉的binlog文件   2.shell脚本:定制crontab任务,通过比对md5码,查看格式化后的binlog

【面试题总结】1、统计字符串中某个单词出现的次数

[解决方法一]C++ map解决 一.map中的find函数: 用于查找map中是否包含某个关键字条目,传入的参数是要查找的key,最后返回一个迭代器,如果没有找到,则返回的迭代器等于end()返回的迭代器.示例代码: 1 #include<iostream> 2 #include<string> 3 #include<map> 4 using namespace std; 5 6 int main() { 7 map<int, string> mapStu

shell统计文本中单词的出现次数

Ubuntu14.04 给定一个文本,统计其中单词出现的次数 # solution 1 grep与awk配合使用,写成一个sh脚本 fre.sh sh fre.sh wordfretest.txt #! /bin/bash# solution 1 if [ $# -eq 0 ] then echo "Usage:$0 args error" exit 0 fi if [ $# -ge 2 ] then echo "analyse the first file $1"

&quot;分拣&quot; 思路 统计每个单词出现的次数

package collection.map; public class Letter { public String name; public int count; } package collection.map; /* * 统计每个单词出现的次数 * "分拣" 思路 * 1.为所有key创建容器 * 之后容器中存放对应value * 2.第一次创建容器,并存放值value * 第二次之后,直接使用容器存放值 */ import java.util.HashMap; import

java基础 之 HashMap统计csv文件的单词

一:知识补充( 这个HashMap Map 和 c++的Map还是有很大的区别的,区别之大让人瞠目结舌,当然两者的作用是一致的,但是函数名称出入很大,就连iterator区别也很大的 ) (1)HashMap 和 HashTable的区别(c++中只有map木有hashmap的) HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值.HashMap允许null key和null value,而

统计文件中制定词汇出现的次数

统计文件中"牛客"出现的次数: grep -o "查找单词" "查找的文件"| wc -l grep -o "查找单词" "查找的文件": -o 表示精确匹配,没有-o,只会显示要查找单词所出现的那一行 来自为知笔记(Wiz)

python 统计list中各个元素出现的次数

python 统计list中各个元素出现的次数利用Python字典统计利用Python的collection包下Counter的类统计利用Python的pandas包下的value_counts的类统计利用字典dict来完成统计举例: a = [1, 2, 3, 1, 1, 2]dict = {}for key in a: dict[key] = dict.get(key, 0) + 1print dict12345输出结果: >>>{1: 3, 2: 2, 3: 1}1利用Python