给我一把榔头,满世界都是钉子
一篇文章存成一个巨大的文件,总共大约有一亿个单词,要找出里面重复次数最多的。怎么做? Hadoop是一把威力巨大的榔头,在使用过Hadoop之后,看着任何东西都想把它给map reduce了。有一个关于Jeff Dean的小笑话,说在睡不着觉的时候,一般人是数羊,Jeff De
一篇文章存成一个巨大的文件,总共大约有一亿个单词,要找出里面重复次数最多的。怎么做?
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掉,并且去掉了好多价值不大的测试代码(在代码更新的时候测试代码需要同步维护,这个成本不划算,所以我们把一些价值有但不大的单元测试用例合并或者删除了),层次反而更清楚,测试代码反而更易懂了。
前些日子和我们组的数学达人讨论问题的时候他说,我们最常见的最通用的榔头,主要还是在“解空间的搜索”和“解的构造”这两方面。如果能构造,复杂程度往往就要低于搜索,这是一个递进;而另一方面,任何一个实际问题都是有额外信息的,通用的榔头却是不考虑这些实际信息的,就像这个求重复次数最多的单词问题一样,文件有多大、文件内存放的是一篇实际有意义的文章,等等(再比如如果这个文件里面不是一亿个单词,而是一亿个整数呢),这些都是额外的信息,这是另一个递进。利用这些,简化了问题,就可以杀鸡不用牛刀了吧。
文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接《四火的唠叨》

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

一、今日头条发布文章怎么才能有收益?今日头条发布文章获得更多收益方法!1.开通基础权益:原创文章选择投放广告可获得收益,视频必须要原创横屏才会有收益。2.开通百粉权益:粉丝量达到百粉以上,微头条、原创问答创作及问答均可获得收益。3.坚持原创作品:原创作品包含文章、微头条及问题等,要求300字以上。注意违规抄袭作品作为原创发布,会被扣信用分,即使有收益也会被扣除。4.垂直度:做专业领域一类的文章,不能随意跨领域写文章,会得不到合适的推荐,达不到作品的专和精,难以吸引粉丝读者。5.活跃度:活跃度高,

诺曼底登陆将迎来80周年纪念,《坦克世界》一整个月的活动和特惠将围绕着“霸王行动”展开——全新的PvE模式、具有主题的战斗通行证、全新前线模式发布,以及为期一个月的诺曼底行动令牌商店即将开启。行动地图6月3日至6月30日,探索诺曼底海滩并收集最多90个诺曼底行动令牌:从该地图上获取36个、通过完成每日任务获取另外54个。查看交互式地图并了解各个活动的开始日期,然后立即开始获取令牌,或者解锁特殊的令牌任务。利用地图了解诺曼底行动相关活动的详情,获取足够的诺曼底行动令牌后,您即可前往诺曼底行动令牌商

在今天的移动设备时代,手机已经成为我们生活中不可或缺的一部分。而如果你对编程有兴趣,手机上的Java编程软件将会让你的手机变成一个强大的开发工具。本文将介绍五款你不可错过的手机Java编程软件,帮助你更好地探索编程的世界。AIDEAIDE是一款功能强大的手机Java编程软件,它提供了完整的Java开发环境,包括代码编辑器、编译器、调试器等。它支持多种开发项目

抢先开启任务宝库,规划战斗先人一步,《战舰世界》13.3版本现已开启。了解新版本作战任务和战斗类型的所有重要信息,有助于舰长们规划整体战斗,快速获取相关奖励。13.3版本中,备受舰长期待的非对称战斗模式回归。舰长们需要操纵战舰,对抗等级上更低、但数量上更多的AI战舰。这一模式非常适合组队进行游玩,最多可由5名玩家构成小队并肩战斗,更加默契的配合,能够帮助您快速击败对方。在13.3版本期间,所有舰长都有机会集齐索姆河收藏,从而获得这艘IX级驱逐舰。这一任务的需求也非常简单,那就是在下个版本发布前赢

全新B系自行反坦克炮研发分支刚刚加入《坦克世界》,其高等级成员可射击星形弹托APCR炮弹,能对近距离目标造成毁灭性损伤。为了欢迎这些独特坦克的到来,《坦克世界》将在4月19日17:00至4月26日17:00特别推出「枪骑兵冲锋」限时活动。该活动将开放2套任务。完成这些任务,并收集白鹰令牌。使用该令牌还可兑换自选奖励,此外,军械库和特惠商城中也将上架包含令牌的特惠礼包!·整个活动期间,系统将开放全新B系自行反坦克炮专属任务。每个任务每天可完成数次,完成任务即可获得白鹰令牌和额外乘员经验·活动每天还

七日世界是一款多人在线生存射击游戏,玩家将在一个末日世界下,与自己的好友并肩收集资源只为了活下去,在此之中也会遇到各种各样不同的问题,小编已经把这些问题的答案总结出来了,一起来看看这篇七日世界全攻略汇总。七日世界攻略大全七日世界攻略大全什么时候正式上线是网游还是手游官网远归之蝶怎么养摩托车怎么获得腐影猎手怎么打海尔斯的移动房屋攻略七日世界摩托车怎么获得答:收集材料合成部件即可制作摩托车。详细介绍1、想要制造摩托,首先玩家需要收集相应的零件,而零件需要去地图探索才有。2、在任务和日常探索中,可以获

终极先锋紧急集结!《坦克世界》×《星际迷航》联动活动即将于5月2日正式开启!进取号曲速核心中的反物质被神秘的不明物体窃取,利用您的战车驾驶技术与其他船员竞争,回收反物质并研究不明物体。任务进度奖励包括独特的《星际迷航》主题内容——包括3位标志性的《星际迷航》角色:詹姆斯·T·柯克舰长、斯波克指挥官、妮欧塔·乌乎拉通信专家,所有这些乘员都带有专属语音。将他们指派到您的坦克上,加入标准模式战斗!完成每日活动任务还可获取2D风格、贴花和签名,以及1个猎户星补给箱。神秘的不明物体正在小行星表面以奇怪的排

淘宝大赢家3月10日问题:世界上唯一没有蚊子的国家是哪里?有很多用户不知道世界上唯一没有蚊子的国家是哪里?,那么接下来小编就为大家带来了3.10淘宝大赢家每日一猜今日答案分享,感兴趣的小伙伴快来了解一下吧。淘宝每日一猜答案大全淘宝大赢家3月10日:世界上唯一没有蚊子的国家是哪里?问题:世界上唯一没有蚊子的国家是哪里?答案:C.冰岛答案解析:1、点击进来找线索,在如下图的页面即可找到问题的答案;2、世界上唯一没有蚊子的国家是冰岛;3、冰岛位于北极圈附近,全年12个月中8个月平均气温都在5℃以下,这
