Книга написана в 2013 году Томасом Корменом (Thomas H. Cormen), человеком, который является одним из четырёх авторов знаменитой книги Introduction to Algorithms (CLRS). Я наткнулся на эту книгу совершенно случайно, когда находился в поисках какой-нибудь книги по алгоритмам, которая будет проще CLRS. Т.е. я искал что-то, что можно использовать в качестве подготовительного материала к CLRS. Да, я в курсе, что CLRS не является действительно тяжёлой книгой, но, во-первых, она весьма объёмная, во-вторых, я предпочитаю сначала получить некоторый обзорный курс по изучаемой тематике, прежде чем углубляться в более подробное изложение. Поэтому я несколько раз начинал читать CLRS, но всегда забрасывал — нужно было что-то попроще прочитать. В качестве этого «попроще» я сначала выбрал Data Structures and Algorithms, которая мне не понравилась, поэтому поиск продолжался пока не привёл меня к этой книге.
В своих поисках я встречал много других вариантов книг, с которых советуют начать освоение алгоритмов, поэтому нельзя сказать, что это книга чем-то выделялась на фоне других. Кроме конечно же автора. Я посудил так: если я собираюсь осваивать CLRS, то что может быть лучше в подготовке к оному, чем книга от одного из её авторов? И, полагаю, я всё же не ошибся в своём выборе.
Итак, эта книга, в отличие от CLRS, не является учебником и написана в весьма неформальном стиле, что гарантирует отсутствие академической сухости в тексте. Это, безусловно, упрощает чтение, но не ждите от подобного подхода тогда и академической точности — этого в книге тоже нет. Как утверждает сам автор, книга рассчитана на широкий круг читателей, что, согласно представлениям самого автора, означает возможность прочтения сей книги людьми, которые ни разу не программировали и с математикой на «Вы». Мне кажется, что это в некотором роде лукавство, потому что при всей кажущейся простоте, без знания хотя бы основ программирования книгу читать будет сложновато. Я не считаю себя экспертом ни по алгоритмам, ни по математике, но всё-таки багаж знаний у меня в этих сферах приличный, пусть и разрозненный, и мне всё равно приходилось некоторые места перечитывать по несколько раз, чтобы понять как всё работает и почему. В этом моём непонимании, кстати, немаловажную роль сыграла поверхностность книги. Да, неформальность и отсутствие математической строгости позволяют легче продираться сквозь материал, но бывают моменты, когда хотелось бы понять на основании чего сделан тот или иной вывод, а математического обоснования нет. Т.е. нужно понимать, что эта книга является ознакомительной, и после неё нужно укреплять знания уже чем-то более серьёзным. Хотя, на мой взгляд, даже прочтение одной только этой книги даёт весьма неплохое понимание, что вообще творится с этими самыми алгоритмами, а это уже позволит определиться с тем, хотите ли вы дальше погружаться в этот мир или нет.
В книге довольно много иллюстраций и объяснений на пальцах, что позволяет легко разобраться в обсуждаемом алгоритме. Кроме того, в книге присутствует псевдокод, чтобы добавить строгости к картинкам и неформальному объяснению. Всё это делает процесс чтения непринуждённым, простым и довольно интересным. Что самое интересное, при том, что алгоритмы объяснены довольно неплохо, а книга довольно тонкая (~200 страниц), в ней представлено довольно много алгоритмов.
Книга начинается с того, что знакомит читателя с понятием алгоритма и тем, как она собирается его с ними знакомить (даются азы). После этого разбираются алгоритмы сортировки (быстрая, слиянием, бинарная, поразрядная и т.д), включая оценку каждой из них с использование O-нотации. Затем идет рассмотрение направленных ацикличных графов с некоторыми алгоритмами на ними.
Есть в книге и глава посвящённая строкам (небольшая), а также введение в криптографию и сжатие данных. Завершается же книга главой по так называемым сложным проблемам и проблеме P/NP. Как вы можете видеть, тем в книге раскрывается множество и по каждой из них можно написать крупную книгу. Взять ту же сортировку: у Д. Кнута целый том посвящён ей и этот том не в пример больше всей этой книги! Поэтому не стоит ждать от данной книги откровений и детального рассмотрение предложенных в ней тем. Как я уже сказал, она представляет собой поверхностный обзор некоторых алгоритмов из тех сфер компьютерной науки, с которыми чаще всего встречается программист в повседневной работе.
Если же хочется чего-то большего, более детального анализа и большего количества алгоритмов, то для этого есть другие книги — та же CLRS, к примеру. Кстати, ещё одним достоинством книги является большое количество отсылок к другим книгам, чтобы читатель понимал, где он может продолжить изучение темы более детально (конечно, львиная доля отсылок идёт к CLRS). Таким образом, резюмируя всё вышесказанное, я бы рекомендовал эту книгу к прочтению тем людям, кто хотел бы познакомится с алгоритмами поближе, но не знает с какой стороны к ним подойти. Мне книга очень понравилась, и я считаю, что она может стать хорошим стартом. Ну а с продолжением проблем точно не возникнет: CLRS и 4 тома Кнута хватит надолго.
Кстати, если читатели хотят предложить свои варианты книг по алгоритмам для начинающих, прошу делиться ими в комментариях — это будет всем полезно.