“Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих” обзор книги

Приветствую! Последнее время я много читаю для развития в профессиональном плане, для закрытия пробелов в знаниях, для расширения кругозора и предметной области, для повторения забытого материала. Моя книжная полка содержит литературу, связанную с разработкой программного обеспечения, архитектурой, языком программирования Си++ и другие книги на схожую тематику. Чтобы материал лучше усваивался полезно периодически повторять и вспоминать, поэтому я решил запустить новую рубрику с обзорами книг. Это позволит мне ещё раз вспомнить и прокрутить в голове содержание книги и поделиться мнением о книге, стоит ли её приобретать или это информационный мусор с некачественным переводом, ляпами, опечатками и ужасным оформлением, выпущенная горе-издателем с целью лишь бы что-то продать. Профессиональная литература стоит не дешево, но качество выпускаемых книг очень разное, поэтому если вы думаете стоит ли приобретать и изучать ту или иную книгу или нет, то эта рубрика будет кстати. Я и сам часто читаю отзывы на книгу перед покупкой и буду рад, если вы поделитесь отзывом на другие книги схожей тематики. 

Первой книгой для обзора стала книга Адитьи Бхаргавы “Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих” издательства “Питер”. 

Каждый кто впервые видел название книги обращал внимание на незнакомое и непонятное слово “грокаем”. Что же означает “грокать”? Ответ на этот вопрос приведен там же, прямо на обложке книги в виде цитаты:

“Грокнуть” означает понять так полно, что наблюдатель становится частью объекта наблюдения…

Р. Хайнлайн – американский писатель-фантаст 
Содержание статьи

1. Содержание 
2. Изложение материала 
3. Примеры и аналогии из жизни 
4. Оформление, печать, общее впечатление
5. Итоговая оценка и заключение
Адитья Бхаргава “Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих”
Обложка книги

1. Содержание

Книга содержит описание широкого круга базовых алгоритмов и структур данных. Первые главы знакомят с понятием бинарного поиска и оценкой худшего времени выполнения алгоритма, известного как “О-большое”. Далее следуют несколько глав о сортировках с картинками и примерами, другие несколько глав посвящены структурам данных. Для каждой структуры приводится оценка времени выполнений базовых операций и аналогия из жизни. Этот трюк позволяет не учить значения “О-большое”, а поняв аналогию всегда легко и быстро самостоятельно воспроизводить этот параметр. 

Не обходится повествование без хэш-таблиц и графов. Приводится описание и реализация алгоритмов поиска в ширину и в глубину.  

Одна из глав посвящена жадным алгоритмам, другая динамическому программированию. Предпоследнюю главу я бы назвал поверхностным знакомством с машинным обучением. Читателя знакомят с двумя простейшими алгоритмами для построения рекомендательной системы.  

Последняя глава знакомит с кратким изложением других широко распространённых алгоритмов: SHA, фильтр Блума, MapReduce, преобразование Фурье и другие. В конце представлен список алгоритмов для дальнейшего самостоятельного изучения. В целом эта глава подсказывает заинтересованному читателю куда можно двинуться далее, после прочтения книги. 

2. Изложение материала

В книге множество простых и минималистичных иллюстраций и пояснений, многие построены на житейских аналогиях. Для некоторых алгоритмов приведены примеры реализации на языке Python. Изложение идёт последовательно от первой главы до последней, часто на основе предыдущей главы строится введение в следующую.  

Материал подается простым доступным языком, читается очень легко, как говорится “взахлеб”, начав чтение остановиться уже невозможно. Я так пару раз свою станцию метро проезжал. Объяснение построено последовательно, поэтому книга подойдет даже тем, кто не имеет абсолютно никакого опыта, можно смело давать и детям, интересующимся программированием.  

Единственный нюанс на мой взгляд, мне не понравилось разъяснение динамического программирования. Пришлось по нескольку раз перечитать, обратиться к внешним источникам, проделать самостоятельно, не подглядывая в книгу все примеры, и тогда в голове более-менее сложился пазл-представление о том, как работает динамическое программирование. 

3. Примеры и аналогии из жизни

В качестве жизненной аналогии очень понравилась оценка сложности простейших операций с массивом на примере библиотеки. Привожу пример из книги в вольном пересказе: 

Представьте библиотеку, большую библиотеку, и перед вами стоит две задачи: найти книгу в библиотеке и добавить новую книгу. Конечно же, в этой задачи книги хранятся в отсортированном виде. Если известен индекс книги (её адрес: № шкафа, № полки и позицию книги на полке), например подсказал библиотекарь, где лежит эта книга, то можно найти книгу очень быстро – просто прийти и взять её. В этом случае книга найдена за константное время O(1). Если индекса нет, то придётся потратить побольше времени. Можно пойти к полке в центре зала, посмотреть на какую букву там книги и понять в какой половине зала вам искать эту книгу. Затем пойти к среднему шкафу в оставшейся половине зала и повторить операцию. Это алгоритм бинарного поиска и его сложность по времени пропорциональна O(lg(n)), где n – количество книг в библиотеке.  

Переходим к ситуации, когда в библиотеку поступила новая книга и надо поставить её на нужное место. Тут и начинается самое сложное и интересное. Найти место можно бинарным поиском, но чтобы поставить книгу в шкаф, необходимо все последующие книги сдвинуть на одно место вправо! Не только полку, а весь шкаф и все полки во всех последующих шкафах! Худшим случаем будет ситуация, когда книга должна заняться самое первое место, а значит все n-книг в библиотеке необходимо будет передвинуть. Сложность этой операции в худшем случае равна O(n). 

4. Оформление, печать, общее впечатление

Общее впечатление о книге оцениваю на отлично! Оформление выполнено качественно, опечаток не припомню, откровенных ляпов и кривого перевода тоже. Бумага плотная, белая, приятная на ощупь, контрастная печать, приятный шрифт. Издательство не подкачало, отработали качественно!  

5. Итоговая оценка и заключение

Итак, подводя итоги, я решил оценивать, эту и последующие в этой рубрике книги, по следующим параметрам: 

  • Содержание – 5  
  • Изложение материала – 5 
  • Примеры, пояснения и аналогии – 4 
  • Иллюстрации и примеры кода – 5 
  • Качество печати, перевода, бумаги, отсутствие опечаток и ляпов – 5 
  • Порекомендовал бы я её кому-то ещё? – 5 

Итоговая оценка книги “Грокаем алгоритмы”: 4,83.

А вы читали Грокаем алгоритмы? Поделитесь мнением в комментариях. 

В следующий раз на обзор попадет книга Скотта Майерса “Эффективное программирование C++. 42 рекомендации по использованию С++11 и С++14” 

Книга Скотта Майерса “Эффективное программирование C++. 42 рекомендации по использованию С++11 и С++14”
Книга Скотта Майерса “Эффективное программирование C++. 42 рекомендации по использованию С++11 и С++14”

Удачи!