Ярослав Воронцов - Алгоритмы и структуры данных

50
Algorithms and data structures Yaroslav Vorontsov Senior Software engineer/Tech lead M.Sc., PhD [email protected]

Transcript of Ярослав Воронцов - Алгоритмы и структуры данных

Page 1: Ярослав Воронцов - Алгоритмы и структуры данных

Algorithms and data structures

Yaroslav Vorontsov

Senior Software engineer/Tech lead

M.Sc., PhD

[email protected]

Page 2: Ярослав Воронцов - Алгоритмы и структуры данных

Agenda

´ Немного нудных определений

´ Переход дороги с некоторыми нюансами

´ Разные греческие буквы – омега, тета

´ Ещё нудные определения

´ Базовые структуры данных и их сложность

´ Базовые алгоритмы и их сложность

´ Немного веселья

2

Page 3: Ярослав Воронцов - Алгоритмы и структуры данных

Нудные определения

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

´ Вычислительные процессы алгоритмического характера известны человечеству с глубокой древности

´ Явное определение – начало 20 века

3

Page 4: Ярослав Воронцов - Алгоритмы и структуры данных

Попытки формализации понятия алгоритма´ А. Чёрч – лямбда-исчисление, тезис Чёрча

´ A. Тьюринг – машина Тьюринга

´ А. Марков – нормальный алгорифм (алгоритм)

´ Машина Поста (автоматное программирование)

´ Рекурсивная функция

´ Brainfuck

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++ .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++. ------.--------.>+.>.

Hello World

4

Page 5: Ярослав Воронцов - Алгоритмы и структуры данных

Один из наиболее старых алгоритмов

5

Page 6: Ярослав Воронцов - Алгоритмы и структуры данных

Кто считается первым программистом?

6

Page 7: Ярослав Воронцов - Алгоритмы и структуры данных

Вместо дальнейшего введения

´ Как перейти дорогу?´ Посмотрите налево

´ Посмотрите направо

´ Переходите

7

Page 8: Ярослав Воронцов - Алгоритмы и структуры данных

Но…

«Есть нюансы» (с)

В.И. Чапаев в известном анекдоте

8

Page 9: Ярослав Воронцов - Алгоритмы и структуры данных

Суслики – самые осторожные животные…Они становятся на задние лапки

и смотрят вдаль: не бежит ли лиса? Не летит ли орел? Не ползет ли змея?

И самые наблюдательные из них получают бампером в лоб…

9

Page 10: Ярослав Воронцов - Алгоритмы и структуры данных

Нюанс 110

Page 11: Ярослав Воронцов - Алгоритмы и структуры данных

Он же11

Page 12: Ярослав Воронцов - Алгоритмы и структуры данных

Нюанс 212

Page 13: Ярослав Воронцов - Алгоритмы и структуры данных

Извините, вот правильный нюанс 213

Page 14: Ярослав Воронцов - Алгоритмы и структуры данных

Нюанс 314

Page 15: Ярослав Воронцов - Алгоритмы и структуры данных

Нюанс 4

´ «Эй, гражданина, ты туда не ходи, ты сюда ходи. А то снег башка попадёт, совсем мёртвый будешь!»

´ Серьёзно, как вы вообще здесь оказались?

15

Page 16: Ярослав Воронцов - Алгоритмы и структуры данных

Нюансы 5 и 616

Page 17: Ярослав Воронцов - Алгоритмы и структуры данных

А ещё…

´ Вы идёте с коляской/тележкой?

´ Находятся ли транспортные средства на безопасном расстоянии?

´ Правило «3Д», оно же «ДДД» (особенно касается воронежских дорог)

´ Посмотрели ли вы наверх? (вдруг инопланетяне?)

´ А вдруг крокодилы?

17

Page 18: Ярослав Воронцов - Алгоритмы и структуры данных

К чему всё это было?

´ У алгоритмов есть формальные свойства´ Дискретность

´ Детерминированность

´ Понятность

´ Конечность

´ Массовость/Универсальность

´ Результативность

´ Алгоритм не содержит ошибок, если он даёт правильные результаты для любых допустимых исходных данных

18

Page 19: Ярослав Воронцов - Алгоритмы и структуры данных

Минутка К.О.

´ Среднестатистический случай работы алгоритма никому не интересен!

´ При анализе алгоритмов, в первую очередь обращают внимание на пограничные или предельные ситуации

´ Анализ алгоритмов при малом размере входных данных также не представляет интереса!

19

Page 20: Ярослав Воронцов - Алгоритмы и структуры данных

Альфа, бета, эта, тета…20

Page 21: Ярослав Воронцов - Алгоритмы и структуры данных

Альфа, бета, эта, тета…21

Page 22: Ярослав Воронцов - Алгоритмы и структуры данных

Часто встречающиеся оценки22

Page 23: Ярослав Воронцов - Алгоритмы и структуры данных

Часто встречающиеся оценки23

Page 24: Ярослав Воронцов - Алгоритмы и структуры данных

Хорошо, а где же структуры данных?Название-то A&DS…

24

Page 25: Ярослав Воронцов - Алгоритмы и структуры данных

Снова нудная теория

´ Структура данных – программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных в вычислительной технике. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс

´ В большинстве современных языков программирования «строительными блоками» для сложных структур данных являются´ Массивы (array)

´ Записи (struct/record)

´ Объединения (union)

´ Ссылки (reference/pointer)

25

Page 26: Ярослав Воронцов - Алгоритмы и структуры данных

Какие бывают структуры данных?

´ Список (List)

´ Ассоциативный массив (Map)

´ Хэш-таблица (Hash table)

´ Дек (Deque)

´ Граф (Graph)

´ Дерево (Tree)

´ Пирамида/Куча (Heap)

´ Таблица (Table)

´ Система непересекающихся множеств (Union-Find)

26

Page 27: Ярослав Воронцов - Алгоритмы и структуры данных

Основные структуры данных27

Page 28: Ярослав Воронцов - Алгоритмы и структуры данных

Основные структуры данных28

Page 29: Ярослав Воронцов - Алгоритмы и структуры данных

Основные структуры данных29

Page 30: Ярослав Воронцов - Алгоритмы и структуры данных

А вот и основные алгоритмы30

Page 31: Ярослав Воронцов - Алгоритмы и структуры данных

А вот и основные алгоритмы31

Page 32: Ярослав Воронцов - Алгоритмы и структуры данных

Алгоритм умножения: русский крестьянский метод´ Не требует знания таблицы

умножения

´ Надо уметь умножать и делить на 2

´ Умножение и деление на 2 –сдвиг на 1 разряд налево-направо

´ Аппаратная или низкоуровневая реализация

32

Page 33: Ярослав Воронцов - Алгоритмы и структуры данных

Рандом не такой уж и рандом

´ rand()

´ srand()

´ arc4random()

´ arc4random_uniform()

´ …

´ X[N+1] = (A*X[N]+C) mod M

33

Page 34: Ярослав Воронцов - Алгоритмы и структуры данных

Divide et impera

´ Метод «разделяй и властвуй» заключается в рекурсивном разбиении задачи на две или более подзадачи того же типа, но меньшего размера, и комбинации их решений для получения ответа к исходной задаче

´ Разбиения выполняются до тех пор, пока все подзадачи не окажутся элементарными

34

Page 35: Ярослав Воронцов - Алгоритмы и структуры данных

Алгоритм Штрассена для матриц

´ Эффективен при размере матриц от 32 до 128

´ Работает за субкубическоевремя

´ Оптимизируется для малых матриц за счёт обычного «кубического» перемножения

´ Необходимо, чтобы размер матриц был степенью двойки. Если это не так – матрица дополняется нулями

35

Page 36: Ярослав Воронцов - Алгоритмы и структуры данных

Quicksort

´ Выбор опорного элемента

´ Разделение массива

´ Шаг рекурсии – запуск вышеописанных действий для подмассивов

´ Устойчивость метода´ Хороший случай

´ Плохой случай

´ Оптимизации

36

Page 37: Ярослав Воронцов - Алгоритмы и структуры данных

Жадные алгоритмы

´ Жадный алгоритм принимает локально оптимальные решения на каждом этапе выполнения, допуская, что и конечное решение окажется оптимальным

´ Наиболее известные алгоритмы´ Алгоритм Хаффмана

´ Алгоритм Прима-Ярника

´ Алгоритм Краскала

´ Алгоритм Дейкстры

37

Page 38: Ярослав Воронцов - Алгоритмы и структуры данных

Алгоритм Дейкстры38

Page 39: Ярослав Воронцов - Алгоритмы и структуры данных

Дейкстра и Интернет (OSPF)

´ LSA – Link State Advertisement

´ При использовании протокола OSPF маршрутизаторы обмениваются информацией о топологии сети.

´ Потом, на основании этой информации с помощью алгоритмаДейкстры рассчитывают таблицу маршрутизации

39

Page 40: Ярослав Воронцов - Алгоритмы и структуры данных

Вероятностные алгоритмы

´ Подразумевают обращение к ГСЧ на определённом этапе своей работы

´ Позволяют пожертвовать абсолютной достоверностью ради ускорения/экономии во времени

´ Таких алгоритмов не так-то и мало:´ Фильтр Блума

´ Поиск минимального разреза в графе

´ Лас-Вегас (выполнить А с результатом r до тех пор, пока K(r) не истина)

´ Вероятностная раскраска графа

´ С натяжкой –марковские цепи, метод Монте-Карло, алгоритмы сжатия

40

Page 41: Ярослав Воронцов - Алгоритмы и структуры данных

Фильтр Блума41

Page 42: Ярослав Воронцов - Алгоритмы и структуры данных

Нет, не этого Блума

´ Можно получить ложноположительное срабатывание, но никогда –ложноотрицательное

´ Основан на битовом массиве и хэш-функции

42

Page 43: Ярослав Воронцов - Алгоритмы и структуры данных

Алгоритм Каргера

´ Минимальный разрез графа –разбиение множества вершин на две непустые части, при котором рассекается минимальное число рёбер

´ 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: Ярослав Воронцов - Алгоритмы и структуры данных

Как выйти из лабиринта?

´ Одним из самых простых правил для прохождения лабиринта является правило "одной руки": двигаясь по лабиринту, надо все время касаться правой или левой рукой его стены.

´ Этот алгоритм, вероятно, был известен еще древним грекам. Придется пройти долгий путь, заходя во все тупики, но в итоге цель будет достигнута

44

Page 45: Ярослав Воронцов - Алгоритмы и структуры данных

FAIL

´ Алгоритм «правой руки» не работает для т.н. многосвязных лабиринтов

´ Односвязными называются лабиринты, не содержащие замкнутых маршрутов и не имеющие отдельно стоящих стенок.

´ Лабиринты с отдельно стоящими стенками и с замкнутыми маршрутами называются многосвязными

45

Page 46: Ярослав Воронцов - Алгоритмы и структуры данных

Тесей-продуман46

Page 47: Ярослав Воронцов - Алгоритмы и структуры данных

Алгоритм Люка-Тремо

´ 1882 – Э. Люка, указал на первенство Тремо

´ Выйдя из любой точки лабиринта, надо сделать отметку на его стене (крест) и двигаться в произвольном направлении до тупика или перекрестка

´ В первом случае вернуться назад, поставить второй крест, свидетельствующий, что путь пройден дважды - туда и назад, и идти в направлении, не пройденном ни разу, или пройденном один раз;

´ Во втором - идти по произвольному направлению, отмечая каждый перекресток на входе и на выходе одним крестом

´ Если на перекресте один крест уже имеется, то следует идти новым путем, если нет - то пройденным путем, отметив его вторым крестом.

47

Page 48: Ярослав Воронцов - Алгоритмы и структуры данных

Что дальше?

´ Классика Computer Science´ Т. Кормен, Ч. Лейзерсон, Р. Ривест, К. Штайн «Алгоритмы: построение и анализ»

´ Р. Седжвик, К. Уэйн «Алгоритмы на Java»

´ Д. Кнут «Искусство программирования»

´ Веб-ресурсы´ http://algolist.ru

´ http://e-maxx.ru

´ http://habr.ru

´ http://rsdn.ru

48

Page 49: Ярослав Воронцов - Алгоритмы и структуры данных

Что дальше?

´ Онлайн-курсы (на английском)´ 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

Page 50: Ярослав Воронцов - Алгоритмы и структуры данных

Thnx!

Yaroslav Vorontsov

Senior Software engineer/Tech lead

M.Sc., PhD

[email protected]