给我一把榔头,满世界都是钉子
一篇文章存成一个巨大的文件,总共大约有一亿个单词,要找出里面重复次数最多的。怎么做? 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ヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









1. 今すぐ Toutiao の記事を公開してどうやってお金を稼ぐことができますか?今すぐ Toutiao で記事を公開して収入を増やす方法! 1. 基本的な権利と利益の有効化: オリジナルの記事は広告によって利益を得ることができますが、利益を得るにはビデオが横画面モードでオリジナルである必要があります。 2. ファン100人の権利を有効化:ファン数が100人以上に達すると、マイクロヘッドライン、オリジナルQ&A作成、Q&Aから利益を得ることができます。 3. オリジナル作品にこだわる: オリジナル作品には記事、小見出し、質問などが含まれ、300 ワード以上であることが求められます。違法に盗用された作品をオリジナル作品として出版した場合、クレジットポイントが減点され、利益も差し引かれますのでご注意ください。 4. 垂直性:専門分野の記事を書く場合、分野を超えて自由に記事を書くことができず、適切な推薦が得られず、専門性や洗練度が得られず、ファンもつきにくいそして読者たち。 5. 活動: 高活動、

D デイ侵略が 80 周年に近づく中、1 か月にわたる World of Tanks のイベントとスペシャルは、新しい PvE モード、テーマ別バトル パス、新しいフロントライン モードのリリース、そして 1 か月間、オーバーロード作戦を中心に展開されます。長い ノルマンディー作戦トークンストアが間もなくオープンします。作戦マップ 6 月 3 日から 6 月 30 日まで、ノルマンディーのビーチを探索し、最大 90 個のノルマンディー作戦トークンを収集します。このマップから 36 個、毎日のタスクを完了することでさらに 54 個です。インタラクティブなマップをチェックして各イベントの開始日を確認し、今すぐトークンの獲得を開始するか、特別なトークン クエストのロックを解除してください。マップを使用して、ノルマンディー作戦関連の活動について詳しく学びましょう。十分なノルマンディー作戦トークンを入手したら、ノルマンディー作戦トークン ディーラーに行くことができます。

今日のモバイルデバイスの時代において、携帯電話は私たちの生活に欠かせないものとなっています。プログラミングに興味がある場合は、携帯電話上の Java プログラミング ソフトウェアを使用すると、携帯電話が強力な開発ツールに変わります。この記事では、プログラミングの世界をより深く探索するために欠かせない 5 つのモバイル Java プログラミング ソフトウェアを紹介します。 AIDEAIDE は、コード エディタ、コンパイラ、デバッガなどを含む完全な Java 開発環境を提供する強力なモバイル Java プログラミング ソフトウェアです。さまざまな開発プロジェクトをサポートします

誰よりも早くミッション宝庫を開いて、一歩先を行く戦闘を計画しましょう。「World of Warships」バージョン 13.3 が公開されました。新しいバージョンの戦闘ミッションと戦闘タイプに関する重要な情報をすべて知っておくと、艦長が全体的な戦闘を計画し、関連する報酬を迅速に獲得するのに役立ちます。バージョン 13.3 では、キャプテンが待ち望んでいた非対称戦闘モードが復活します。艦長は、レベルは低いが数が多い AI 軍艦に対して軍艦を制御する必要があります。このモードはチームプレイに非常に適しており、最大 5 人のプレイヤーがチームを組んで協力することで敵を素早く倒すことができます。パッチ 13.3 の間、すべての艦長はソンム コレクションを収集し、この Tier IX 駆逐艦を入手する機会が得られます。このタスクの要件も非常に単純です。つまり、次のバージョンがリリースされる前にゲームに勝つということです。

新しい B シリーズ自走対戦車砲の研究開発部門が「World of Tanks」に加わりました。その高レベルのメンバーは、近くの目標に壊滅的なダメージを与えることができる星形の APCR 砲弾を発射できます。これら個性豊かな戦車の登場を歓迎するため、『World of Tanks』では4月19日17:00から4月26日17:00まで、特別な期間限定イベント「ランサーチャージ」を開始します。このイベントでは 2 セットのタスクが開始されます。これらのタスクを完了して、白鷲トークンを収集します。トークンは、お好みの報酬と引き換えることもでき、トークンを含む特別なパッケージも武器庫と特別オファー モールで入手可能になります。 ·イベント全体を通じて、システムは新しい B シリーズ自走対戦車砲の専用ミッションを開きます。各ミッションは 1 日に複数回完了でき、ミッションを完了すると、ホワイト イーグル トークンを獲得でき、追加の乗組員経験値が毎日返済されます。

Seven Days World はマルチプレイヤー オンライン サバイバル シューティング ゲームです。終末の世界では、プレイヤーは生き残るために友達と協力してリソースを収集します。この過程で、プレイヤーはさまざまな問題にも遭遇します。編集者は次の答えをまとめました。世界への 7 日間のガイドの要約を見てみましょう。セブンデイズ ワールド ガイド: セブンデイズ ワールド ガイドはいつ正式にリリースされますか? オンライン ゲームですか、モバイル ゲームですか? 公式 Web サイト: 遥か帰蝶 バイクの育て方 腐ったシャドウ ハンターの入手方法 ヘイルズのモバイル ホームとの戦い方ガイド セブンデイズワールド バイクの入手方法 答え:素材を集めてパーツを合成してバイクを作ります。詳細な紹介 1. バイクを作成するには、プレイヤーはまず対応する部品を収集する必要があり、その部品をマップ上で探索する必要があります。 2. タスクや日々の探索で、以下のアイテムを入手できます。

この記事では、HTML5 で記事を追加する方法を学びます。 HTML5 の新しいセグメンテーション要素の 1 つはタグです。記事はタグを使用して HTML で表現されます。より具体的には、要素内に含まれるコンテンツは、サイトの残りのコンテンツとは (たとえ関連しているとしても) 異なります。 HTML5 に記事を追加する方法を理解するために、次の例を考えてみましょう。 例 1 次の例では、article 要素でインライン スタイルを使用しています。 <!DOCTYPEhtml><html><body><articlestyle="width:300px;border:2pxsolidgray;padding:

イーサリアムの拡張に関する @VitalikButerin の新しい記事の考えを理解するにはどうすればよいでしょうか?ヴィタリックのブロブ碑文の注文はとんでもないという人もいます。では、BLOB パケットはどのように機能するのでしょうか?カンクンでのアップグレード後に BLOB スペースが効率的に使用されないのはなぜですか?シャーディングの準備として DAS データの可用性をサンプリングしますか?私の意見では、Cancun のパフォーマンスはアップグレード後も使用可能であり、Vitalik は Rollup の開発を心配しています。なぜ?次に、私の理解について話させてください: これまでに何度も説明したように、Blob は EVM の呼び出しデータから切り離されており、コンセンサス層によって直接呼び出すことができる一時的なデータ パッケージです。直接的な利点は、EVM がアクセスする必要がないことです。トランザクションの実行時に BLOB のデータが読み取られるため、実行層の計算が低下します。
