Оглавление....5
Предисловие....18
1. С чего всё начинается…....20
1.1. Введение....20
1.2. Каким должен быть алгоритм?....20
1.3. Логика принятия решений....22
1.4. Доказательство базовой правильности....24
1.5. Асимптотическая запись....26
1.6. Машинные модели....26
1.7. Рандомизированные алгоритмы....28
1.8. Измерение эффективности....28
1.9. Типы данных....29
1.10. Эксперименты с алгоритмами....31
1.11. Управление памятью....32
1.12. Оптимизация кода....33
1.13. Рекурсия....35
1.14. Стратегии вычислений....36
1.15. Выбор среди нескольких алгоритмов....36
1.16. Создание параллельных алгоритмов....37
1.17. Реализация алгоритмов....38
1.18. Рекомендуемые курсы для студентов, изучающих информатику....39
1.19. Некоторые стратегии обучения....41
1.20. О проектах всей книги....42
1.21. Список рекомендуемой литературы....43
2. Основы разработки программного обеспечения....44
2.1. Введение....44
2.2. Обзор цикла разработки....44
2.3. Требования....45
2.4. Проектирование структуры компонентов....46
2.5. Проектирование отдельных компонентов и написание кода....46
2.6. Шаблоны....47
2.7. Управление ошибками....51
2.8. Тестирование....53
2.9. Просмотр кода....55
2.10. Релиз....55
2.11. Обслуживание....56
2.12. Оценка....57
2.13. Следование формальному процессу....57
2.14. Управление данными пользователя....58
2.15. Список рекомендуемой литературы....58
3. Советы по вопросам карьерного роста и прохождения собеседований....59
3.1. Введение....59
3.2. Отклик на вакансию....59
3.3. Составление резюме....59
3.4. Поведенческие вопросы и собеседования....60
3.5. Технические собеседования....62
3.6. Более сложные вопросы....66
3.7. Собеседование по проектированию систем....67
3.8. Обсуждение предложения....67
3.9. Как красиво уйти с текущей работы?....68
3.10. Боритесь с самуспокоенностью....68
3.11. Советы по дополнительной подготовке....69
3.12. Список рекомендуемой литературы....69
4. Основы компьютерного права....70
4.1. Введение....70
4.2. Интеллектуальная собственность....70
4.3. Патенты....71
4.4. Коммерческие тайны....72
4.5. Авторские права....73
4.6. Товарные знаки....74
4.7. Управление интеллектуальной собственностью....75
4.8. Контракты....75
4.9. Лицензии....76
4.10. Трудовые соглашения....77
4.11. Конфиденциальность....78
4.12. Киберпреступления....79
4.13. Выступления в качестве свидетеля-эксперта....79
4.14. Советы по дополнительной подготовке....80
4.15. Список рекомендуемой литературы....80
5. Фундаментальные структуры данных....81
5.1. Введение....81
5.2. Вспомогательные функции....81
5.3. Вектор....87
5.4. Блочный массив....91
5.5. Связанный список....92
5.6. Свободный список со сборкой мусора....96
5.7. Стек....100
5.8. Очередь....101
5.9. Деревья....104
5.10. Битовые алгоритмы....105
5.11. Набор битов....108
5.12. Поиск объединения....114
5.13. Примечания по реализации....115
5.14. Комментарии....115
5.15. Советы по дополнительной подготовке....116
5.16. Список рекомендуемой литературы....116
6. Генерация случайных чисел....117
6.1. Введение....117
6.2. Краткий обзор теории вероятностей....117
6.3. Генерация псевдослучайных чисел....119
6.4. Класс генераторов псевдослучайных чисел Xorshift....121
6.5. Вихрь Мерсенна....122
6.6. Генератор MRG32k3a....122
6.7. Алгоритм RC4....124
6.8. Выбор генератора....125
6.9. Использование генератора....126
6.10. Создание выборок из распределений....126
6.11. Генерация выборок из дискретных распределений с ограниченным диапазоном....128
6.12. Генерация выборок из особых распределений....132
6.13. Генерация случайных объектов....136
6.14. Генерация выборок из многомерных распределений....138
6.15. Метод Монте-Карло....139
6.16. Примечания по реализации....145
6.17. Комментарии....146
6.18. Советы по дополнительной подготовке....146
6.19. Список рекомендуемой литературы....147
7. Сортировка....148
7.1. Введение....148
7.2. Сортировка вставками....148
7.3. Быстрая сортировка....149
7.4. Сортировка слиянием....152
7.5. Целочисленная сортировка....153
7.6. Векторная сортировка....154
7.7. Сортировка перестановкой....157
7.8. Выбор....158
7.9. Множественный выбор....159
7.10. Поиск....160
7.11. Примечания по реализации....160
7.12. Комментарии....161
7.13. Советы по дополнительной подготовке....162
7.14. Список рекомендуемой литературы....162
8. Динамически сортируемые последовательности....163
8.1. Введение....163
8.2. Требования....163
8.3. Список с пропусками....164
8.4. Декартово дерево....169
8.5. Итераторы деревьев....175
8.6. Дополнения и варианты API....177
8.7. Векторные ключи....178
8.8. Расширение LCP для деревьев....178
8.9. Префиксное дерево....184
8.10. Тернарное декартово дерево....185
8.11. Сравнение производительности....190
8.12. Примечания по реализации....191
8.13. Комментарии....191
8.14. Советы по дополнительной подготовке....193
8.15. Список рекомендуемой литературы....193
9. Хеширование....195
9.1. Введение....195
9.2. Хеш-функции....195
9.3. Универсальные хеш-функции....199
9.4. Неуниверсальные хеш-функции....202
9.5. Скользящие хеш-функции....204
9.6. Коллекция хеш-функций....205
9.7. Хеш-таблицы....205
9.8. Цепочка хеш-таблиц....205
9.9. Хеш-таблица с линейным зондированием....210
9.10. Оценка времени....214
9.11. Фильтр Блума....215
9.12. Примечания по реализации....216
9.13. Комментарии....217
9.14. Советы по дополнительной подготовке....218
9.15. Список рекомендуемой литературы....218
10. Приоритетные очереди....220
10.1. Введение....220
10.2. API....220
10.3. Бинарная куча....220
10.4. Индексированные кучи....223
10.5. Примечания по реализации....228
10.6. Комментарии....228
10.7. Список рекомендуемой литературы....229
11. Алгоритмы графов....230
11.1. Введение....230
11.2. Основы....230
11.3. Представление графов....231
11.4. Поиск....234
11.5. Примеры задач поиска....236
11.6. Минимальное остовное дерево....238
11.7. Кратчайшие пути....239
11.8. Алгоритмы потока....242
11.9. Двудольное сопоставление....246
11.10. Устойчивое сопоставление....247
11.11. Задача назначения....248
11.12. Генерация случайных графов....249
11.13. Примечания по реализации....250
11.14. Комментарии....250
11.15. Советы по дополнительной подготовке....251
11.16. Список рекомендуемой литературы....251
12. Разные алгоритмы и методы....252
12.1. Введение....252
12.2. Превращение статических структур данных в динамические....252
12.3. Обеспечение устойчивости структур данных....253
12.4. Хранение кеша....254
12.5. Вектор с k-битным размером слова....257
12.6. Объединение множества на интервалах....258
12.7. Создание первых N простых чисел....258
12.8. Генерация всех возможных перестановок....259
12.9. Генерация всех возможных сочетаний....260
12.10. Генерация всех подмножеств....261
12.11. Создание всех разделов....261
12.12. Генерация всех зависимых объектов....262
12.13. Примечания по реализации....262
12.14. Комментарии....262
12.15. Советы по дополнительной подготовке....263
12.16. Список рекомендуемой литературы....263
13. Алгоритмы для работы с внешней памятью....264
13.1. Введение....264
13.2. Диски и файлы....264
13.3. Структура файла....267
13.4. Работа с файлами CSV....268
13.5. Модель ввода/вывода....272
13.6. Вектор внешней памяти....276
13.7. Сортировка....279
13.8. Векторные структуры данных....281
13.9. Дерево B+....282
13.10. Комментарии....290
13.11. Советы по дополнительной подготовке....290
13.12. Список рекомендуемой литературы....291
14. Строковые алгоритмы....292
14.1. Введение....292
14.2. Поиск по одному шаблону....292
14.3. Поиск по нескольким шаблонам....295
14.4. Регулярные выражения....296
14.5. Расширенные шаблоны....298
14.6. Алгоритмы поиска расстояния между строками....300
14.7. Обратный индекс....304
14.8. Суффиксный индекс....305
14.9. Синтаксическое дерево....309
14.10. Введение в краткие структуры данных....309
14.11. Примечания по реализации....313
14.12. Комментарии....314
14.13. Советы по дополнительной подготовке....314
14.14. Список рекомендуемой литературы....315
15. Сжатие....316
15.1. Введение....316
15.2. Основные ограничения....316
15.3. Энтропия....316
15.4. Битовый поток....317
15.5. Коды....319
15.6. Статические коды....319
15.7. Коды Хаффмана....323
15.8. Сжатие словаря....327
15.9. Кодирование серий байтов....330
15.10. Перемещение на передний план....331
15.11. Преобразование Берроуза — Уилера....332
15.12. Примечания по реализации....335
15.13. Комментарии....335
15.14. Советы по дополнительной подготовке....336
15.15. Список рекомендуемой литературы....336
16. Комбинаторная оптимизация....337
16.1. Введение....337
16.2. Теория сложности....337
16.3. Типичные сложные задачи....339
16.4. Алгоритмы приближения....343
16.5. Эвристика жадного построения....344
16.6. Ветвление и границы....345
16.7. Поиск крачайшего пути в пространстве с нижними границами....351
16.8. Локальный поиск....359
16.9. Применение локального поиска к некоторым задачам....365
16.10. Алгоритм имитации отжига....369
16.11. Повторный локальный поиск....374
16.12. Генетические алгоритмы....376
16.13. Анализ производительности....382
16.14. Подготовка данных для конкретной задачи....383
16.15. Многоцелевая оптимизация....383
16.16. Обработка ограничений....384
16.17. Стохастические задачи....389
16.18. Общие рекомендации....389
16.19. Примечания по реализации....390
16.20. Комментарии....390
16.21. Советы по дополнительной подготовке....393
16.22. Список рекомендуемой литературы....394
17. Большие числа....396
17.1. Введение....396
17.2. Представление....396
17.3. Сложение и вычитание....398
17.4. Операции сдвига....399
17.5. Умножение....400
17.6. Деление....401
17.7. Преобразование в десятичное число....403
17.8. Возведение в степень....403
17.9. Вычисление логарифма....404
17.10. Целочисленный квадратный корень....404
17.11. Наибольший общий делитель....405
17.12. Модульная инверсия....405
17.13. Проверка числа на простоту....406
17.14. Рациональные числа....407
17.15. Примечания по реализации....409
17.16. Комментарии....409
17.17. Советы по дополнительной подготовке....410
17.18. Список рекомендуемой литературы....410
18. Вычислительная геометрия....411
18.1. Введение....411
18.2. Расстояния....411
18.3. VP-дерево....412
18.4. k-d-дерево....416
18.5. Решение задач при большом числе измерений....421
18.6. Структуры данных для геометрических объектов....422
18.7. Точки....422
18.8. Геометрические примитивы....423
18.9. Выпуклая оболочка....424
18.10. Развертка плоскости....425
18.11. Комментарии....426
18.12. Советы по дополнительной подготовке....427
18.13. Список рекомендуемой литературы....427
19. Обнаружение и исправление ошибок....428
19.1. Введение....428
19.2. Бинарные полиномы....428
19.3. Многочлены над конечными полями....428
19.4. Обнаружение ошибок....429
19.5. Каналы и коды....431
19.6. Вычисление конечного поля....433
19.7. Полиномы над элементами поля Галуа....434
19.8. Коды Рида — Соломона....437
19.9. Границы кодов минимального расстояния с фиксированным алфавитом....441
19.10. Булевы матрицы....442
19.11. Коды проверки на четность с низкой плотностью....443
19.12. Примечания по реализации....448
19.13. Комментарии....449
19.14. Советы по дополнительной подготовке....450
19.15. Список рекомендуемой литературы....450
20. Криптография....451
20.1. Введение....451
20.2. Шифрование файлов....451
20.3. Длина ключа....453
20.4. Хранилище ключей....454
20.5. Криптографическое хеширование....455
20.6. Обмен ключами....455
20.7. Другие протоколы....455
20.8. Примечания по реализации....456
20.9. Комментарии....456
20.10. Совет по дополнительной подготовке....457
20.11. Список рекомендуемой литературы....457
21. Вычислительная статистика....458
21.1. Введение....458
21.2. Оценки....458
21.3. Оценщики....461
21.4. Поиск наиболее эффективных оценщиков....468
21.5. Некоторые особенности асимптотики....472
21.6. Оценка нормальной CDF....472
21.7. Оценка CDF T-распределения....473
21.8. Подробнее о доверительных интервалах....474
21.9. Границы среднего значения в конечной выборке....478
21.10. Доверительные интервалы для общих метрик местоположения....480
21.11. Выпадающие значения и надежные выводы....483
21.12. Функции оценок....485
21.13. Измерение времени выполнения алгоритма....486
21.14. Корреляционный анализ....487
21.15. Начальная загрузка....489
21.16. Когда использовать начальную загрузку?....503
21.17. Проверка гипотез....504
21.18. Сравнение тестов....506
21.19. Эффективное использование тестов....508
21.20. Валидация исследований....513
21.21. Сравнение совпадающих пар....514
21.22. Множественные сравнения....516
21.23. Сравнение совпадающих кортежей....518
21.24. Сравнение независимых выборок....519
21.25. Перестановочные тесты....521
21.26. Сравнение нескольких альтернатив в нескольких предметных областях....525
21.27. Работа с данными расчета....528
21.28. Тестирование различий в распределении....530
21.29. Сравнение данных с распределением....531
21.30. Сравнение распределений двух выборок....533
21.31. Анализ чувствительности....534
21.32. Последовательность Соболя....536
21.33. Планирование экспериментов: основные идеи....540
21.34. Марковская цепь Монте-Карло....543
21.35. Байесовские методы....546
21.36. Поиск лучшей альтернативы с помощью моделирования....548
21.37. Расчет размера выборки....551
21.38. Анализ временных рядов....552
21.39. Использование статистики на практике....564
21.40. Анализ решений....566
21.41. Примечания по реализации....568
21.42. Комментарии....569
21.43. Советы по дополнительной подготовке....575
21.44. Список рекомендуемой литературы....577
22. Численные алгоритмы: введение и матричная алгебра....581
22.1. Введение....581
22.2. Арифметика с плавающей точкой....582
22.3. Ошибки при использовании арифметики с плавающей точкой....583
22.4. Ошибка приближения....587
22.5. Показатели устойчивости и состояния....588
22.6. Ошибка оптимизации....590
22.7. Другие общие темы....592
22.8. Разработка надежного численного программного обеспечения....594
22.9. Матричная алгебра....598
22.10. Матричные нормы....601
22.11. LUP-разложение....602
22.12. Разложение Холецкого....607
22.13. Ленточные матрицы....608
22.14. Решение тридиагональных матричных уравнений....610
22.15. Ортогональные преобразования....610
22.16. QR-разложение....612
22.17. Собственные значения и собственные векторы симметричной матрицы....614
22.18. Разложение по сингулярным значениям (SVD)....617
22.19. Собственные значения и собственные векторы асимметричной матрицы....621
22.20. Разреженные матрицы....626
22.21. Итерационные методы для разреженных матриц....632
22.22. Итерационные методы для собственных значений....633
22.23. Введение в интервальную арифметику....635
22.24. Примечания по реализации....638
22.25. Комментарии....638
22.26. Советы по дополнительной подготовке....641
22.27. Список рекомендуемой литературы....641
23. Численные алгоритмы: работа с функциями....644
23.1. Введение....644
23.2. Быстрое преобразование Фурье....644
23.3. Интерполяция: общие идеи....648
23.4. Полиномиальная интерполяция из существующих данных....651
23.5. Полиномы Чебышева....654
23.6. Кусочная интерполяция....661
23.7. Сплайны — для работы с существующими данными....667
23.8. Сравнение методов интерполяции....671
23.9. Интегрирование....673
23.10. Многомерное интегрирование....680
23.11. Оценка функции....684
23.12. Оценка производных....684
23.13. Решение нелинейных уравнений и систем....690
23.14. Поиск всех корней в одномерном случае....706
23.15. Обыкновенные дифференциальные уравнения....707
23.16. Решение жестких ОДУ....712
23.17. Краевые задачи для ОДУ....716
23.18. Уравнения с частными производными: некоторые размышления....718
23.19. Некоторые выводы....719
23.20. Примечания по реализации....720
23.21. Комментарии....720
23.22. Советы по дополнительной подготовке....726
23.23. Список рекомендуемой литературы....727
24. Численная оптимизация....730
24.1. Введение....730
24.2. Некоторые общие идеи....730
24.3. Минимизация унимодальной функции с одной переменной....731
24.4. Минимизация многомерных функций: введение и координатный спуск....734
24.5. Линейный поиск....737
24.6. Алгоритмы линейного поиска....741
24.7. Методы, не требующие вычисления производных....747
24.8. Негладкая минимизация....752
24.9. Глобальная минимизация....755
24.10. Оптимизация в дискретном множестве....769
24.11. Стохастическая оптимизация....771
24.12. Алгоритмы стохастической аппроксимации....772
24.13. Линейное программирование....775
24.14. Некоторые соображения о нелинейном программировании....778
24.15. Примечания по реализации....779
24.16. Комментарии....780
24.17. Советы по дополнительной подготовке....785
24.18. Список рекомендуемой литературы....786
25. Введение в машинное обучение....789
25.1. Введение....789
25.2. Что такое машинное обучение?....789
25.3. Математическое обучение....790
25.4. Прогнозирование и структурный вывод....795
25.5. Оценка риска предиктора....795
25.6. Источники риска....798
25.7. Контроль сложности....799
25.8. Ошибка аппроксимации....801
25.9. Устойчивость....804
25.10. Оценка риска стратегии обучения....805
25.11. Принятие решений и выбор модели....809
25.12. Общие стратегии выбора модели....811
25.13. Смещение, дисперсия и бэггинг....812
25.14. Паттерны проектирования....815
25.15. Подготовка данных....816
25.16. Масштабирование....818
25.17. Обработка пропущенных значений....820
25.18. Выбор признаков....820
25.19. Ядра....826
25.20. Обучение в реальном времени....828
25.21. Работа с невекторными данными....829
25.22. Масштабное обучение....829
25.23. Выводы....831
25.24. Примечания по реализации....832
25.25. Комментарии....832
25.26. Советы по дополнительной подготовке....838
25.27. Список рекомендуемой литературы....839
26. Машинное обучение: классификация....841
26.1. Введение....841
26.2. Стратификация по метке класса....841
26.3. Оценка риска....843
26.4. Сведение мультикласса к двум классам....847
26.5. Контроль сложности....850
26.6. Наивный классификатор Байеса....852
26.7. Ближайший сосед....855
26.8. Дерево решений....858
26.9. Механизм опорных векторов....865
26.10. Линейный SVM....867
26.11. Ядро SVM....872
26.12. Мультиклассовый нелинейный SVM....877
26.13. Нейронная сеть....879
26.14. Ансамбли рандомизации....888
26.15. Обучение в реальном времени....89
26.16. Бустинг....893
26.17. Масштабное обучение....897
26.18. Экономичное обучение....897
26.19. Несбалансированное обучение....902
26.20. Выбор признаков....905
26.21. Сравнение классификаторов....905
26.22. Примечания по реализации....908
26.23. Комментарии....909
26.24. Советы по дополнительной подготовке....918
26.25. Список рекомендуемой литературы....918
27. Машинное обучение: регрессия....921
27.1. Введение....921
27.2. Оценка риска....921
27.3. Управление сложностью....923
27.4. Линейная регрессия....924
27.5. Регрессия лассо....925
27.6. Регрессия ближайших соседей....929
27.7. Дерево регрессии....930
27.8. Регрессия случайного леса....933
27.9. Нейронная сеть....934
27.10. Выбор признаков....935
27.11. Сравнение производительности....935
27.12. Примечания по реализации....936
27.13. Комментарии....937
27.14. Советы по дополнительной подготовке....940
27.15. Список рекомендуемой литературы....941
28. Машинное обучение: кластеризация....942
28.1. Введение....942
28.2. Постановка....942
28.3. Внешняя оценка....944
28.4. Внутренняя оценка и выбор количества кластеров....947
28.5. Расчет устойчивости....950
28.6. Кластеризация в евклидовом пространстве....952
28.7. Кластеризация в метрическом пространстве....956
28.8. Спектральная кластеризация....959
28.9. Эксперименты....963
28.10. Примечания по реализации....963
28.11. Комментарии....964
28.12. Советы по дополнительной подготовке....968
28.13. Список рекомендуемой литературы....968
29. Машинное обучение: прочие задачи....970
29.1. Введение....970
29.2. Обучение с подкреплением....970
29.3. Функция, присваивающая значения....971
29.4. Поиск часто встречающихся комбинаций предметов....973
29.5. Полуконтролируемое обучение....974
29.6. Оценка плотности....975
29.7. Обнаружение выпадающих значений....975
29.8. Примечания по реализации....976
29.9. Комментарии....976
29.10. Список рекомендуемой литературы....977
30. Отстойник: не слишком полезные алгоритмы и структуры данных....978
30.1. Введение....978
30.2. Сортировка связанного списка....978
30.3. Частичная сортировка....980
30.4. Сжатое префиксное дерево....980
30.5. Хеширование кукушкой....986
30.6. Немного приоритетных очередей....989
30.7. Младший общий предок (LCA) и запрос с минимальным диапазоном (RQM)....995
30.8. Знаковый ранговый критерий Уилкоксона для двух выборок....996
30.9. Критерий Фридмана для согласованных выборок....997
30.10. MADS-подобный алгоритм оптимизации....998
30.11. Алгоритм классификации бустинга SAMME....999
30.12. Бустинг в задаче регрессии....1000
30.13. Вероятностная кластеризация....1002
30.14. Иерархическая кластеризация....1006
30.15. Кластеризация на основе плотности....1009
30.16. Не представленные реализации....1011
30.17. Советы по дополнительной подготовке....1012
30.18. Список рекомендуемой литературы....1013
31. Приложение: примечания о языке С++....1014
31.1. Введение....1014
31.2. Путеводитель по литературе, посвященной C++....1014
31.3. Советы по дополнительной подготовке....1014
31.4. Список рекомендуемой литературы....1015
Предметный указатель....1016
Книга с подробным описанием всевозможных алгоритмов, которые принято реализовывать на C++ в силу высоких требований к скорости и наращиванию мощности алгоритмов. Алгоритмы относятся к следующим предметным областям: машинное обучение и нейронные сети, статистика, криптография, оптимизация, перемножение матриц, хэширование, строковые алгоритмы, случайные леса, методы работы с числами, сортировка, кластеризация, графовые алгоритмы и другие темы, касающиеся программной инженерии. Затронуты вопросы командной разработки алгоритмов.
Книгу можно использовать как справочник по алгоритмам для программистов и исследователей и как учебное пособие для студентов соответствующих специальностей. Также будет полезна при подготовке к собеседованиям. Профессия программиста неотделима от работы с алгоритмами и структурами данных. В идеале алгоритм должен быть корректным, легко понятным, применимым для решения разнообразных задач и при этом эффективным. В книге даны и объяснены реализации всевозможных алгоритмов, готовых к внедрению и не защищенных авторскими правами. Алгоритмы относятся к следующим предметным областям:
Важнейшая часть книги посвящена машинному обучению и отличается значительным теоретическим и академическим уклоном.
Каждая глава будет для вас небольшим открытием. Например, разобраны малоизученные практические аспекты выпуклой оптимизации, метода Монте-Карло и кластеризации при проектировании и усилении нейронных сетей. Затронуты вопросы командной разработки алгоритмов.
В зависимости от уровня вашей подготовки книга может послужить учебником или справочником, но на долгие годы останется для вас настольной.