原题网址:https://www.lintcode.com/problem/word-count-map-reduce/description

描述

使用 map reduce 来计算单词频率
https://hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html#Example%3A+WordCount+v1.0

您在真实的面试中是否遇到过这个题?  是

样例

  1. chunk1: "Google Bye GoodBye Hadoop code"
  2. chunk2: "lintcode code Bye"
  3. Get MapReduce result:
  4. Bye: 2
  5. GoodBye: 1
  6. Google: 1
  7. Hadoop: 1
  8. code: 2
  9. lintcode: 1
标签
Big Data
Map Reduce
 
 
思路:没怎么看懂这道题什么意思,参照着网上的代码捋了一遍。
Map类负责对原始数据进行处理,将字符串拆分成单词后输出到output; Reduce负责对Map输出的数据进行计数。转自此文

即:

map函数对输入的文本进行分词处理,然后输出(单词, 1)这样的结果,例如“You are a young man”,输出的就是(you, 1), (are, 1) 之类的结果;

在reduce函数中,我们把具有相同key的结果聚合起来。reduce函数的第二个参数类型为Input<int>, 这是一堆value的集合,他们具有相同的key,reduce函数的意义就是将这些结果聚合起来。

例如(”hello“, 1)和(”hello“, 1)聚合为(”hello“, 2),后者可能再次和(”hello“, 3) (”hello“, 1),聚合为(”hello“, 7)。   转自此文

 
 
AC代码:
  1. /**
  2. * Definition of Input:
  3. * template<class T>
  4. * class Input {
  5. * public:
  6. * bool done();
  7. * // Returns true if the iteration has elements or false.
  8. * void next();
  9. * // Move to the next element in the iteration
  10. * // Runtime error if the iteration has no more elements
  11. * T value();
  12. * // Get the current element, Runtime error if
  13. * // the iteration has no more elements
  14. * }
  15. */
  16. class WordCountMapper: public Mapper {
  17. public:
  18. void Map(Input<string>* input) {
  19. // Write your code here
  20. // Please directly use func 'output' to
  21. // output the results into output buffer.
  22. // void output(string &key, int value);
  23. vector<string> vecStr; //没看懂这句是干什么的……;
  24. while(!input->done())//为什么判断句不是input->done();
  25. {
  26. string str=input->value();
  27. int j=;
  28. for(int i=;i<=(int)str.size();i++)//注意判断句是小于等于;
  29. {
  30. if(str[i]==' '||i==str.size())
  31. {
  32. string temp=str.substr(j,i-j);
  33. output(temp,);
  34. j=i+;
  35. }
  36. }
  37. input->next();
  38. }
  39.  
  40. }
  41. };
  42.  
  43. class WordCountReducer: public Reducer {
  44. public:
  45. void Reduce(string &key, Input<int>* input) {
  46. // Write your code here
  47. // Please directly use func 'output' to
  48. // output the results into output buffer.
  49. // void output(string &key, int value);
  50. int sum=;
  51. while(!input->done())
  52. {
  53. sum+=input->value();
  54. input->next();
  55. }
  56. output(key,sum);
  57.  
  58. }
  59. };

代码中有三处不明白,

第一个是map函数中vector<string>数组的作用,将其注释掉也可以AC;

第二个是 while(!input->done())为什么不是 while(input->done()),done()函数不是如果容器有元素就返回true吗……;

第三个是 for(int i=0;i<=(int)str.size();i++),for循环的判断句为何是小于等于?后来这个问题想明白了,如果只是小于,会漏掉最后一个单词。因为当i为最后一个单词最后一个字符索引时,str【i】不为‘ ’,且i =size-1小于size,导致if块内语句无法执行。

其他参考:C++中substr的用法
 

499 单词计数 (Map Reduce版本)的更多相关文章

  1. python实现指定目录下批量文件的单词计数:并发版本

    在 文章 <python实现指定目录下批量文件的单词计数:串行版本>中, 总体思路是: A. 一次性获取指定目录下的所有符合条件的文件 -> B. 一次性获取所有文件的所有文件行 - ...

  2. python实现指定目录下JAVA文件单词计数的多进程版本

    要说明的是, 串行版本足够快了, 在我的酷睿双核 debian7.6 下运行只要 0.2s , 简直是难以超越. 多进程版本难以避免大量的进程创建和数据同步与传输开销, 性能反而不如串行版本, 只能作 ...

  3. 使用Scala实现Java项目的单词计数:串行及Actor版本

    其实我想找一门“具有Python的简洁写法和融合Java平台的优势, 同时又足够有挑战性和灵活性”的编程语言. Scala 就是一个不错的选择. Scala 有很多语言特性, 建议先掌握基础常用的: ...

  4. hadoop笔记之MapReduce的应用案例(WordCount单词计数)

    MapReduce的应用案例(WordCount单词计数) MapReduce的应用案例(WordCount单词计数) 1. WordCount单词计数 作用: 计算文件中出现每个单词的频数 输入结果 ...

  5. 分布式基础学习(2)分布式计算系统(Map/Reduce)

    二. 分布式计算(Map/Reduce) 分 布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件 系统,很 ...

  6. Hadoop Map/Reduce教程

    原文地址:http://hadoop.apache.org/docs/r1.0.4/cn/mapred_tutorial.html 目的 先决条件 概述 输入与输出 例子:WordCount v1.0 ...

  7. 分布式基础学习【二】 —— 分布式计算系统(Map/Reduce)

    二. 分布式计算(Map/Reduce) 分布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件系统,很大程 ...

  8. Spark: 单词计数(Word Count)的MapReduce实现(Java/Python)

    1 导引 我们在博客<Hadoop: 单词计数(Word Count)的MapReduce实现 >中学习了如何用Hadoop-MapReduce实现单词计数,现在我们来看如何用Spark来 ...

  9. MapReduce之单词计数

    最近在看google那篇经典的MapReduce论文,中文版可以参考孟岩推荐的 mapreduce 中文版 中文翻译 论文中提到,MapReduce的编程模型就是: 计算利用一个输入key/value ...

随机推荐

  1. chattr和lsattr命令,不能被删除、改名、设定链接关系,同时不能写入或新增内容

    chattr和lsattr命令详解 chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,如果Linux内核版本低于2.2,那么许多功能不能实现.同样-D检查压缩文件中的错误的功能, ...

  2. t检验中的t值和p值是什么关系_t检验和p值的关系

    t检验中的t值和p值是什么关系_t检验和p值的关系 t检验中通过样本均值 总体均值 样本标准差 样本量 可以计算出一个t值,这个t值和p值有什么关系? 根据界值表又会查出一个数,这个数和t值比较,得出 ...

  3. 猥琐发育,3月份Java干货已到达战场!

    时间真的过得很快,又是月底了,又到了我们总结这个月干货的时候了.3月份这个月我们都带来了哪些干货呢?我们一起回顾一下. 坑爹,手机端链接点不开,请切换到电脑端或者关注我们的微信公众号进行阅读. 扫描关 ...

  4. 16.ajax_case06

    # 抓取华尔街见闻实时快讯 # https://wallstreetcn.com/live/global?from=navbar import requests import json header ...

  5. Neo4j-Apoc

    Neo4j-Apoc APOC https://neo4j-contrib.github.io/neo4j-apoc-procedures/#_virtual_nodes_rels 提供的函数 存储过 ...

  6. Python xlwt模块

    Examples Generating Excel Documents Using Python’s xlwt Here are some simple examples using Python’s ...

  7. 廖雪峰Java11多线程编程-3高级concurrent包-3Condition

    Condition实现等待和唤醒线程 java.util.locks.ReentrantLock用于替代synchronized加锁 synchronized可以使用wait和notify实现在条件不 ...

  8. eval()方法与str()方法

    eval()方法与str()方法 #_author:Administrator#date:2019/10/31 a={ 'q':{'xxx':3456}}#将一个字典转换成一个字符串a=str(a)p ...

  9. c语言学习笔记 - 指针和字符串

    前面学习了字符串是一种字符数组,又知道了指针变量和数组的关系,这里来看一下指针和字符串的关系. #include <stdio.h> int main(void){ char str = ...

  10. java 获取本机所有IP地址

    import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import ...