Обзор
Книга состоит из 11 глав, хотя первая — это что-то вроде введения (глава так и называется "Знакомство с алгоритмами"), а последняя — это скорее про то, что можно (и по-хорошему нужно) изучать далее и то, что эта книга не покрыла в полной мере (например, MapReduce, фильтр Блума, SHA и прочее). А что же эта книга покрыла? Давайте немного разберёмся.
Во-первых, в книге упоминается про сложность алгоритмов и так называемое «О» большое. И поверьте, подавляющее большинство курсов, рассказывающих о программировании, учат чему-то узкоспециализированному, но лишь в очень редких случаях рассказывают о сложности выполнения алгоритма и оптимизации кода.
Что касается затрагиваемых тем, то постараюсь их бегло разобрать в этом абзаце.
Сначала идёт глава про массивы и связные списки и о том, как с ними работать (в плане сортировки и поиска информации). Перечисляются преимущества и недостатки списков (с точки зрения скорости чтения, записи и хранения информации).
После этого идёт небольшая глава про рекурсию. Затрагиваются тематики стека и стека вызовов.
Далее идёт быстрая сортировка (на примере подхода "разделяй и властвуй"). Для большего закрепления понимания алгоритма "разделяй и властвуй" автор приводит три примера. Затрагивается тематика опорного элемента, и в виде графиков сравниваются скорости выполнения различных вариантов сортировок (в том числе и из прошлых глав).
Следующий раздел посвящён новому типу данных, а скорее базовой структуре — хеш-таблицам. Перечисляются случаи, когда и где нужно их использовать (например, исключение дубликатов, кэширование, моделирование отношений между объектами). Рассмотрены и описаны случаи коллизий.
Далее начинается знакомство с такой структурой данных, как графы. Нет, здесь и близко не покрыты все тематики, которые я изучал на предмете "Математическое моделирование", но по крайней мере затронуты основные понятия графа, его назначение и область применения, рассмотрена и направленность графа. Ну и так как графы — это про "пути", то среди алгоритмов здесь разобраны поиск в ширину и нахождение кратчайшего пути. Именно в этой главе идёт упоминание о очередях и снова о стеке, разобраны FIFO и LIFO, хотя, как по мне, это стоило бы рассмотреть в предыдущих главах. Кстати, на графы отведены сразу 2 главы. И если в первой мы искали кратчайший путь в невзвешенном графе, то во второй главе речь идёт о поиске кратчайшего пути во взвешенном. Для такого поиска использовался алгоритм Дейкстры. Ну и примеров также несколько: сначала абстрактный, а потом уже непосредственно на языке программирования. Про алгоритм Беллмана-Форда (нахождение кратчайшего пути в графах, содержащих рёбра с отрицательным весом) автор ничего не показал и оставил на самоизучение.
В завершении книги идут реже используемые в классическом и повседневном программировании задачи и алгоритмы. Например, разобраны "жадные алгоритмы" и описано то, как браться за невозможные задачи, не имеющие быстрого алгоритмического решения (NP-полные задачи), динамическое программирование — метод решения сложных задач, разбиваемых на подзадачи, и алгоритм k ближайших соседей, используемый в машинном обучении.
Особенности
В книге есть иллюстрации, которые помогают, дополняют и визуализируют информацию. Также в каждой главе можно встретить по 5–7 практических вопросов. Фактически это просто вопросы без кода (хотя в некоторых случаях и с кодом), в конце книги есть ответы на вопросы для самопроверки. По завершении каждой главы есть так называемая "шпаргалка" — некое саммари главы в виде 4–5 предложений.
По объёму книга около 300 страниц, плюс главы не сильно большие, а значит, велика вероятность, что любой, кто её открыл, дочитает до конца. Читается легко и быстро.
Заключение
Хорошая книга для тех, кто вошёл в программирование без технического образования. Достаточно простым языком рассказывается про возможные варианты сортировок и поиска (бинарный поиск, поиск в глубину и ширину). Затрагивается важная тема сложности/скорости выполнения алгоритма «О» большое. Есть даже такие темы, как графы и нахождение кратчайших путей, алгоритм k ближайших соседей и некоторые другие темы, которые обязан хотя бы на базовом уровне знать каждый программист.