Короче говоря: в 1986 году интервьюер попросил Дональда Кнута написать программу, в которой вводится текст и число N, и перечислены N наиболее используемых слов, отсортированных по их частотам. Кнут выпустил 10-страниц Паскаль программу, в которой Дуглас Макилрой ответил со следующими 6 линий оболочки сценарий:WordCount: насколько неэффективно решение Макилроя?
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/.
Конечно, у них были разные цели: Кнут показывал свои концепции грамотного программирования и строил все с нуля, в то время как Макилрой использовал несколько общих утилит 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
должен быть линейное время тоже- Процессы нереста должны быть линейными (в количестве процессов)