![](https://habrastorage.org/getpro/habr/upload_files/e4e/dea/d32/e4edead32e144c22e22121e989f556ab.jpg)
Всем доброго времени суток!
Публикую обзор книги "Грокаем алгоритмы".
Автор: Адитья Бхаргава
Стоит читать? Да! Почему? Опишу в статье.
Алгоритмы - важны для программиста, а это лучшая книга для начала их изучения с нуля.
![](https://habrastorage.org/getpro/habr/upload_files/b3e/029/e9f/b3e029e9f1f3d309a43aceecae2751a0.png)
Кто целевая аудитория книги?
Книга отлично подойдет для тех, кто решил для себя познакомиться с тематикой алгоритмизации.
Также книга подойдет для тех людей, что ранее пробовали изучать данную тему, но утонули в океанах огромных книг и заумных сайтов, что по итогу, своей сложностью подачи материала, сбивали лишь с толку.
Что в книге?
Книга состоит из 11 глав, что затрагивает такие темы как бинарный поиск, сортировка, рекурсия, хеш-таблицы, динамическое программирование и многое, многое другое.
Для начала, чтобы было предметное понимание, что представлено в книге, ознакомимся с её оглавлением.
![Рис.1. Оглавление Рис.1. Оглавление](https://habrastorage.org/getpro/habr/upload_files/77f/093/6d6/77f0936d64fa30deebe54e33e6635eee.png)
![Рис.1.2. Оглавление Рис.1.2. Оглавление](https://habrastorage.org/getpro/habr/upload_files/6d7/b76/ea7/6d7b76ea775c98e03c3c3bb53e19b379.png)
![Рис.1.3. Оглавление Рис.1.3. Оглавление](https://habrastorage.org/getpro/habr/upload_files/d23/c1d/824/d23c1d82458c125bdcb74a84771f06b9.png)
Каждая глава по своему уникальна и ценна , вследствие чего предлагаю рассмотреть каждую главу отдельно.
Глава.1. Знакомство с алгоритмами
![Рис.1.5. Разговорот первой главы Рис.1.5. Разговорот первой главы](https://habrastorage.org/getpro/habr/upload_files/f74/940/3e2/f749403e20ce54e0b1b221ea8a3023a3.png)
В данной главе, автор знакомит нас с алгоритмами и это знакомство начинается с бинарного поиска.
Бинарный поиск прекрасно рассмотрен на примере игры "Угадай число". Автором предложено читателю загадать число от 1 до 100. При каждой попытке угадать число, ваша задача ответить "много", "мало" или же "угадал".
Плохим способом в данном случае является перебор всех чисел подряд, что влечет за собой сценарий из 100 попыток.
Пример бинарного поиска в задаче "Угадай число".
Начинать угадывать искомое число с числа "50". Мало? Пробуем число "75". Много? Пробуем сузить диапазон возможного расположения искомого числа и пробуем "63". Основная особенность в том, что благодаря бинарного поиску, какое бы число в диапазоне от "1" до "100" вы бы не загадали, его можно будет угадать не более чем за 7 попыток.
В этом и есть магия бинарного поиска, что раскрывается в этой книге. Идём дальше.
Глава.2. Сортировка выбором
![Рис.2.1 Глава 2 - сортировка выбором Рис.2.1 Глава 2 - сортировка выбором](https://habrastorage.org/getpro/habr/upload_files/fad/0b5/6b2/fad0b56b2b6890776ae35cfb6b687c2b.png)
В этой главе автор рассказывает о том, как устроена память компьютера,что из себя представляют массивы и связные списки и то, как устроен алгоритм сортировки выбором. Обо всём по порядку.
Как устроена память
Автор предлагает представить память компьютера в виде большого шкафа с огромным количеством ящиков внутри. Каждый ящик имеет свой собственный адрес. В случае, когда нам требуется сохранить что-либо в памяти, мы запрашиваем у компьютера место в его памяти, он в ответ нам выдает адрес для сохранения нашей информации. Для сохранения информации присутствуют два основных способа, массивы и сортировка.
Сортировка выбором.
Возможно, самый простой в реализации алгоритм сортировки. Как и в большинстве других подобных алгоритмов, в его основе лежит операция сравнения. Сравнивая каждый элемент с каждым, и в случае необходимости производя обмен, метод приводит последовательность к необходимому упорядоченному виду.
Достаточно легкий для понимания алгоритм, но его недостатком является то, что он очень медленно работает.
Глава 3. Рекурсия
![Рис.3.1 Глава 3 - рекурсия Рис.3.1 Глава 3 - рекурсия](https://habrastorage.org/getpro/habr/upload_files/eed/85e/264/eed85e2646bbd332ca4cc7b735143373.png)
В третьей главе автор подробно и довольно таки удачно рассказывает о том, что такое рекурсия на примере старого бабушкиного чемодана.
![Рис.3.2 Рекурсия Рис.3.2 Рекурсия](https://habrastorage.org/getpro/habr/upload_files/a82/56c/d78/a8256cd781f2f2e7340b982ab55701c0.png)
Глава 4. Быстрая сортировка
![Рис.4. Глава 4 - быстрая сортировка. Рис.4. Глава 4 - быстрая сортировка.](https://habrastorage.org/getpro/habr/upload_files/da1/f5e/2a7/da1f5e2a76392dc02f208326e7b99414.png)
Автор предлагает нам познакомиться со стратегией "Разделяй и властвуй", что отлично подходит для тех случаев, когда решаемая вами задача, не решается ни одним из ранее известных алгоритмов. Предлагаю вам ознакомиться с этой удивительной стратегией, что сопровождается соответствующими иллюстрациями.
![Рис.4.2 Стратегия "Разделяй и властвуй" Рис.4.2 Стратегия "Разделяй и властвуй"](https://habrastorage.org/getpro/habr/upload_files/13a/2c8/e4b/13a2c8e4b737002d55ffffcd1fde14b5.png)
![Рис.4.3 Стратегия "Разделяй и властвуй" Рис.4.3 Стратегия "Разделяй и властвуй"](https://habrastorage.org/getpro/habr/upload_files/7ff/06a/71e/7ff06a71eb5f1b7fa994577f60ac6f79.png)
![Рис.4.4 Быстрая сортировка Рис.4.4 Быстрая сортировка](https://habrastorage.org/getpro/habr/upload_files/124/75c/161/12475c1619cc2b847ee0108922010c44.png)
Также в 4-й главе автором подробно рассматривает алгоритм быстрой сортировки, что часто применяется на практике и как раз таки успешно успешно использует стратегию "Разделяй и властвуй".
Глава.5. Хеш-таблицы
![Рис.5.1 Глава 5 - хеш-таблицы Рис.5.1 Глава 5 - хеш-таблицы](https://habrastorage.org/getpro/habr/upload_files/c2c/e33/e64/c2ce33e64da0b4288415c6d10bb1352d.png)
Хэш-функция - функция, что получает строку ( набор байтов ) и возвращает обратно число. Хэш-таблицы - это структура данных, что связывает между собой ключи со значениями.
Коллизия - та ситуация, когда двум ключам назначают один элемент массива. Простейшее решение данной ситуации - это связный список в этом же элементе.
Отличительной особенностью хорошей хэш-функции создает минимальное количество коллизий.
Отлично проиллюстрировано использование хеш-таблиц для поиска.
![Рис.5.2. Использование хеш-таблиц для поиска Рис.5.2. Использование хеш-таблиц для поиска](https://habrastorage.org/getpro/habr/upload_files/534/f9b/f3b/534f9bf3b95fbc7d9f625f273f658303.png)
![Рис.5.3. Шпаргалка Рис.5.3. Шпаргалка](https://habrastorage.org/getpro/habr/upload_files/950/c79/439/950c7943908428b992a9ddc6593c8237.png)
Хорошим преимуществом данной книги является тезисная выжимка по главе в виде шпаргалки, что имеется в конце каждой главы. Идем дальше.
Глава 6. Поиск в ширину
![Рис.6.1. Глава 6 - Поиск в ширину Рис.6.1. Глава 6 - Поиск в ширину](https://habrastorage.org/getpro/habr/upload_files/738/90a/933/73890a9332039cdae92dc265c336fe66.png)
В данной главе автор предлагает нам научиться моделировать сети с помощью абстрактной структуру данных - графов. Автором прилагается достаточно подробное и удачно иллюстрированное описание того, что такое граф.
![Рис.6.2. Подробно иллюстрированное знакомство с графами Рис.6.2. Подробно иллюстрированное знакомство с графами](https://habrastorage.org/getpro/habr/upload_files/435/a33/a03/435a33a03ff4354495d23cb415788cdf.png)
Глава 7. Алгоритмы Дейкстры
![Рис.7.1. Глава 7 - алгоритм Дейкстры Рис.7.1. Глава 7 - алгоритм Дейкстры](https://habrastorage.org/getpro/habr/upload_files/7c2/54a/018/7c254a01800360bb8c23c29a47fd8e43.png)
Алгоритм Де́йкстры — алгоритм на графах, изобретённый нидерландским учёным Эдсгером Дейкстрой в 1959 году. Находит кратчайшие пути от одной из вершин графа до всех остальных. Алгоритм работает только для графов без рёбер отрицательного веса. Алгоритм широко применяется в программировании, например, его используют протоколы маршрутизации OSPF и IS-IS.
Глава 8. Жадные алгоритмы
![Рис.8.1 Глава 8 - Жадные алгоритмы Рис.8.1 Глава 8 - Жадные алгоритмы](https://habrastorage.org/getpro/habr/upload_files/153/fa8/c47/153fa8c47bcbce3897dd039e51d8ea2d.png)
Жадный алгоритм — алгоритм, заключающийся в принятии локально оптимальных решений на каждом этапе, допуская, что конечное решение также окажется оптимальным. Известно, что если структура задачи задается матроидом, тогда применение жадного алгоритма выдаст глобальный оптимум. Штука нужная и для кругозора также полезна.
Глава 9. Динамическое программирование
![Рис.9. Динамическое программирование Рис.9. Динамическое программирование](https://habrastorage.org/getpro/habr/upload_files/338/17d/7e2/33817d7e2f02ae22690d641dc4e184b2.png)
Динамическое управление - является способом решения сложных задач посредством разбиения их на более простые задачи.
Практическая польза динамического программирования в том, чтобы сократить количество вычислений, благодаря решению каждой подзадачи лишь единожды.
Глава 10. Алгоритм k ближайших соседей
![Рис.10. Глава 10 - Алгоритм k ближайших соседей Рис.10. Глава 10 - Алгоритм k ближайших соседей](https://habrastorage.org/getpro/habr/upload_files/134/f3e/7b0/134f3e7b0ec7285911cdfc9f8b27fa60.png)
Метод k-ближайших соседей – популярный алгоритм классификации, который используется в разных типах задач машинного обучения. Наравне с деревом решений это один из самых понятных подходов к классификации. Поэтому, если интересуетесь машинным обучением, стоит изучить!
Глава 11. Что дальше?
![](https://habrastorage.org/getpro/habr/upload_files/bce/fb4/eb2/bcefb4eb2fc0b3618345e8d5b503b808.png)
По своему значению, возможно одна из самых важных глав этой книги, так как, в ней автор попытается подсказать дальнейшее направление в изучении алгоритмов и рассмотрит те алгоритмы, что не рассматривались в книге ранее.
Напишу тезисно то, о чем говорится в финальной главе:
1. Инвертированные индексы
2. Преобразование Фурье
3. Параллельные алгоритмы.
4. MapReduce
5. Для чего нужны распределенные алгоритмы?
6. Функция map
7. Функция Reduce
8. Фитльры Блума и HyperLogLog
Хотелось бы подвести итоги по книге.
Преимущества книги:
1. Средняя цена книги - до 1.000 рублей.
Цена на OZON - 975 р.
Цена на Wildberries - 945 р.
Цена на Читай-Город - 944 р.
Тот редкий случай, когда книга стоит своих денег. Безусловно, всегда хочется дешевле, но пока это одна из немногих книг, о приобритении которой я не пожалел. Сам покупал в марте за 1038 руб.
![](https://habrastorage.org/getpro/habr/upload_files/82c/b44/6ec/82cb446ec60f2f72ee4a331e29721913.png)
2. Подробно иллюстрированное описание всех алгоритмов и особенностей их работы. Зависит от человека, но лично я запоминаю информацию куда лучше, когда она идёт с описательными иллюстрациями. Тут уже индивидуально.
3. Реализация всех алгоритмов на Python.
Один из самых популярных ныне языков программирования, вследствие чего вариант реализации в книге всех алгоритмов на Python и достаточно подробное описание кода, является хорошим подспорьем для тех, кто учит Python и интересуется алгоритмами.
![](https://habrastorage.org/getpro/habr/upload_files/a59/a87/075/a59a8707561028516b8ae632d011ff45.png)
Недостатки книги:
Форма выполнения книги. Пожалуй, единственный недостаток книги.
Обложка мягкая, дело вкуса, но если постоянно носите с собой книгу, может помяться. Также плотно склеены с корешком книги страницы, вследствие чего просто раскрыть книгу, положить на стол и приступить к чтению не получится, страницы будут стремиться к закрытию. Опять же, дело вкуса, с учетом той полезной информации, что дается в книге, недостаток терпимый, хоть и не из приятных.
Заключение по книге
Изначально несколько раз пытался изучать программирование с книги "Алгоритмы. Построение и анализ." Но не смог преодолеть и сотни страниц. Не понравилось, что автор с самого начала обрушивал на читателя поток формул, от которых мозг начинал кипеть, сам же текст был наполнен тоской и унынием типичного университетского материала, вследствие чего необходимо было искать альтернативный источник концентрированной информации по алгоритмам и источник этот был найден в лице отличной книги под названием "Грокаем алгоритмы".
Более понятного объяснения алгоритмов ранее нигде не встречал. Всё расписано крайне подробно и объясняется буквально "на пальцах", дополнительно сопровождая объяснения работы алгоритмов информативными картинками, изображающими их работу.
Прочесть данную книгу советую абсолютно каждому программисту, независимо от уровня профессиональной подготовки.
Мой канал в телеграмм
Если статья показалась вам интересной, то буду благодарен за подписку на мой канал IT-старт t.me/it_begin , где я также публикую обзоры технической литературы и полезную информацию как для действующих, так и для начинающих программистов