Основы алгоритмов — хендбук от Яндекса
О чём этот хендбук
Познакомьтесь с принципами проектирования, оптимизации и комбинирования алгоритмов, чтобы эффективнее работать с кодом. Разбираем алгоритмы без привязки к языкам программирования. Теория, задачи и автопроверка эффективности — чтобы понять и прокачать алгоритмическое мышление.
Зачем изучать
Алгоритмы — это основа любой программы. Они помогают мыслить системно, выбирать оптимальные решения, писать эффективный и уверенный код и понимать чужой.
Что нужно уметь
Достаточно школьных знаний по информатике и логике. Опыт программирования и знание структур данных желательны для комфортного чтения, но не обязательны.
Вступайте в сообщество хендбука
Здесь можно найти единомышленников, экспертов и просто интересных собеседников. А ещё — получить помощь или поделиться знаниями.
1. Введение
Раздел знакомит со структурой хендбука и системой проверки заданий, объясняет, что такое алгоритм и задача, как описывать решения псевдокодом, проверять их корректность и оценивать сложность.
2. Основные структуры данных
Раздел посвящён базовым структурам данных: связным спискам, множествам, словарям, декам, стекам и очередям с приоритетом. Вы узнаете, как они устроены, какие операции поддерживают и когда их применять.
3. Решение практических задач по программированию
Раздел проводит через полный цикл решения задач: от чтения условия и проектирования алгоритма до реализации, тестирования и отправки в систему автоматической проверки.
4. Разминка. Последовательные алгоритмы
Раздел разбирает последовательные вычисления на примере чисел Фибоначчи, наибольшего общего делителя и наименьшего общего кратного, уделяя внимание эффективности решений.
5. Графы
Раздел вводит основные понятия теории графов, способы хранения графов в памяти, обходы в глубину и ширину, поиск компонент связности и кратчайших путей.
6. Техники проектирования алгоритмов
Раздел сравнивает ключевые стратегии проектирования алгоритмов: полный перебор, жадный подход, динамическое программирование, рекурсию, «разделяй и властвуй» и рандомизацию.
7. Жадные алгоритмы
Раздел учит строить и обосновывать жадные решения на задачах о размене, выборе наиболее ценных объектов, покрытии отрезков, распределении ресурсов и специальной сортировке.
8. Динамическое программирование
Раздел показывает, как выделять состояния и переходы, переиспользовать результаты подзадач и восстанавливать ответ в задачах о размене, последовательностях, рюкзаке и выражениях.
9. Разделяй и властвуй
Раздел рассматривает двоичный поиск, быструю сортировку, подсчёт инверсий, поиск доминирующего элемента и ближайшей пары точек как применения стратегии «разделяй и властвуй».
Создано авторами при поддержке