一篇文章存成一个巨大的文件,总共大约有一亿个单词,要找出里面重复次数最多的。怎么做?
Hadoop是一把威力巨大的榔头,在使用过Hadoop之后,看着任何东西都想把它给map reduce了。有一个关于Jeff Dean的小笑话,说在睡不着觉的时候,一般人是数羊,Jeff Dean是map reduce他的羊群。所以,我的办法是,把这个文件拆分成若干个小文件,在map过程用hash算法保证相同的单词落入一个文件(这点很重要),计算单词出现次数,在reduce过程取得重复次数最多的单词来。
但是,只有一亿个单词,简单估算一下,一个字母占据两个字节,假设单词平均长度5,即便是最极端情况,这些单词里面没有重复,单词本身也就消耗1G而已;而实际上一篇文章单词的重复率是非常高的,这个数据量完全可以放在内存里面计算。还没完,不一定非得要用Hash,如果借由Trie树,可以节点压缩,占用更少的空间。
这只是一个用榔头来敲钉子的一个小例子而已,在我刚学算法的时候,那时候刚接触外排序,这样的问题我或许会第一反应使用外排序来做,在那个时候,这把榔头就是外排序。但实际上呢,外排序的效率比上面提到的方法都低得多,只有在内存实在不够用的时候才适合考虑(即便在内存不够用的情况下,我们依然可以利用hash,把大文件划分成若干个小到内存可以容纳为止的文件,分别计算以后在来归并求最大数,目的就是要尽量避免外排序带来的大量磁盘读写)。
如果再把思路放宽一点,真的需要统计所有的单词吗?其实对于一篇文章来说,其中的内容都是有文字意义的,换言之,只有很少的单词可能成为“重复最多”的,这个数量应该是非常非常有限的。比如在遇到一个“is”的时候,我们知道要把它列入统计范畴,但是遇到“distribution”这样的词呢,大可跳过。
还可以找得到很多这样的榔头,比如概率公式,C(m,n)和A(m,n),即组合数和排列数,对于某些概率、混合、排列的问题就用它来套;再比如常见的榔头——动态规划,学了以后看到求最优解问题就很想用DP来解;还有在数据量很大的情况下利用hash、区域划分等等“分而治之”的化简思想……但是,这些都是常规思路,就如同Top K问题用堆排序来求解,寻找“不出现”的单词就使用bit map,“不重复出现”的单词就使用2-bit map等等这样的问题一样,终归是简单粗暴那一类的。即便解决了问题,也没有给人眼前一亮的“巧妙”的感觉。
跳出算法,在很多工程问题上也有类似的体会。记得以前在做一个项目的单元测试,Easy Mock + Easy Mock Extension + Power Mock,这样一套库,mock的能力实在强大,几乎没有测试不了的代码了,于是就拿了这把榔头到处砸,却忘了单元测试的最终目的是什么,那一些代码是值得做单元测试的。后来利用ant给测试环境中,不关心逻辑的那一层,使用自己写的桩代码mock掉,并且去掉了好多价值不大的测试代码(在代码更新的时候测试代码需要同步维护,这个成本不划算,所以我们把一些价值有但不大的单元测试用例合并或者删除了),层次反而更清楚,测试代码反而更易懂了。
前些日子和我们组的数学达人讨论问题的时候他说,我们最常见的最通用的榔头,主要还是在“解空间的搜索”和“解的构造”这两方面。如果能构造,复杂程度往往就要低于搜索,这是一个递进;而另一方面,任何一个实际问题都是有额外信息的,通用的榔头却是不考虑这些实际信息的,就像这个求重复次数最多的单词问题一样,文件有多大、文件内存放的是一篇实际有意义的文章,等等(再比如如果这个文件里面不是一亿个单词,而是一亿个整数呢),这些都是额外的信息,这是另一个递进。利用这些,简化了问题,就可以杀鸡不用牛刀了吧。
文章系本人原创,转载请保持完整性并注明出自《四火的唠叨》
相关推荐
行业分类-电子-一种电动榔头
总之,钳工实训课程是一个全方位、多层次的教学过程,不仅教授技术技能,还关注学生的全面发展,为他们在机械行业中的职业生涯奠定坚实基础。通过实训,学生可以熟练掌握钳工操作,提升解决问题的能力,同时培养出...
榔头是一种常见的手工工具,主要由头部和柄部组成,广泛应用于建筑、维修和日常生活中。本实验报告详细介绍了榔头头部的制作工艺流程,旨在帮助学生理解金属特性和金属加工技术,提高动手能力和创新精神。 **1. ...
学习任务三——錾口榔头的制作,是一个实践性强、涉及多方面技能的学习项目,旨在提升学生的钳工技能和工艺理解。在这个任务中,学生需要完成以下知识点的学习和实践: 1. 材料识别与选用:学生需要了解錾口榔头...
榔头的制作工艺是一项集金属加工技术、力学原理以及艺术美感于一体的手工技艺。通过对45号钢材的选取和一系列精细的加工步骤,我们可以了解到金属材料的特性和加工技巧。 首先,榔头头的制作分为以下几个关键步骤:...
电子政务-多功能电动榔头.zip
故事围绕一个货色箱展开,这个箱子里装满了各式各样的工具,如榔头、钉子等。通过讲述这些小工具之间的对话和比赛,故事巧妙地传达了每个工具都有其独特功能的信息。 活动目标明确,首先是让幼儿通过故事认识到货色...
在《钳工做榔头实训报告》中,钳工实训是针对机械、机电专业学生的一项重要教学活动,旨在培养学生的实践操作技能和基础知识。下面将详细阐述实训报告中的关键知识点。 1. **实训课程性质和任务**:钳工实训是一门...
电子政务-带有钉盒的电动榔头.zip
重罚阿里的“榔头”能否敲醒互联网巨头.pdf
例如,榔头是一种常见的工具,它的主要用途是敲打钉子或进行其他修理工作,矮小而结实的设计使得它能够应对各种维修任务。剪刀则是多才多艺的助手,无论是裁剪纸张、布料,还是修剪植物,它都能胜任,尤其对于孩子们...
3、“如果你手里只有榔头,世上一切在你看来都是钉子。” 这是一种思维局限性的警示。在IT行业,专业技能和工具固然重要,但过于依赖单一技能或工具可能会限制视野。提倡多元化技能和跨学科知识,以更全面的视角解决...
在车削过程中,我们经历了从粗车到精车的整个过程,制作出了榔头把,这是一个既耗时又需要精确操作的任务。这个过程中,我体会到了工匠精神的不易,也锻炼了我的耐心和专注力。 接着是锻压环节,面对火炉和铁砧,我...
4.1 只有当你的工具是一把榔头的时 候,任何事情才会像一颗钉子 64 4.2 autocad的dxf文件格式 64 4.3 文件头段 64 4.4 表段 64 4.5 块段 65 4.6 图形实体段 65 4.7 非图形对象段 65 4.8 autolisp[-]autocad ...
这段代码将生成一个介于-100到100之间的随机整数,并将其赋值给变量x。 二、If...Then...Else语句 If...Then...Else语句是Scratch2.0中的一种控制流语句,用于实现条件判断和执行相应的操作。在打地鼠游戏中,我们...
使用榔头和钉子时,需确保周围环境安全,防止意外发生。 总的来说,小物品的大麻烦主要体现在安全问题上。在享受小物品带来的便捷时,我们不能忽视它们潜在的危险性。通过提高安全意识,正确使用和妥善保管这些小...
在实际生活中,杠杆广泛应用于各种工具,如羊角榔头、老虎钳和开瓶器都是省力杠杆,而火钳、筷子和镊子则属于费力杠杆。尽管费力杠杆在使用时需要更多力气,但它们往往具有操作灵活的优点,比如镊子和钓鱼竿。杠杆...