Предисловие....22
Вступление....23
Благодарности....25
О книге....27
Об авторе....33
Иллюстрация на обложке....34
Глава 1. Введение в структуры данных....35
Часть I Улучшаем базовые структуры данных
Глава 2. Улучшаем очереди с приоритетом: d-кучи....51
Глава 3. Декартовы деревья: применение рандомизации для получения сбалансированных двоичных деревьев поиска....113
Глава 4. Фильтры Блума: отслеживание содержимого с меньшими затратами памяти....158
Глава 5. Непересекающиеся множества: обработка за сублинейное время....200
Глава 6. Префиксные деревья, компактные префиксные деревья: эффективный поиск строк....228
Глава 7. Примеры использования: кэш LRU....279
Часть II Многомерные запросы
Глава 8. Поиск ближайших соседей....326
Глава 9. k-мерные деревья: индексирование многомерных данных....341
Глава 10. Деревья поиска по сходству: приближенный поиск ближайших соседей для выбора похожих изображений....390
Глава 11. Применение поиска ближайшего соседа на практике....451
Глава 12. Кластеризация....478
Глава 13. Параллельная кластеризация: MapReduce и кластеризация методом купола....532
Часть III Планарные графы и минимальное число пересечений
Глава 14. Введение в графы: поиск кратчайшего пути....575
Глава 15. Представление графов и планарность: рисование графа с минимальным числом пересечений ребер....617
Глава 16. Градиентный спуск: оптимизация задач (не только) на графах....657
Глава 17. Имитация отжига: оптимизация за пределами локальных минимумов....694
Глава 18. Генетические алгоритмы: заимствованная из биологии быстросходящаяся оптимизация....732
Приложения
Приложение А. Краткое руководство по псевдокоду....786
Приложение Б. Нотация «О большое»....799
Приложение В. Основные структуры данных....808
Приложение Г. Контейнеры в роли очередей с приоритетами....825
Приложение Д. Рекурсия....830
Приложение Е. Задачи классификации и рандомизированные алгоритмы....839
Познакомьтесь с самыми необходимыми алгоритмами решения сложных задач программирования в области анализа данных, машинного обучения и графов.
Вы постоянно сталкиваетесь с бесчисленными проблемами программирования, которые поначалу кажутся запутанными, трудными или нерешаемыми. Не отчаивайтесь! Многие из «новых» проблем уже имеют проверенные временем решения. Эффективные подходы к решению широкого спектра сложных задач кодирования легко адаптировать и применять в собственных приложениях, а при необходимости создавать собственные структуры данных под конкретную задачу. Сбалансированное сочетание классических, продвинутых и новых алгоритмов обновит ваш инструментарий программирования, добавив в него новые перспективы и практические методы.