Предисловие

Для кого эта книга

Книга написана в предположении, что читатель уже имеет практический опыт программирования — например, на Python. Если вы никогда не писали программ, я бы посоветовал сначала выучить какой-нибудь язык программирования, а потом уже браться за чтение. В книге используется Python, потому что он одинаково удобен и программистам и не-программистам.

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

Сейчас я опишу цель этой книги одним абзацем и одной иллюстрацией. Начнём мы с нескольких структур данных, которые показывают, как информация представляется примитивными атомарными типами, например, 32-разрядными целыми числами или 64-разрядными вещественными. Некоторые алгоритмы, в частности, бинарный поиск, работают с такими структурами напрямую. Более сложные алгоритмы, например, алгоритмы на графах, используют важные абстрактные типы данных (стек, приоритетная очередь и т. п.), которые мы изучим по ходу изложения. Абстрактный тип подразумевает набор действий над ним, и вот эти действия будут эффективны только если выбрать подходящую структуру данных для его реализации. Ближе к концу книги мы рассмотрим, как повысить быстродействие различных алгоритмов. Сами алгоритмы мы либо целиком напишем на Python, либо рассмотрим соответствующие сторонние пакеты Python, в которых они эффективно реализованы.

Если вы заглянете в сопутствующие книге исходные тексты программ, найдёте там в каждой главе файл book.py — это программа на Python, которая при запуске воспроизводит на вашем компьютере все диаграммы из книги. «У каждого свои рекорды», как говорят автоторговцы, но соотношение характеристик в целом должно остаться тем же.

Иллюстрация P-1. Сводка по тематическому содержанию книги
Иллюстрация P-1. Сводка по тематическому содержанию книги

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

Исходные тексты

Все программы из книги доступны в соответствующем репозитории на GitHub — http://github.com/heineman/LearningAlgorithms. Они совместимы с Python 3.4 и выше. Везде, где это было разумно, я старался следовать рекомендациям Python и оформлять системные методы, наподобие __str()__ или __len__(). Примеры в книге отформатированы с отступом в два пробела — так они лучше помещаются вширину при печати; в программах репоизтория используется стандартный отступ в четыре пробела. Изредка в печатных примерах попадаются однострочники, например if j == lo: break1.

В программах используются три свободно распространяемые библиотеки Python, которые необходимо скачать и установить самостоятельно2:

NumPy и SciPy — одни из самых популярных свободных библиотек с огромным сообществом. Я их использую, чтобы измерить фактическую производительность алгоритмов. NetworkX — большой сборник эффективных алгоритмов для работы с графами, он нам понадобится в главе 7; там же есть удобная готовая структура данных, реализующая граф. Средства этих библитотек позволят не изобретать очередное колесо, если в этом нет нужды. Если они не установлены, не беда: примеры написаны так, что смогут работать без и них, нужные функции также есть в репозитории.

Время работы примеров в книге замеряется с помощью модуля timeit, который многократно запускает указанный фрагмент программы. Часто для большей аккуратности само измерение делается тоже несколько раз. Из всех замеров выбирается быстрейший, а не средний. Обычно считается, что так лучше измерять производительность: если запустить пример несколько раз, а потом взять среднее время работы, на это среднее повлияет худшее время выполнения, которое может быть большим из-за того, что именно тогда операционная система запускала какие-то ещё задачи3.

Если скорость работы алгоритма сильно зависит от свойств обрабатываемых данных (как в случае сортировки вставками из главы 5), о том, что в этом случае измеряется среднее время, будет сказано явно.

В нашем репозитории — больше 10000 строк кода на Python, сценарии для запуска всех тестов и вычисления всех данных для таблиц в книге; можно воспроизвести также большую часть диаграмм и графиков. Исходный текст снабжён, как это принято в Python, строками документации и тестами, причём тестовое покрытие, согласно https://coverage.readthedocs.io, составляет 95%.

Если у вас возникнут технические вопросы или затруднения в работе примеров, свяжитесь с нами по адресу bookquestions@oreilly.com.

Цель книги — помочь в решении повседневных задач. Вообще говоря, любой пример из книги можно использовать в документации или программе. Получать разрешение от нас на использование примера не надо, если только вы не собираетесь цитировать значительную часть всего корпуса примеров. В частности, если ваше приложение использует несколько программных фрагментов из книги, разрешение не нужно. Разрешение нужно, если вы продаёте или распространяете непосредственно примеры из книг издательства O'Reilly. Если вы в ответе на чей-о вопрос цитируете пример из этой книги, разрешение не нужно. Разрешение нужно, если вы включаете значительную часть примеров из книги издательства O'Reilly в документацию к своему продукту4.

Мы рады, когда люди ссылаются на наши книги, хотя это тоже не обязательно. При ссылке указывайте название, автора, издательство и ISBN. Например, «Learning Algorithms: A Programmer’s Guide to Writing Better Code by George T. Heineman (O’Reilly). Copy‐ right 2021 George T. Heineman, 978-1-492-09106-6.».

Если вы опасаетесь, что задействовали в своей работе слишком много примеров, и это уже не помещается в рамки добросовестного использования или противоречит нашим условиям, смело обращайтесь по адресу permissions@oreilly.com.

Типографические обозначения

В книге используются следующие типографические обозначения:

Онлайн-обучение O’Reilly

../images-012-004-1.png O’Reilly Media уже более сорока лет способствует корпоративному росту в мире: проводит технические и бизнес-тренинги, занимается оценкой компетентности и внутренней аналитикой компаний.

Наши специалисты и инноваторы распространяют знания и проводят экспертизу посредство уникальной образовательной сети, включающей в себя книги, статьи и образовательную онлайн-платформу. Образовательная онлайн-платформа O'Reilly предоставляет своевременный доступ к интерактивным учебным курсам, углублённым образовательным траекториям, онлайновым средам программирования и огромному корпусу текстовых и видеоматериалов O'Reilly и более двухсот других издательств. Больше информации — на нашем сайте, http://oreilly.com.

Как с нами связаться

Вопросы и замечания к этой книге просьба направлять издателю:

У это книги есть веб-страница, на которой публикуются замеченные опечатки и исправления неточностей, примеры и другоая полезная информация. Веб-страница доступна по адресу https://oreil.ly/learn-algorithms.

Технические вопросы и комментарии к книге направляйте по электронной почте bookquestions@oreilly.com.

Новости по всем книгам и курсам ищите на сайте http://oreilly.com.

Мы на Facebook: http://facebook.com/oreilly

Мы в Twitter: http://twitter.com/oreillymedia

Мы на YouTube: http://youtube.com/oreillymedia

Благодарности

Я считаю, что лучшее в компьютерной науке — это изучение алгоритмов. Спасибо читателям за то, что дали мне возможность поделиться своими наработками. Спасибо моей жене Дженнифер, за то, что поддержала меня в затее с очередной книгой. Спасибо моим сыновьям, Николасу и Александру, за то, что они уже выросли и могут изучать программирование.

Эта книга стала лучше благодаря редакторам O'Reilly — Мелиссе Даффилд, Саре Грей, Бет Келли и Вирджинии Вильсон. Они помогали мне систематизировать общее содержание книги и выстраивать пояснения кнему. Технические рецензенты — Лаура Хелливелл, Чарли Лаверинг, Хелен Скотт, Стенли Силков и Аура Веларде — нашли множество неточностей, улучшали реализацию алгоритмов и пояснения к ним. Если остались какие-то недочёты — все они целиком на моей совести.

  1. Авторский стиль оформления программ и в книге, и в репозитории заметно отличается от рекомендаций Python — как правило в плане экономии места (пробелы между знаками операций и в перечислениях, пустые строки между фрагментами кода и т. п.) (1)

  2. В репозитории есть программы, использующие также Matplotlib (https://matplotlib.org) и некоторые другое библиотеки (2)

  3. Строго говоря, timeit высчитывает потреблённое время процесса, в которое не входят интервалы, когда работал не он, а другие задачи. Но активность других задач может повлиять на актуальность кешей процессора и памяти: если постоянно выполнять один и тот же код в памяти на одних и тех же данных, кеши «разогреваются», и производительность растёт, а если контекст задач меняется часто — теряют актуальность. Вопрос о том, какой способ адекватнее покажет производительность алгоритма, открыт (3)

  4. Внимательный читатель, возможно, заметил, что все разрешения в этом абзаце относятся к примерам из данной книги, а все запреты — к примерам из некой «книги издательства O'Reilly» в целом. Дело в том, что исходные тексты примеров книги «Learning Algorithms: A Programmer's Guide to Writing Better Code» размещены на хостинге свободных проектов GitHub под свободной лицензией MIT, которая позволяет делать с ними что угодно без каких-либо ограничений. Единственное условие MIT — копирайт сохраняется за автором, и об этом, а также о том, что исходные тексты были получены под лицензией MIT, необходимо уведомлять при распространении сделанного на их основе продукта. Текст лицензии: https://raw.githubusercontent.com/heineman/LearningAlgorithms/main/LICENSE (4)

  5. В авторском тексте для этого использовались прописные буквы, но мне показалось, что «Сортировка Слияниями» при чтении выглядит диковато, лучше уж «сортировка слияниями». В качестве бесплатного бонуса «сортировка Тима» приобрела теперь явно указывает на автора (5)

FrBrGeorge/Books/LearningAlgorythms/00_Preface (последним исправлял пользователь FrBrGeorge 2021-10-22 06:07:56)