簡単に言えば、1986 年にあるインタビュアーが Donald Knuth に、入力にテキストと数字 N を取り、最もよく使われる N 個の単語を頻度順に並べてリストするプログラムを書くように依頼しました。Knuth は 10 ページの Pascal プログラムを作成し、Douglas McIlroy は次の 6 行のシェル スクリプトで応答しました。
tr -cs A-Za-z '\n' |
tr A-Z a-z |
sort |
uniq -c |
sort -rn |
sed ${1}q
全文はhttp://www.leancrew.com/all-this/2011/12/more-shell-less-egg/でお読みください。
もちろん、両者の目標は大きく異なっていました。Knuth は、読み書きのできるプログラミングの概念を示し、すべてをゼロから作成しました。一方、McIlroy は、いくつかの一般的な UNIX ユーティリティを使用して、最短のソース コードを作成しました。
私の質問は:それはどれほど悪いですか?
(純粋にランタイム速度の観点から言えば、6 行のコードは 10 ページよりも理解しやすく維持しやすいという点で、私たち全員が同意していると確信しているため、プログラミングの知識があるかどうかは関係ありません。)
sort -rn | sed ${1}q
一般的な単語を抽出する最も効率的な方法ではないことは理解できますが、何が問題なのtr -sc A-za-z '\n' | tr A-Z a-z
ですか? 私にはかなり良さそうです。についてsort | uniq -c
、それは周波数を決定するのに非常に遅い方法ですか?
いくつかの考慮事項:
tr
線形時間にする必要があります (?)sort
確信は持てませんが、それほど悪くはないと思いますuniq
線形時間も必要です- 生成プロセスは線形時間 (プロセス数) である必要があります