目录

题目内容

思路(总览)

行文风格

1.随机生成数

1.1.写文件的操作

1.2.读文件的操作

1.3.随机生成数的操作

2.把data.txt文件分散为500个子文件

3.对每一个子文件进行(降序)排序,并将前100的数据分别放到“(top ten)1.txt" "top(top ten)2.txt"......"(top ten)500.txt"文件中

3.1.打开需要读和写的文件

3.2.把子文件的所有数据放入map中,记录数据key和num

3.3.把map中的数据放入vector中,为排序做准备

3.4.对vector进行排序

3.5.利用迭代器统计vector的长度

3.6.把子文件出现频率为前面的数据存入子文件的子文件中

3.7.关闭3.1打开的文件

4.把所有“(top ten)1.txt" "top(top ten)2.txt"......"(top ten)500.txt"文件集合到”all.txt"文件中

5.对“all.txt"文件进行排序,排序后把top100热词输出到“last.txt"文件中

5.1.分割字符串


题目内容

(1)大数据分析问题

[问题描述]

某搜索公司一天的用户搜索词汇是海量的(百亿数据量),请设计一种求出每天最热top 100 词汇的可行办法。

[基本要求]

(1) 随机生成海量数据,存入文件;从文件读入数据来处理。

(2) 显示数据文件的每一次处理结果。

思路(总览)

1.先随机生成1000万个数字(数据),写入data.txt中

2.把1000万个数据分散到500个子文件,文件名为“1.txt" "2.txt"........"500.txt"

3.对每一个子文件进行(降序)排序,并将前100的数据分别放到“(top ten)1.txt" "top(top ten)2.txt"......"(top ten)500.txt"文件中

4.把所有“(top ten)1.txt" "top(top ten)2.txt"......"(top ten)500.txt"文件集合到”all.txt"文件中,并对“all.txt"文件进行排序,排序后把top100热词输出到“last.txt"文件中

行文风格

我会先把每一步全部代码贴在开头

然后把代码拆分为几步

本人水平极低,这篇文章是借鉴别人然后一点一点啃出来的,可谓寸步难行,可以说大部分东西都是从零开始,很多东西不知道都是拿来就用,边用边学,遇到问题再学,所以如果你什么也看不懂,也不用担心,我可以你也可以的

因为我是懒狗,所以很多思考的细节没有体现出来

各位遇到问题,欢迎交流

1.随机生成数

#define MAX 100000
#define MIN 1000int generate()
{ofstream ofile;//写文件ofile.open("data.txt", ios::out);//创建并打开名为"data.txt"的文件
//生成随机数的操作:clock_t start_time = clock();//计时开始srand(unsigned(time(0)));//生成时间种子int i = 0;for (int i = 0; i < 10000000; ++i) {unsigned long data = rand() % (MAX - MIN + 1) + MIN;//较标准:生成大小为MAX-MIN的随机数ofile << data << endl; //输出数据到data.txt }ofile.close();//关闭文件return 0;
}

1.1.写文件的操作

    ofstream ofile;//第一步声明ofile.open("data.txt", ios::out);//第二部创建并打开名为"data.txt"的文件,并以ios::out的方式打开ofile << data << endl; //输出数据到data.txt ofile.close();//关闭文件

1.2.读文件的操作

见后面

1.3.随机生成数的操作

    #define MAX 。。。。//自己定义#define MIN 。。。。//自己定义clock_t start_time = clock();//计时开始srand(unsigned(time(0)));//生成时间种子unsigned long data = rand() % (MAX - MIN + 1) + MIN;//较标准:生成大小为MAX-MIN的随机数

2.把data.txt文件分散为500个子文件

int spit(int num)
{ifstream file;// 读文件,大数据来源  file.open("data.txt", ios::in);//读的方式打开data.txtif (!file.is_open())//如果打开失败,返回。。。{cout<<"打开失败";return 0;}  ofstream* ofile = new ofstream[num + 1]; // 写入,预处理存储num个小文件,num可以自定义,这里设置500 int i = 0;//批量打开500个文件for (i = 0; i < num; i++){ //to_string()是把数字转换成string类型,"1"+".txt"="1.txt","ha"+"ppy"="happy"string filename = to_string(i) + ".txt"; ofile[i].open(filename, ios::out);}//写文件i = 0;hash<string> str_hash; // 哈希函数,用于记录哈希值std::string strLine;//std::string是一个类,猜测和string strLine一个意思while (getline(file, strLine))// 读入大数据文件每一行  (String strLine){i++;if (strLine.empty())continue;int ton = str_hash(strLine) % num; // 哈希计算分块位置 ,哈希值%numofile[ton] << strLine << endl;//在选中的小文件中写入当前在大文件读到的数据if (i % 10000 == 0){cout << i << endl; // 每写入10000行输出一次,进度说明}}file.close();//关闭文件//批量关闭文件for (i = 0; i <= num; i++){ofile[i].close();//把每个小文件的写都关闭掉}delete[] ofile;//前面new出来的记得delete
}

3.对每一个子文件进行(降序)排序,并将前100的数据分别放到“(top ten)1.txt" "top(top ten)2.txt"......"(top ten)500.txt"文件中

typedef pair<string, int> PAIR;
bool cmp_by_value(const PAIR& lhs, const PAIR& rhs) {return lhs.second > rhs.second;//lhs.second>rhs.second即左大于右,降序//lhs.second<rhs.second就左小于右,升序
}int get100(int num)
{for (int q = 1; q < num; q++)//500是文件数,假设分成了500个文件{ifstream file; // 建立小文件对象 读ofstream ofile; // 建立小文件对象 写string filename = to_string(q) + ".txt"; // 文件来向和去向设定 to_string的作用是把数值改为字符串格式file.open(filename, ios::in);ofile.open("前一百" + filename, ios::out);if (!file.is_open())break;string strLine;//用于读文件map<string, int> hm;//存储key关键字和num频率 <string,int>分别对应数据key和频率numwhile (getline(file, strLine)) {if (strLine.empty())continue;hm[strLine] += 1; //map 统计频率 比如数据"1234"出现了一次,那么就hm["1234"]+=1;}cout << "*****" << endl;vector<PAIR> vec(hm.begin(), hm.end());//这里是把哈希表中的数据放进vector,留意这个PAIR,上面已经定义了sort(vec.begin(), vec.end(), cmp_by_value);//这里是排序算法 头文件要包含#include <algorithm>  排序后的结果是降序的 具体原因看PAIR的定义cout << "***" << endl;int length = 0;vector<PAIR>::iterator it;//vector的迭代器for (it = vec.begin(); it != vec.end(); it++)//it=vec.begin()即指向vec的第一个数据//vec.end()同理 {length++;}int i = 0;while (true) // 输出所有的数据,为什么不是全部前100的数据,因为一个小文件的数据太少了,远达不到100个,这个时候还试图取前一百个例如调用vec[100]就会造成越界  {cout << i << "   " << vec[i].first << "  " << vec[i].second << endl;ofile << vec[i].first << "," << vec[i].second << endl;//if (i >= 100 && vec[i].second != vec[i + 1].second) // 保证100之后是否存在和100相同的数据  (这是取前100的时候才用的判断)if (i == length - 1)break;i++;}file.close();//文件在最后一定要记得关闭ofile.close();//文件在最后一定要记得关闭}return 0;
}

3.1.打开需要读和写的文件

        ifstream file; // 建立小文件对象 读ofstream ofile; // 建立小文件对象 写string filename = to_string(q) + ".txt"; // 文件来向和去向设定 to_string的作用是把数值改为字符串格式file.open(filename, ios::in);ofile.open("前一百" + filename, ios::out);if (!file.is_open())break;

3.2.把子文件的所有数据放入map中,记录数据key和num

        string strLine;//用于读文件map<string, int> hm;//存储key关键字和num频率 <string,int>分别对应数据key和频率numwhile (getline(file, strLine)) {if (strLine.empty())continue;hm[strLine] += 1; //map 统计频率 比如数据"1234"出现了一次,那么就hm["1234"]+=1;}

3.3.把map中的数据放入vector中,为排序做准备

vector<PAIR> vec(hm.begin(), hm.end());//这里是把哈希表中的数据放进vector,留意这个PAIR,上面已经定义了

3.4.对vector进行排序

sort(vec.begin(), vec.end(), cmp_by_value);//这里是排序算法 头文件要包含#include <algorithm>  排序后的结果是降序的 具体原因看PAIR的定义

3.5.利用迭代器统计vector的长度

        int length = 0;vector<PAIR>::iterator it;//vector的迭代器for (it = vec.begin(); it != vec.end(); it++)//it=vec.begin()即指向vec的第一个数据//vec.end()同理 {length++;}

3.6.把子文件出现频率为前面的数据存入子文件的子文件中

        int i = 0;while (true) // 输出所有的数据,为什么不是全部前100的数据,因为一个小文件的数据太少了,远达不到100个,这个时候还试图取前一百个例如调用vec[100]就会造成越界  {cout << i << "   " << vec[i].first << "  " << vec[i].second << endl;ofile << vec[i].first << "," << vec[i].second << endl;//if (i >= 100 && vec[i].second != vec[i + 1].second) // 保证100之后是否存在和100相同的数据  (这是取前100的时候才用的判断)if (i == length - 1)break;i++;}

3.7.关闭3.1打开的文件

        file.close();//文件在最后一定要记得关闭ofile.close();//文件在最后一定要记得关闭

4.把所有“(top ten)1.txt" "top(top ten)2.txt"......"(top ten)500.txt"文件集合到”all.txt"文件中

    int getALl(int& num) {ofstream ofile;ofile.open("all.txt", ios::out);for (int q = 0; q < 500; q++) {ifstream file;string filename = "(前一百)" + to_string(q) + ".txt";file.open(filename, ios::in);if (!file.is_open()){cout << "打开失败" << endl;}elsecout << "打开成功" << endl;string strLine;while (getline(file, strLine)){if (strLine.empty())continue;ofile << strLine << endl;num += 1;}file.close();}ofile.close();return 0;
}

5.对“all.txt"文件进行排序,排序后把top100热词输出到“last.txt"文件中

 int last(){ifstream file;file.open("all.txt", ios::in);ofstream ofile;ofile.open("last.txt",ios::out);map<string,double> hm;//存储key关键字和num频率string strLine;while (getline(file, strLine)) {if (strLine.empty()){cout << "继续啊" << endl;continue;}char save[20];strcpy_s(save, strLine.c_str());//把读到的数据放到string数组里面char* token = NULL;char* ptr = NULL;token = strtok_s(save, ",", &ptr);char* a = token;//keystring change = a;token = strtok_s(NULL, ",", &ptr);double b = atof(token);//numcout << "key:" << change << "num:" << b << endl;hm[change] += b; // unordered_map 统计频率}vector<YYDS> vec(hm.begin(), hm.end());sort(vec.begin(), vec.end(), cmp_by_value);cout << "***" << endl;int length = 0;vector<YYDS>::iterator it;for (it = vec.begin(); it != vec.end(); it++){cout << it->first << "    " << it->second << endl;length++;}int i = 0;while (true) // 输出前一百的数据  {cout << i << "   " << vec[i].first << "  " << vec[i].second << endl;ofile << vec[i].first << "," << vec[i].second << endl;if (i >= 100 && vec[i].second != vec[i + 1].second)break; // 保证100之后是否存在和100相同的数据  i++;}file.close();ofile.close();
}

5.1.分割字符串

string strLine;
while (getline(file, strLine)) {if (strLine.empty()){cout << "继续啊" << endl;continue;}char save[20];strcpy_s(save, strLine.c_str());//把读到的数据放到string数组里面char* token = NULL;char* ptr = NULL;token = strtok_s(save, ",", &ptr);char* a = token;//keystring change = a;token = strtok_s(NULL, ",", &ptr);double b = atof(token);//numcout << "key:" << change << "num:" << b << endl;hm[change] += b; // unordered_map 统计频率}

all.txt文件的文件如上图所示,左边是数据key,右边是频率num

注意:中间还有","

读文件的时候是一行一行读的,所以我们要分割字符串才可以分别记录key和num

这时候利用strtok_s();这个函数

海量数据,top100热词,手把手教学相关推荐

  1. 在热词中看舆论,摆脱“黑天鹅”效应

    在互联网时代,热词往往反应了一段时间内公众普遍关注的事件.因此,热词计算是舆情系统中的核心模块,针对资讯.评论.弹幕等进行热词统计,可以快速对海量资讯提取核心词汇,帮助用户快速研判舆论舆情.然而海量数 ...

  2. 盘点2018年度热词:区块链、5G通信热度反超人工智能

    一转眼2018年已经快要走到了尽头.这一年来,科技圈内可谓是风云变幻,各类的新名词与新概念层出不穷.其中很多的概念与产品已经悄然涉及到了我们生活中的方方面面.整个2018人们都在目不暇接的迎接新产品. ...

  3. 通过tinyxml解析百度热词榜单

    百度热词榜单 初学TinyXml,盯上了解析百度热词榜单.通过curl获取rss地址上的数据. 由于TinyXml不支持,所以要转换为UTF-8格式,命令为 iconv -f gb2312 -t ut ...

  4. ecshop 搜索热词推荐_多多搜索自定义关键词推广的基础点:如何选对致命的关键词...

    很多商家可能会疑惑我为什么不讲点击率,点击率固然重要,但其实多多搜索是围绕关键词展开的.正所谓万丈高楼平地起,关键词才是多多搜索的基础,没有这个基础,买家都搜不到你,或者搜到了却不是精准人群,点击率也 ...

  5. “赶上热词热概念,是我们不幸的一面” | 对话小冰公司CEO李笛

    金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 小冰的很多进展,往往只能借用科幻电影才能更好解释. <Her>中描绘过一个如影随形的专属AI虚拟人,跟主人公聊天聊地,从诗词歌赋 ...

  6. ecshop 搜索热词推荐_拼多多搜索推广实操——如何选择正确的关键词实现高投产!...

    原标题:拼多多搜索推广实操--如何选择正确的关键词实现高投产! 大家好我是拼多多运营林枫,每天都会更新新的内容哦,没关注的记得关注一下哦! 今天和大家讲讲搜索推广怎么正确选择有效的关键词,很多商家可能 ...

  7. 关键词词云怎么做_制作CVPR 热词云(并爬取pdf地址 名称)

    #!/usr/bin/python #这里是解释器位置和python版本#-*- coding: utf-8 -*- #编码格式 """@author: CuiXingY ...

  8. Android Wear 唤醒热词会比“你好,安卓”好吗?

    随着Motorola 在发布搭载了Android Wear 操作系统的智能手表 Moto 360 二代中国版手表,Android Wear正式进入中国大陆,因为一些原因,其最核心的语音搜索功能破天荒地 ...

  9. “大数据杀熟”成网络热词,科技公司信任危机到来?

    两个人用同一款打车软件去相同的目的地,手机软件显示价格相差30%,这类情况被冠名为"大数据杀熟". 传说中,在"平台大数据库"里被标记为"价格不敏感型 ...

最新文章

  1. 2017 年最流行的 15 个数据科学 Python 库
  2. 用NanoPi NEO Air连接USB摄像头
  3. Java17-day08【File(创建和删除文件、判断和获取功能、遍历目录)、IO流(字节流写数据、异常处理、字节流读数据、复制文本文件、复制图片)】
  4. Excel图表横坐标设置怎么做?(亲测)
  5. IE8下submit表单没反应
  6. ant java eclipse_Eclipse之ANT使用
  7. mac eclipse 安装lombok_别再写getter,setter方法了,用Lombok来简化你的代码吧
  8. 软件开发中 前台、中台、后台英文_中台为什么这么火?
  9. 数学函数图像软件-Graph之小技巧
  10. CleanMyMac X4.11.1中文正式版 系统优化 垃圾清理 程序卸载工具
  11. 随机过程(4)——马尔可夫链
  12. 笔记本指纹识别linux版驱动程序,联想Thinkpad指纹识别驱动
  13. 【ISO9126】软件质量模型的介绍(软件质量管理的六大特征和二十七个子特征)
  14. c语言闰月的计算方法,如何计算闰月如何用计算机编程? 爱问知识人
  15. matlab图无线型,如何使用MATLAB进行移动无线信道模型的建模资料概述
  16. 罗技鼠标M330拆解
  17. 智慧交通大数据可视化,让城市运营车辆可视、可监、可控
  18. BUUCTF-刷题记录-7
  19. 想哪写哪_随笔20191130
  20. 聊聊RSNA2017上的机器学习

热门文章

  1. Android 阿里推送实现自定义铃声以及8.0以上横幅通知提醒
  2. NML(Non-Local Mean)非局部平均算法 完全解析与积分图加速 (附代码)
  3. Vagrant环境搭建及基本使用
  4. c语言编程心得,C语言编程心得
  5. Centos下安装Jexus、.net,上传部署运行asp.net项目
  6. 重磅!腾源会与WasmEdge的双份开源好礼来了
  7. 机器人编程趣味实践07-信息交互(主题)
  8. 今日学习在线编程题:弓形圆心角
  9. 稀疏矩阵的存储以及转置、加法、乘法操作实现
  10. ArangoDB安装