一篇文章存成一个巨大的文件,总共大约有一亿个单词,要找出里面重复次数最多的。怎么做?
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. ...
榔头的制作工艺是一项集金属加工技术、力学原理以及艺术美感于一体的手工技艺。通过对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中的一种控制流语句,用于实现条件判断和执行相应的操作。在打地鼠游戏中,我们...
家庭、学校和社会都应承担起这一责任,将安全教育融入到日常生活的每一个细节中。 总结而言,这份“小物品大麻烦学习教案.pptx”为我们提供了一个全面的框架,来理解并应对日常生活中那些看似不起眼却可能引发大...
在实际生活中,杠杆广泛应用于各种工具,如羊角榔头、老虎钳和开瓶器都是省力杠杆,而火钳、筷子和镊子则属于费力杠杆。尽管费力杠杆在使用时需要更多力气,但它们往往具有操作灵活的优点,比如镊子和钓鱼竿。杠杆...