Ярослав Воронцов - Алгоритмы и структуры данных
TRANSCRIPT
![Page 1: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/1.jpg)
Algorithms and data structures
Yaroslav Vorontsov
Senior Software engineer/Tech lead
M.Sc., PhD
![Page 2: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/2.jpg)
Agenda
´ Немного нудных определений
´ Переход дороги с некоторыми нюансами
´ Разные греческие буквы – омега, тета
´ Ещё нудные определения
´ Базовые структуры данных и их сложность
´ Базовые алгоритмы и их сложность
´ Немного веселья
2
![Page 3: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/3.jpg)
Нудные определения
´ Алгоритм – набор инструкций, описывающих порядок действий исполнителя для достижения результата решения задачи за конечное число действий
´ Вычислительные процессы алгоритмического характера известны человечеству с глубокой древности
´ Явное определение – начало 20 века
3
![Page 4: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/4.jpg)
Попытки формализации понятия алгоритма´ А. Чёрч – лямбда-исчисление, тезис Чёрча
´ A. Тьюринг – машина Тьюринга
´ А. Марков – нормальный алгорифм (алгоритм)
´ Машина Поста (автоматное программирование)
´ Рекурсивная функция
´ Brainfuck
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++ .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++. ------.--------.>+.>.
Hello World
4
![Page 5: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/5.jpg)
Один из наиболее старых алгоритмов
5
![Page 6: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/6.jpg)
Кто считается первым программистом?
6
![Page 7: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/7.jpg)
Вместо дальнейшего введения
´ Как перейти дорогу?´ Посмотрите налево
´ Посмотрите направо
´ Переходите
7
![Page 8: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/8.jpg)
Но…
«Есть нюансы» (с)
В.И. Чапаев в известном анекдоте
8
![Page 9: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/9.jpg)
Суслики – самые осторожные животные…Они становятся на задние лапки
и смотрят вдаль: не бежит ли лиса? Не летит ли орел? Не ползет ли змея?
И самые наблюдательные из них получают бампером в лоб…
9
![Page 10: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/10.jpg)
Нюанс 110
![Page 11: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/11.jpg)
Он же11
![Page 12: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/12.jpg)
Нюанс 212
![Page 13: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/13.jpg)
Извините, вот правильный нюанс 213
![Page 14: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/14.jpg)
Нюанс 314
![Page 15: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/15.jpg)
Нюанс 4
´ «Эй, гражданина, ты туда не ходи, ты сюда ходи. А то снег башка попадёт, совсем мёртвый будешь!»
´ Серьёзно, как вы вообще здесь оказались?
15
![Page 16: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/16.jpg)
Нюансы 5 и 616
![Page 17: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/17.jpg)
А ещё…
´ Вы идёте с коляской/тележкой?
´ Находятся ли транспортные средства на безопасном расстоянии?
´ Правило «3Д», оно же «ДДД» (особенно касается воронежских дорог)
´ Посмотрели ли вы наверх? (вдруг инопланетяне?)
´ А вдруг крокодилы?
17
![Page 18: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/18.jpg)
К чему всё это было?
´ У алгоритмов есть формальные свойства´ Дискретность
´ Детерминированность
´ Понятность
´ Конечность
´ Массовость/Универсальность
´ Результативность
´ Алгоритм не содержит ошибок, если он даёт правильные результаты для любых допустимых исходных данных
18
![Page 19: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/19.jpg)
Минутка К.О.
´ Среднестатистический случай работы алгоритма никому не интересен!
´ При анализе алгоритмов, в первую очередь обращают внимание на пограничные или предельные ситуации
´ Анализ алгоритмов при малом размере входных данных также не представляет интереса!
19
![Page 20: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/20.jpg)
Альфа, бета, эта, тета…20
![Page 21: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/21.jpg)
Альфа, бета, эта, тета…21
![Page 22: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/22.jpg)
Часто встречающиеся оценки22
![Page 23: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/23.jpg)
Часто встречающиеся оценки23
![Page 24: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/24.jpg)
Хорошо, а где же структуры данных?Название-то A&DS…
24
![Page 25: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/25.jpg)
Снова нудная теория
´ Структура данных – программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных в вычислительной технике. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс
´ В большинстве современных языков программирования «строительными блоками» для сложных структур данных являются´ Массивы (array)
´ Записи (struct/record)
´ Объединения (union)
´ Ссылки (reference/pointer)
25
![Page 26: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/26.jpg)
Какие бывают структуры данных?
´ Список (List)
´ Ассоциативный массив (Map)
´ Хэш-таблица (Hash table)
´ Дек (Deque)
´ Граф (Graph)
´ Дерево (Tree)
´ Пирамида/Куча (Heap)
´ Таблица (Table)
´ Система непересекающихся множеств (Union-Find)
26
![Page 27: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/27.jpg)
Основные структуры данных27
![Page 28: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/28.jpg)
Основные структуры данных28
![Page 29: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/29.jpg)
Основные структуры данных29
![Page 30: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/30.jpg)
А вот и основные алгоритмы30
![Page 31: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/31.jpg)
А вот и основные алгоритмы31
![Page 32: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/32.jpg)
Алгоритм умножения: русский крестьянский метод´ Не требует знания таблицы
умножения
´ Надо уметь умножать и делить на 2
´ Умножение и деление на 2 –сдвиг на 1 разряд налево-направо
´ Аппаратная или низкоуровневая реализация
32
![Page 33: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/33.jpg)
Рандом не такой уж и рандом
´ rand()
´ srand()
´ arc4random()
´ arc4random_uniform()
´ …
´ X[N+1] = (A*X[N]+C) mod M
33
![Page 34: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/34.jpg)
Divide et impera
´ Метод «разделяй и властвуй» заключается в рекурсивном разбиении задачи на две или более подзадачи того же типа, но меньшего размера, и комбинации их решений для получения ответа к исходной задаче
´ Разбиения выполняются до тех пор, пока все подзадачи не окажутся элементарными
34
![Page 35: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/35.jpg)
Алгоритм Штрассена для матриц
´ Эффективен при размере матриц от 32 до 128
´ Работает за субкубическоевремя
´ Оптимизируется для малых матриц за счёт обычного «кубического» перемножения
´ Необходимо, чтобы размер матриц был степенью двойки. Если это не так – матрица дополняется нулями
35
![Page 36: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/36.jpg)
Quicksort
´ Выбор опорного элемента
´ Разделение массива
´ Шаг рекурсии – запуск вышеописанных действий для подмассивов
´ Устойчивость метода´ Хороший случай
´ Плохой случай
´ Оптимизации
36
![Page 37: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/37.jpg)
Жадные алгоритмы
´ Жадный алгоритм принимает локально оптимальные решения на каждом этапе выполнения, допуская, что и конечное решение окажется оптимальным
´ Наиболее известные алгоритмы´ Алгоритм Хаффмана
´ Алгоритм Прима-Ярника
´ Алгоритм Краскала
´ Алгоритм Дейкстры
37
![Page 38: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/38.jpg)
Алгоритм Дейкстры38
![Page 39: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/39.jpg)
Дейкстра и Интернет (OSPF)
´ LSA – Link State Advertisement
´ При использовании протокола OSPF маршрутизаторы обмениваются информацией о топологии сети.
´ Потом, на основании этой информации с помощью алгоритмаДейкстры рассчитывают таблицу маршрутизации
39
![Page 40: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/40.jpg)
Вероятностные алгоритмы
´ Подразумевают обращение к ГСЧ на определённом этапе своей работы
´ Позволяют пожертвовать абсолютной достоверностью ради ускорения/экономии во времени
´ Таких алгоритмов не так-то и мало:´ Фильтр Блума
´ Поиск минимального разреза в графе
´ Лас-Вегас (выполнить А с результатом r до тех пор, пока K(r) не истина)
´ Вероятностная раскраска графа
´ С натяжкой –марковские цепи, метод Монте-Карло, алгоритмы сжатия
40
![Page 41: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/41.jpg)
Фильтр Блума41
![Page 42: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/42.jpg)
Нет, не этого Блума
´ Можно получить ложноположительное срабатывание, но никогда –ложноотрицательное
´ Основан на битовом массиве и хэш-функции
42
![Page 43: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/43.jpg)
Алгоритм Каргера
´ Минимальный разрез графа –разбиение множества вершин на две непустые части, при котором рассекается минимальное число рёбер
´ Repeat until just two nodes remain: ´ – Pick an edge of G at random
and collapse its two endpoints into a single node
´ For the two remaining nodes u1 and u2, set V1 = {nodes that went into u1} and V2 = {nodes in u2}
´ Вероятность: 2/(n*(n-1))
43
![Page 44: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/44.jpg)
Как выйти из лабиринта?
´ Одним из самых простых правил для прохождения лабиринта является правило "одной руки": двигаясь по лабиринту, надо все время касаться правой или левой рукой его стены.
´ Этот алгоритм, вероятно, был известен еще древним грекам. Придется пройти долгий путь, заходя во все тупики, но в итоге цель будет достигнута
44
![Page 45: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/45.jpg)
FAIL
´ Алгоритм «правой руки» не работает для т.н. многосвязных лабиринтов
´ Односвязными называются лабиринты, не содержащие замкнутых маршрутов и не имеющие отдельно стоящих стенок.
´ Лабиринты с отдельно стоящими стенками и с замкнутыми маршрутами называются многосвязными
45
![Page 46: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/46.jpg)
Тесей-продуман46
![Page 47: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/47.jpg)
Алгоритм Люка-Тремо
´ 1882 – Э. Люка, указал на первенство Тремо
´ Выйдя из любой точки лабиринта, надо сделать отметку на его стене (крест) и двигаться в произвольном направлении до тупика или перекрестка
´ В первом случае вернуться назад, поставить второй крест, свидетельствующий, что путь пройден дважды - туда и назад, и идти в направлении, не пройденном ни разу, или пройденном один раз;
´ Во втором - идти по произвольному направлению, отмечая каждый перекресток на входе и на выходе одним крестом
´ Если на перекресте один крест уже имеется, то следует идти новым путем, если нет - то пройденным путем, отметив его вторым крестом.
47
![Page 48: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/48.jpg)
Что дальше?
´ Классика Computer Science´ Т. Кормен, Ч. Лейзерсон, Р. Ривест, К. Штайн «Алгоритмы: построение и анализ»
´ Р. Седжвик, К. Уэйн «Алгоритмы на Java»
´ Д. Кнут «Искусство программирования»
´ Веб-ресурсы´ http://algolist.ru
´ http://e-maxx.ru
´ http://habr.ru
´ http://rsdn.ru
48
![Page 49: Ярослав Воронцов - Алгоритмы и структуры данных](https://reader030.vdocument.in/reader030/viewer/2022032505/55c881babb61eb093c8b45ba/html5/thumbnails/49.jpg)
Что дальше?
´ Онлайн-курсы (на английском)´ Coursera: Algorithms: Design and Analysis, part 1 & 2 by Tim Roughgarden
´ Coursera: Algorithms, part 1 & 2 by Kevin Wayne and Robert Sedgewick
´ Stanford: CS103 – Mathematical foundations of computing
´ Stanford: CS161 – Design and Analysis of Algorithms
´ Онлайн-курсы (на русском)´ Lektorium.tv
´ ШАД
49