Algorithms and data
structures
Yaroslav Vorontsov
Senior Software engineer/Tech lead
M.Sc., PhD
yvorontsov@dataart.com
Agenda
´ Немного нудных определений
´ Переход дороги с некоторыми нюансами
´ Разные греческие буквы – омега, тета
´ Ещё нудные определения
´ Базовые структуры данных и их сложность
´ Базовые алгоритмы и их сложность
´ Немного веселья
2
Нудные определения
´ Алгоритм – набор инструкций,
описывающих порядок действий
исполнителя для достижения
результата решения задачи за
конечное число действий
´ Вычислительные процессы
алгоритмического характера
известны человечеству с
глубокой древности
´ Явное определение – начало 20
века
3
Попытки формализации понятия
алгоритма
´ А. Чёрч – лямбда-исчисление, тезис Чёрча
´ A. Тьюринг – машина Тьюринга
´ А. Марков – нормальный алгорифм (алгоритм)
´ Машина Поста (автоматное программирование)
´ Рекурсивная функция
´ Brainfuck
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++. ------.--------.>+.>.
Hello World
4
Один из наиболее старых
алгоритмов
5
Кто считается первым
программистом?
6
Вместо дальнейшего введения
´ Как перейти дорогу?
´ Посмотрите налево
´ Посмотрите направо
´ Переходите
7
Но…
«Есть нюансы» (с)
В.И. Чапаев в известном анекдоте
8
Суслики – самые осторожные животные…
Они становятся на задние лапки
и смотрят вдаль: не бежит ли лиса? Не летит ли орел? Не ползет ли змея?
И самые наблюдательные из них получают бампером в лоб…
9
Нюанс 110
Он же11
Нюанс 212
Извините, вот правильный нюанс 213
Нюанс 314
Нюанс 4
´ «Эй, гражданина, ты туда не
ходи, ты сюда ходи. А то снег
башка попадёт, совсем
мёртвый будешь!»
´ Серьёзно, как вы вообще здесь
оказались?
15
Нюансы 5 и 616
А ещё…
´ Вы идёте с коляской/тележкой?
´ Находятся ли транспортные
средства на безопасном
расстоянии?
´ Правило «3Д», оно же «ДДД»
(особенно касается
воронежских дорог)
´ Посмотрели ли вы наверх?
(вдруг инопланетяне?)
´ А вдруг крокодилы?
17
К чему всё это было?
´ У алгоритмов есть формальные свойства
´ Дискретность
´ Детерминированность
´ Понятность
´ Конечность
´ Массовость/Универсальность
´ Результативность
´ Алгоритм не содержит ошибок, если он даёт правильные результаты
для любых допустимых исходных данных
18
Минутка К.О.
´ Среднестатистический случай
работы алгоритма никому не
интересен!
´ При анализе алгоритмов, в
первую очередь обращают
внимание на пограничные или
предельные ситуации
´ Анализ алгоритмов при малом
размере входных данных также
не представляет интереса!
19
Альфа, бета, эта, тета…20
Альфа, бета, эта, тета…21
Часто встречающиеся оценки22
Часто встречающиеся оценки23
Хорошо, а где же структуры
данных?
Название-то A&DS…
24
Снова нудная теория
´ Структура данных – программная единица, позволяющая хранить и
обрабатывать множество однотипных и/или логически связанных
данных в вычислительной технике. Для добавления, поиска, изменения и
удаления данных структура данных предоставляет некоторый набор
функций, составляющих её интерфейс
´ В большинстве современных языков программирования
«строительными блоками» для сложных структур данных являются
´ Массивы (array)
´ Записи (struct/record)
´ Объединения (union)
´ Ссылки (reference/pointer)
25
Какие бывают структуры данных?
´ Список (List)
´ Ассоциативный массив (Map)
´ Хэш-таблица (Hash table)
´ Дек (Deque)
´ Граф (Graph)
´ Дерево (Tree)
´ Пирамида/Куча (Heap)
´ Таблица (Table)
´ Система непересекающихся множеств (Union-Find)
26
Основные структуры данных27
Основные структуры данных28
Основные структуры данных29
А вот и основные алгоритмы30
А вот и основные алгоритмы31
Алгоритм умножения: русский
крестьянский метод
´ Не требует знания таблицы
умножения
´ Надо уметь умножать и делить
на 2
´ Умножение и деление на 2 –
сдвиг на 1 разряд налево-
направо
´ Аппаратная или низкоуровневая
реализация
32
Рандом не такой уж и рандом
´ rand()
´ srand()
´ arc4random()
´ arc4random_uniform()
´ …
´ X[N+1] = (A*X[N]+C) mod M
33
Divide et impera
´ Метод «разделяй и властвуй»
заключается в рекурсивном
разбиении задачи на две или
более подзадачи того же типа,
но меньшего размера, и
комбинации их решений для
получения ответа к исходной
задаче
´ Разбиения выполняются до тех
пор, пока все подзадачи не
окажутся элементарными
34
Алгоритм Штрассена для матриц
´ Эффективен при размере
матриц от 32 до 128
´ Работает за субкубическое
время
´ Оптимизируется для малых
матриц за счёт обычного
«кубического» перемножения
´ Необходимо, чтобы размер
матриц был степенью двойки.
Если это не так – матрица
дополняется нулями
35
Quicksort
´ Выбор опорного элемента
´ Разделение массива
´ Шаг рекурсии – запуск
вышеописанных действий для
подмассивов
´ Устойчивость метода
´ Хороший случай
´ Плохой случай
´ Оптимизации
36
Жадные алгоритмы
´ Жадный алгоритм принимает
локально оптимальные
решения на каждом этапе
выполнения, допуская, что и
конечное решение окажется
оптимальным
´ Наиболее известные алгоритмы
´ Алгоритм Хаффмана
´ Алгоритм Прима-Ярника
´ Алгоритм Краскала
´ Алгоритм Дейкстры
37
Алгоритм Дейкстры38
Дейкстра и Интернет (OSPF)
´ LSA – Link State Advertisement
´ При использовании протокола
OSPF маршрутизаторы
обмениваются информацией о
топологии сети.
´ Потом, на основании этой
информации с помощью
алгоритма
Дейкстры рассчитывают
таблицу маршрутизации
39
Вероятностные алгоритмы
´ Подразумевают обращение к ГСЧ на определённом этапе своей
работы
´ Позволяют пожертвовать абсолютной достоверностью ради
ускорения/экономии во времени
´ Таких алгоритмов не так-то и мало:
´ Фильтр Блума
´ Поиск минимальногоразреза в графе
´ Лас-Вегас (выполнить А с результатом r до тех пор, пока K(r) не истина)
´ Вероятностная раскраска графа
´ С натяжкой – марковские цепи, метод Монте-Карло, алгоритмы сжатия
40
Фильтр Блума41
Нет, не этого Блума
´ Можно получить ложноположительное срабатывание, но никогда –
ложноотрицательное
´ Основан на битовом массиве и хэш-функции
42
Алгоритм Каргера
´ Минимальный разрез графа –
разбиение множества вершин
на две непустые части, при
котором рассекается
минимальное число рёбер
´ 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
Как выйти из лабиринта?
´ Одним из самых простых
правил для прохождения
лабиринта является правило
"одной руки": двигаясь по
лабиринту, надо все время
касаться правой или левой
рукой его стены.
´ Этот алгоритм, вероятно, был
известен еще древним грекам.
Придется пройти долгий путь,
заходя во все тупики, но в итоге
цель будет достигнута
44
FAIL
´ Алгоритм «правой руки» не работает
для т.н. многосвязных лабиринтов
´ Односвязными называются
лабиринты, не содержащие
замкнутых маршрутов и не
имеющие отдельно стоящих стенок.
´ Лабиринты с отдельно стоящими
стенками и с замкнутыми
маршрутами называются
многосвязными
45
Тесей-продуман46
Алгоритм Люка-Тремо
´ 1882 – Э. Люка, указал на первенство Тремо
´ Выйдя из любой точки лабиринта, надо сделать отметку на его стене
(крест) и двигаться в произвольном направлении до тупика или
перекрестка
´ В первом случае вернуться назад, поставить второй крест,
свидетельствующий, что путь пройден дважды - туда и назад, и идти в
направлении, не пройденном ни разу, или пройденном один раз;
´ Во втором - идти по произвольному направлению, отмечая каждый
перекресток на входе и на выходе одним крестом
´ Если на перекресте один крест уже имеется, то следует идти новым
путем, если нет - то пройденным путем, отметив его вторым крестом.
47
Что дальше?
´ Классика Computer Science
´ Т. Кормен, Ч. Лейзерсон, Р. Ривест, К. Штайн «Алгоритмы: построение и
анализ»
´ Р. Седжвик, К. Уэйн «Алгоритмы на Java»
´ Д. Кнут «Искусство программирования»
´ Веб-ресурсы
´ http://algolist.ru
´ http://e-maxx.ru
´ http://habr.ru
´ http://rsdn.ru
48
Что дальше?
´ Онлайн-курсы (на английском)
´ 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
Thnx!
Yaroslav Vorontsov
Senior Software engineer/Tech lead
M.Sc., PhD
yvorontsov@dataart.com

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

  • 1.
    Algorithms and data structures YaroslavVorontsov Senior Software engineer/Tech lead M.Sc., PhD yvorontsov@dataart.com
  • 2.
    Agenda ´ Немного нудныхопределений ´ Переход дороги с некоторыми нюансами ´ Разные греческие буквы – омега, тета ´ Ещё нудные определения ´ Базовые структуры данных и их сложность ´ Базовые алгоритмы и их сложность ´ Немного веселья 2
  • 3.
    Нудные определения ´ Алгоритм– набор инструкций, описывающих порядок действий исполнителя для достижения результата решения задачи за конечное число действий ´ Вычислительные процессы алгоритмического характера известны человечеству с глубокой древности ´ Явное определение – начало 20 века 3
  • 4.
    Попытки формализации понятия алгоритма ´А. Чёрч – лямбда-исчисление, тезис Чёрча ´ A. Тьюринг – машина Тьюринга ´ А. Марков – нормальный алгорифм (алгоритм) ´ Машина Поста (автоматное программирование) ´ Рекурсивная функция ´ Brainfuck ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++ .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++. ------.--------.>+.>. Hello World 4
  • 5.
    Один из наиболеестарых алгоритмов 5
  • 6.
  • 7.
    Вместо дальнейшего введения ´Как перейти дорогу? ´ Посмотрите налево ´ Посмотрите направо ´ Переходите 7
  • 8.
    Но… «Есть нюансы» (с) В.И.Чапаев в известном анекдоте 8
  • 9.
    Суслики – самыеосторожные животные… Они становятся на задние лапки и смотрят вдаль: не бежит ли лиса? Не летит ли орел? Не ползет ли змея? И самые наблюдательные из них получают бампером в лоб… 9
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
    Нюанс 4 ´ «Эй,гражданина, ты туда не ходи, ты сюда ходи. А то снег башка попадёт, совсем мёртвый будешь!» ´ Серьёзно, как вы вообще здесь оказались? 15
  • 16.
  • 17.
    А ещё… ´ Выидёте с коляской/тележкой? ´ Находятся ли транспортные средства на безопасном расстоянии? ´ Правило «3Д», оно же «ДДД» (особенно касается воронежских дорог) ´ Посмотрели ли вы наверх? (вдруг инопланетяне?) ´ А вдруг крокодилы? 17
  • 18.
    К чему всёэто было? ´ У алгоритмов есть формальные свойства ´ Дискретность ´ Детерминированность ´ Понятность ´ Конечность ´ Массовость/Универсальность ´ Результативность ´ Алгоритм не содержит ошибок, если он даёт правильные результаты для любых допустимых исходных данных 18
  • 19.
    Минутка К.О. ´ Среднестатистическийслучай работы алгоритма никому не интересен! ´ При анализе алгоритмов, в первую очередь обращают внимание на пограничные или предельные ситуации ´ Анализ алгоритмов при малом размере входных данных также не представляет интереса! 19
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
    Хорошо, а гдеже структуры данных? Название-то A&DS… 24
  • 25.
    Снова нудная теория ´Структура данных – программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных в вычислительной технике. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс ´ В большинстве современных языков программирования «строительными блоками» для сложных структур данных являются ´ Массивы (array) ´ Записи (struct/record) ´ Объединения (union) ´ Ссылки (reference/pointer) 25
  • 26.
    Какие бывают структурыданных? ´ Список (List) ´ Ассоциативный массив (Map) ´ Хэш-таблица (Hash table) ´ Дек (Deque) ´ Граф (Graph) ´ Дерево (Tree) ´ Пирамида/Куча (Heap) ´ Таблица (Table) ´ Система непересекающихся множеств (Union-Find) 26
  • 27.
  • 28.
  • 29.
  • 30.
    А вот иосновные алгоритмы30
  • 31.
    А вот иосновные алгоритмы31
  • 32.
    Алгоритм умножения: русский крестьянскийметод ´ Не требует знания таблицы умножения ´ Надо уметь умножать и делить на 2 ´ Умножение и деление на 2 – сдвиг на 1 разряд налево- направо ´ Аппаратная или низкоуровневая реализация 32
  • 33.
    Рандом не такойуж и рандом ´ rand() ´ srand() ´ arc4random() ´ arc4random_uniform() ´ … ´ X[N+1] = (A*X[N]+C) mod M 33
  • 34.
    Divide et impera ´Метод «разделяй и властвуй» заключается в рекурсивном разбиении задачи на две или более подзадачи того же типа, но меньшего размера, и комбинации их решений для получения ответа к исходной задаче ´ Разбиения выполняются до тех пор, пока все подзадачи не окажутся элементарными 34
  • 35.
    Алгоритм Штрассена дляматриц ´ Эффективен при размере матриц от 32 до 128 ´ Работает за субкубическое время ´ Оптимизируется для малых матриц за счёт обычного «кубического» перемножения ´ Необходимо, чтобы размер матриц был степенью двойки. Если это не так – матрица дополняется нулями 35
  • 36.
    Quicksort ´ Выбор опорногоэлемента ´ Разделение массива ´ Шаг рекурсии – запуск вышеописанных действий для подмассивов ´ Устойчивость метода ´ Хороший случай ´ Плохой случай ´ Оптимизации 36
  • 37.
    Жадные алгоритмы ´ Жадныйалгоритм принимает локально оптимальные решения на каждом этапе выполнения, допуская, что и конечное решение окажется оптимальным ´ Наиболее известные алгоритмы ´ Алгоритм Хаффмана ´ Алгоритм Прима-Ярника ´ Алгоритм Краскала ´ Алгоритм Дейкстры 37
  • 38.
  • 39.
    Дейкстра и Интернет(OSPF) ´ LSA – Link State Advertisement ´ При использовании протокола OSPF маршрутизаторы обмениваются информацией о топологии сети. ´ Потом, на основании этой информации с помощью алгоритма Дейкстры рассчитывают таблицу маршрутизации 39
  • 40.
    Вероятностные алгоритмы ´ Подразумеваютобращение к ГСЧ на определённом этапе своей работы ´ Позволяют пожертвовать абсолютной достоверностью ради ускорения/экономии во времени ´ Таких алгоритмов не так-то и мало: ´ Фильтр Блума ´ Поиск минимальногоразреза в графе ´ Лас-Вегас (выполнить А с результатом r до тех пор, пока K(r) не истина) ´ Вероятностная раскраска графа ´ С натяжкой – марковские цепи, метод Монте-Карло, алгоритмы сжатия 40
  • 41.
  • 42.
    Нет, не этогоБлума ´ Можно получить ложноположительное срабатывание, но никогда – ложноотрицательное ´ Основан на битовом массиве и хэш-функции 42
  • 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
  • 44.
    Как выйти излабиринта? ´ Одним из самых простых правил для прохождения лабиринта является правило "одной руки": двигаясь по лабиринту, надо все время касаться правой или левой рукой его стены. ´ Этот алгоритм, вероятно, был известен еще древним грекам. Придется пройти долгий путь, заходя во все тупики, но в итоге цель будет достигнута 44
  • 45.
    FAIL ´ Алгоритм «правойруки» не работает для т.н. многосвязных лабиринтов ´ Односвязными называются лабиринты, не содержащие замкнутых маршрутов и не имеющие отдельно стоящих стенок. ´ Лабиринты с отдельно стоящими стенками и с замкнутыми маршрутами называются многосвязными 45
  • 46.
  • 47.
    Алгоритм Люка-Тремо ´ 1882– Э. Люка, указал на первенство Тремо ´ Выйдя из любой точки лабиринта, надо сделать отметку на его стене (крест) и двигаться в произвольном направлении до тупика или перекрестка ´ В первом случае вернуться назад, поставить второй крест, свидетельствующий, что путь пройден дважды - туда и назад, и идти в направлении, не пройденном ни разу, или пройденном один раз; ´ Во втором - идти по произвольному направлению, отмечая каждый перекресток на входе и на выходе одним крестом ´ Если на перекресте один крест уже имеется, то следует идти новым путем, если нет - то пройденным путем, отметив его вторым крестом. 47
  • 48.
    Что дальше? ´ КлассикаComputer Science ´ Т. Кормен, Ч. Лейзерсон, Р. Ривест, К. Штайн «Алгоритмы: построение и анализ» ´ Р. Седжвик, К. Уэйн «Алгоритмы на Java» ´ Д. Кнут «Искусство программирования» ´ Веб-ресурсы ´ http://algolist.ru ´ http://e-maxx.ru ´ http://habr.ru ´ http://rsdn.ru 48
  • 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
  • 50.
    Thnx! Yaroslav Vorontsov Senior Softwareengineer/Tech lead M.Sc., PhD yvorontsov@dataart.com