给我一把榔头,满世界都是钉子
一篇文章存成一个巨大的文件,总共大约有一亿个单词,要找出里面重复次数最多的。怎么做? 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 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











1. 오늘 Toutiao에 기사를 게시하여 어떻게 돈을 벌 수 있습니까? 오늘 Toutiao에 기사를 게시하여 더 많은 수입을 얻는 방법! 1. 기본 권익 활성화: 기사의 원본은 광고를 통해 수익을 얻을 수 있으며, 동영상은 가로 화면 모드에서 원본이어야 수익을 얻을 수 있습니다. 2. 팬 100명 권리 활성화: 팬 수가 100명 이상에 도달하면 마이크로 헤드라인, 오리지널 Q&A 작성, Q&A 수익을 얻을 수 있습니다. 3. 독창적인 작품을 고집하라: 독창적인 작품에는 기사, 마이크로 헤드라인, 질문 등이 포함되며, 300단어 이상이어야 합니다. 불법 표절 저작물을 원작으로 출판할 경우 크레딧 점수가 차감되며, 수익금도 차감되므로 주의하시기 바랍니다. 4. 수직성: 전문 분야에서 기사를 작성할 때 분야를 넘나들며 마음대로 기사를 작성할 수 없으며 적절한 추천을 받을 수 없으며, 작품의 전문성과 정확성을 확보할 수 없으며 팬을 유치하기가 어렵습니다. 그리고 독자들. 5. 활동: 높은 활동,

D-Day 침공 80주년이 다가오면서 한 달 동안 월드 오브 탱크 이벤트와 특별 행사가 오버로드 작전을 중심으로 진행됩니다. 새로운 PvE 모드, 테마 배틀 패스, 새로운 전선 대격돌 모드 출시 등이 포함됩니다. long 노르망디 작전 토큰 스토어가 곧 오픈됩니다. 작전 지도 6월 3일부터 6월 30일까지 노르망디 해변을 탐험하고 최대 90개의 노르망디 작전 토큰을 수집하세요. 이 지도에서 36개, 일일 임무를 완료하면 또 다른 54개입니다. 대화형 지도를 확인하고 각 이벤트의 시작 날짜를 확인한 다음 지금 토큰 획득을 시작하거나 특별 토큰 퀘스트를 잠금 해제하세요. 노르망디 작전 관련 활동에 대해 자세히 알아보려면 지도를 사용하세요. 충분한 노르망디 작전 토큰을 얻은 후 노르망디 작전 토큰 딜러에게 갈 수 있습니다.

오늘날 모바일 시대에 휴대폰은 우리 삶에 없어서는 안 될 존재가 되었습니다. 프로그래밍에 관심이 있다면 휴대폰에 설치된 Java 프로그래밍 소프트웨어가 휴대폰을 강력한 개발 도구로 바꿔줄 것입니다. 이 기사에서는 프로그래밍의 세계를 더 잘 탐험하는 데 도움이 되는 놓칠 수 없는 다섯 가지 모바일 Java 프로그래밍 소프트웨어를 소개합니다. AIDEAIDE는 코드 편집기, 컴파일러, 디버거 등을 포함한 완벽한 Java 개발 환경을 제공하는 강력한 모바일 Java 프로그래밍 소프트웨어입니다. 다양한 개발 프로젝트를 지원합니다.

가장 먼저 임무 보물 창고를 열고 한발 앞서 전투를 계획하세요. "월드 오브 워쉽" 버전 13.3이 출시되었습니다. 새로운 버전의 전투 임무와 전투 유형에 대한 중요한 정보를 모두 알면 함장이 전반적인 전투를 계획하고 관련 보상을 빠르게 획득하는 데 도움이 됩니다. 버전 13.3에서는 선장들이 기다려온 비대칭 전투 모드가 돌아왔습니다. 함장은 레벨은 낮지만 수가 많은 AI 군함을 상대로 군함을 제어해야 합니다. 이 모드는 최대 5명의 플레이어가 팀을 구성하여 나란히 싸울 수 있는 팀 플레이에 매우 적합합니다. 패치 13.3 동안 모든 함장은 Somme 컬렉션을 수집하고 IX 단계 구축함을 획득할 수 있는 기회를 갖게 됩니다. 이 작업의 요구 사항도 매우 간단합니다. 즉, 다음 버전이 출시되기 전에 게임에서 승리하는 것입니다.

새로운 B 시리즈 자주 대전차포 연구 개발 부문이 "월드 오브 탱크"에 막 합류했습니다. 고위 구성원이 별 모양의 APCR 포탄을 발사하여 가까운 목표물에 막대한 피해를 입힐 수 있습니다. 이러한 독특한 탱크의 등장을 환영하기 위해 "World of Tanks"는 4월 19일 17시부터 4월 26일 17시까지 특별 기간 한정 이벤트 "Lancer Charge"를 시작합니다. 이 이벤트에서는 2개의 과제 세트가 열립니다. 다음 작업을 완료하고 White Eagle 토큰을 수집하세요. 토큰은 원하는 보상으로 교환할 수도 있으며, 토큰이 포함된 특별 패키지도 무기고 및 특별 행사 몰에서 구매할 수 있습니다! ·전체 이벤트 기간 동안 시스템은 새로운 B 시리즈 자주 대전차포에 대한 독점 임무를 공개합니다. 각 임무는 하루에 여러 번 완료할 수 있습니다. 임무를 완료하면 White Eagle 토큰을 얻을 수 있으며 매일 추가 승무원 이벤트가 지급됩니다.

Seven Days World는 종말의 세계에서 플레이어는 생존을 위해 친구들과 협력하여 자원을 수집하며, 이 과정에서 다양한 문제에 직면하게 됩니다. 7일간의 세계 가이드 요약을 살펴보겠습니다. Seven Days World Guide: Seven Days World Guide는 언제 정식 출시되나요? 온라인 게임인가요, 아니면 모바일 게임인가요? 공식 홈페이지: Far Returning Butterfly 오토바이 키우는 방법 썩은 그림자 사냥꾼 획득 방법 Hailes의 이동 주택과 싸우는 방법 세븐데이즈 월드 가이드 오토바이 획득 방법 정답 : 재료를 모으고 부품을 합성하여 오토바이를 만들어보세요. 자세한 소개 1. 오토바이를 만들려면 플레이어는 먼저 해당 부품을 수집해야 하며 지도에서 부품을 탐색해야 합니다. 2. 과제와 일일탐험에서 획득할 수 있는

궁극의 선봉대 긴급집결! "월드 오브 탱크" × "스타 트렉" 연계 이벤트가 5월 2일 공식적으로 시작됩니다! 엔터프라이즈의 워프 코어에 있는 반물질이 신비한 미지의 물체에 의해 도난당했습니다. 탱크 운전 기술을 사용하여 반물질을 회수하고 미지의 물체를 연구하기 위해 다른 승무원과 경쟁하세요. 임무 진행 보상에는 3명의 상징적인 Star Trek 캐릭터(James T. Kirk 선장, Spock 사령관, 통신 전문가 Nyota Uhura 등)를 포함한 독특한 Star Trek 테마 콘텐츠가 포함됩니다. 이 승무원들은 모두 자신의 목소리를 가지고 있습니다. 탱크에 할당하고 표준 모드에서 전투에 참여하세요! 일일 이벤트 작업을 완료하여 2D 스타일, 데칼, 서명은 물론 Orion 공급 상자도 획득하세요. 소행성 표면에서 신비한 미확인 물체가 이상한 배열로 움직이고 있습니다.

모든 단어가 그림이 되고, 모든 문장이 시가 됩니다. '월드 오브 워쉽'의 세계 중국의 날 활동이 진행됩니다. 투표에 참여하여 게임과 중국어의 아름다움을 가장 잘 표현하는 한자를 선택해 향후 전 세계의 더 많은 선장들이 중국 문화를 이해할 수 있도록 완장으로 게임에 추가될 예정입니다. 동시에 특별 전투 임무를 완료하여 영구 페인트를 획득할 수도 있습니다. 이제 '월드 오브 워쉽'과 관련되고 중국 문화적 의미를 지닌 20개의 한자가 선장의 선택을 기다리고 있습니다. 선장은 공식 홈페이지 지정 페이지에서 투표에 참여하고 자신이 좋아하는 한자를 선택할 수 있다. 가장 많은 표를 얻은 한자는 향후 새로운 완장으로 게임에 추가될 예정입니다! "하늘", "땅", "도", "공격", "방어", "대포"와 같은 한자가 완장으로 게임에 추가될지는 주장에 의해 결정됩니다. 투표 페이지: h
