Мастер-класс по алгоритмам
Павел Егоров
https://twitter.com/xoposhiy
pe@kontur.ru
Disclaimer
• 200 часов — примерно столько нужно для
подготовки минимального специалиста по
алгоритмам
• Длительность мастер-класса — 8 часов
Сложность алгоритмов
C.N2 с различными константами
Кажется, что константа очень важна
C.N и C.N log(N) в сравнении с C.N2
Константа уходит далеко на второй план
Сложность алгоритмов
• Процессор устроен так, что разные
операции стоят разное количество тиков.
• И даже стоимость одной операции может
различаться в разы в зависимости от
условий
• Константа не имеет смысла!
• Принято писать O(N log N), игнорируя
константу
Асимптотическая сложность
Говорят, «сложность алгоритма O(f(n))», если
количество операций подразумеваемого
вычислителя начиная с некоторого достаточно
большого n0 меньше, чем f(n)
(с точностью до константы).
Боле строго:

∃C>0, n₀: ∀n > n₀ → operations(n) < C⋅f(n)
Массив
• Массив: область памяти.
• Операции:
– a[i] = x
– x = a[i]
– a.Length

• Важно: нельзя увеличить размер массива
Задача
Циклический сдвиг массива
Сдвинуть массив циклически на k.
Идея: k раз сдвинуть массив циклически на 1
Сложность?
Правильное решение?
Циклический сдвиг массива
Циклический сдвиг массива
Reverse(array, 0, k-1); //O(k)
Reverse(array, k, n-1); //O(n-k)
Reverse(array, 0, n-1); // O(n)
Динамический массив
Хотим массив, но с дополнительной
операцией Add(x)
Идея:
– Держать массив размером с запасом.
– Помнить количество использованных
элементов этого массива
– При исчерпании запаса — создавать новый
больший массив и копировать всё в него
Динамический массив
Add(x){
if (Count == array.Length) {
var newArray = CreateNewArrayOfSize(array.Length+10);
Copy(array, newArray);
array = newArray;
}
array[Count++] = x;
}
for(int i=0; i<N; i++)
list.Add(i);
O(N + 10 + 20 + 30 + … + N)
= O(N + (10 + N) * N / 20)
= O(N*N)
Динамический массив
Add(x){
if (Count == array.Length) {
var newArray = CreateNewArrayOfSize(2*array.Length);
Copy(array, newArray);
array = newArray;
}
array[Count++] = x;
}
for(int i=0; i<N; i++)
list.Add(i);
O(N + 2 + 4 + 8 + … + N)
= O(N + 2*N)
= O(N)
ЕЩЁ СТРУКТУРЫ ДАННЫХ
Бинарное дерево поиска
Хотим новую структуру данных Set!
Операции:
Contains(x), Add(x) быстрее O(N)
Node {
Node left, right;
int value;
}

Сложность операций?
Бинарное дерево. Балансировка
Бинарное дерево поиска
На той же идее можно сделать и Map
Операции:
Add(key, value)
value = Find(key)
Node {
Node left, right;
int key;
string value;
}
Бинарное дерево поиска. Задача
Сделать эффективную (быстрее O(N)) операцию
node = GetNodeAt(index)
Сложность операции?
Node {
Node left, right;
int key;
string value;
int size;
}
Бинарное дерево поиска. Задача
Какова может быть сложность операции обхода всех
узлов, начиная с первого узла с ключом left и заканчивая
последним узлом с ключом right?
foreach(Node node in GetAll(left, right))
Write(node.value);
Node {
Node left, right;
int key;
string value;
}
Бинарное дерево поиска
Добавление пары (key, value)
Поиск по ключу
Поиск i-ого элемента

Перебор K последовательных
элементов

O(log N)

O(K)
Хэш-таблица
Хэш-таблица
Добавление пары
Поиск по ключу

O(1)

Поиск i-ого элемента
Перебор последовательных
элементов

O(N)
Hash vs Tree
16000

Tree/Hash

14000
12000

Tree

15

Hash

10
5

10000

0

8000

0

5000000

10000000

6000
4000
2000
0
0

2000000

4000000

6000000

8000000

C# 5.0 (Dictionary & SortedDictionary), i7 2GHz

10000000
Hash vs Tree
Добавление 10М пар (в секундах)
int → int int → string string → string
Hash
0.5
3
6
Tree
5
9
44

Поиск 10М пар (в секундах)
int → int int → string string → string
Hash
0.7
3
8
Tree
7
12
75

Расход памяти на 10М пар
int → int int → string string → string
Hash
250 Mb
660 Mb
930 Mb
Tree
290 Mb
560 Mb
850 Mb
C# 5.0 (Dictionary & SortedDictionary), i7 2GHz
Задачка 1
Показать всех друзей Пети, которые были на
этой странице новостей.
Задачка 2
Произвести нечеткое сравнение двух текстов.
Результат сравнения — число от 0 до 1:
0 — не похожи, 1 — полностью совпадают
Задачка 3
Найти все товары, в описании которых
встречаются все перечисленные теги.
SQL Select
SELECT friend1
FROM Friends
WHERE friend2 = ‘134123’

Индекс по friend2 — это что?
Дерево или хэш?
Что ключ, а что значение?
Обычные SQL-индексы —
деревья
B-Tree, B*Tree, B+Tree, …
Оптимизируют работу с диском
Очень похожи по характеристикам на
бинарные деревья.
Держать все данные в памяти будет быстрее
(MemCache, Redis, …)
SQL и индексы
8.5.3. How MySQL Uses Indexes
http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
SQL и понимание индексов
SELECT * FROM t WHERE a = 1;
SELECT a FROM t WHERE a = 1;
SELECT f1, f2, f3 FROM t WHERE f1='abc' AND f2=2
SELECT top 10 a FROM t WHERE a > 1 ORDER BY a;
SELECT * FROM t WHERE name LIKE 'abc%';
SELECT * FROM t WHERE name LIKE '%abc';
SELECT * FROM t WHERE a > 100 AND b < 10;
SELECT * FROM t WHERE a = 100 AND b < 10;
SELECT * FROM t WHERE a > 100 AND b = 10;
SELECT * FROM t WHERE f1='abc' AND f2 = 2;
SELECT * FROM t WHERE f1='abc' AND f2=2
ORDER BY f3 DESC, f4 ASC
SELECT * FROM t WHERE f1='abc' OR f2=2;
SELECT * FROM t WHERE DateAdd(f1, 7) = '2011-01-01';
SELECT * FROM t WHERE f1 = DateAdd( '2011-01-01', -7)
SELECT * FROM points
WHERE x BETWEEN 100 AND 200
AND y BETWEEN 200 AND 400;
SELECT * FROM t1 JOIN t2 ON t1.cityname = t2.cityname
SELECT * FROM parent
JOIN child ON child.parentId = parent.id
WHERE parent.type = 'important';
JOIN + Индексы
http://en.wikipedia.org/wiki/Join_(SQL)#Implementation
«Иные» запросы
— иные индексы
— иные структуры данных
Полнотекстовый поиск
«котики порно скачать бесплатно»
• [Исправление опечаток]
• Лемматизация (кот порн скач бесплатн)
• Синонимия (белочки sex download без смс)
• Обратный индекс (слово → документы)
• Ранжирование (сортировка результатов)
Ключевые слова:
Lucene (Solr, Elasticsearch), Sphinx
Гео-поиск
«найди кафешку рядом со мной»
SELECT * FROM Poi WHERE type="cafe"
AND Distance(location, me) < 1000
R-Tree (rectangles tree), Geohash
Ключевые слова:
MySQL spatial extensions,
Spatial Index, Geometric types, PostGIS
Распределенные БД
Кластер, все данные в памяти →
• Хэш-индексы — скорость
• Деревянные индексы — порядок
Как обрабатывать запросы?
Домашнее задание 0
Определить асимптотическую сложность алгоритма:
int F0(int n){
int x = 0;
for(int i=0; i<n; i++)
for(int j=1; j<n; j*=2)

x += i*j;
return x;
}
Домашнее задание 1
Определить асимптотическую сложность алгоритма:
int F1(int n){
int x = 0;
for(int i=0; i<n; i++)
for(int j=i; j<n-i; j+=2)
x += i*j;
return x;
}
Домашнее задание 2
Определить асимптотическую сложность алгоритма:
int F2(int n){
int x = 0;
int j = 1;
for(int i=1; i<n; i++) {
while (j<n && j%i !=0) j++;
if (j<n) x += i*j;
}
return x;
}
Домашнее задание 3*
Дан алгоритм:
void Make(int n, bool flag)
{
if (n==0) return;
for (int i=0; i<n; i++)
Action(flag);
Make((int)(A*n), flag);
Make((int)(A*n), !flag);
}

Действие Action выполняется за константное
время. Определить асимптотическую сложность
алгоритма при A=1/2, A=1/3 и A=2/3
Домашнее задание 4
Могут происходить следующие события:
• Добавление нового комментария
• Удаление комментария
• «Like» комментарию
• Запросить K не удалённых комментариев,
которые менялись (добавлялись или
лайкались) самыми последними.
Ещё о применении хэшей
Ключевые слова:
полиномиальный хэш, rolling hash
Книги

Александр Шень (Free)
Online курсы
https://www.coursera.org/courses?orderby=upc
oming&search=algorithms&cats=cs-theory
Сайты для тренировок
http://acm.timus.ru
http://projecteuler.net
http://www.sql-ex.ru/

More Related Content

PDF
ОПК № 5 – Составные типы данных, списки
PDF
Лекция 3: Бинарный поиск. Связные списки
PDF
Лекция 4. Префиксные деревья (tries, prefix trees)
PPTX
Highload. Создание специализированных высокопроизводительных индексов
PDF
Лекция 10. Биномиальные кучи (Binomial heaps)
PDF
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
PDF
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
PDF
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
ОПК № 5 – Составные типы данных, списки
Лекция 3: Бинарный поиск. Связные списки
Лекция 4. Префиксные деревья (tries, prefix trees)
Highload. Создание специализированных высокопроизводительных индексов
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)

What's hot (20)

PDF
Лекция 3: Бинарный поиск. Связные списки
PDF
Лекция 4. Стеки и очереди
PPTX
Algo 00
PDF
Лекция 5. Бинарные деревья поиска
PDF
Алгоритмы и структуры данных осень 2013 лекция 2
PDF
Алгоритмы и структуры данных осень 2013 лекция 1
PDF
Лекция 6: Биномиальные кучи (Binomial heaps)
PDF
Лекция 3. АВЛ-деревья (AVL trees)
PDF
Алгоритмы и структуры данных весна 2014 лекция 2
PDF
Лекция 4: Стек. Очередь
PDF
Абстрактные типы данных, контейнеры и списки
PDF
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
PDF
Основы С++ (массивы, указатели). Задачи с массивами
PDF
Лекция 5. B-деревья (B-trees, k-way merge sort)
PDF
Excel in Javascript
PDF
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
PDF
Лекция 4: Префиксные деревья (Tries, prefix trees)
PDF
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
PDF
Learning from Swift sources, Иван Сметанин
PPTX
Highload: специализированные высокопроизводительные индексы
Лекция 3: Бинарный поиск. Связные списки
Лекция 4. Стеки и очереди
Algo 00
Лекция 5. Бинарные деревья поиска
Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 1
Лекция 6: Биномиальные кучи (Binomial heaps)
Лекция 3. АВЛ-деревья (AVL trees)
Алгоритмы и структуры данных весна 2014 лекция 2
Лекция 4: Стек. Очередь
Абстрактные типы данных, контейнеры и списки
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Основы С++ (массивы, указатели). Задачи с массивами
Лекция 5. B-деревья (B-trees, k-way merge sort)
Excel in Javascript
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция 4: Префиксные деревья (Tries, prefix trees)
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Learning from Swift sources, Иван Сметанин
Highload: специализированные высокопроизводительные индексы
Ad

Similar to Мастер класс по алгоритмам. Часть 1 (20)

PPTX
NoSQL - взрыв возможностей
PPTX
Производительный специализированный поиск: архитектура, область применимости ...
PPTX
Пишем самый быстрый хеш для кэширования данных
PDF
Народные средства оптимизации PostgreSQL
PPT
Цена абстракции, Андрей Аксёнов (Sphinx)
PPTX
Big Data - первые шаги
PPTX
Оптимизации скорости выполнения запросов
PPT
PDF
20120226 information retrieval raskovalov_lecture03-04
PDF
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
PDF
Как читать и интерпретировать вывод команды EXPLAIN
PDF
Иван Фролков
PPTX
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
PDF
Паттерны и примеры структур данных в NoSQL на примере Tarantool
PPTX
Как, используя Lucene, построить высоконагруженную систему поиска разнородных...
PPTX
Lucene in odnoklassniki.ru
PDF
Информационный поиск. Инвертированный индекс. Обработка булевых запросов.
PDF
Лекция 5: B-деревья (B-trees, k-way merge sort)
PPTX
Поиск на своем сайте, обзор Open source решений (Алексей Рагозин)
PDF
Архитектура и новые возможности B-tree
NoSQL - взрыв возможностей
Производительный специализированный поиск: архитектура, область применимости ...
Пишем самый быстрый хеш для кэширования данных
Народные средства оптимизации PostgreSQL
Цена абстракции, Андрей Аксёнов (Sphinx)
Big Data - первые шаги
Оптимизации скорости выполнения запросов
20120226 information retrieval raskovalov_lecture03-04
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
Как читать и интерпретировать вывод команды EXPLAIN
Иван Фролков
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Паттерны и примеры структур данных в NoSQL на примере Tarantool
Как, используя Lucene, построить высоконагруженную систему поиска разнородных...
Lucene in odnoklassniki.ru
Информационный поиск. Инвертированный индекс. Обработка булевых запросов.
Лекция 5: B-деревья (B-trees, k-way merge sort)
Поиск на своем сайте, обзор Open source решений (Алексей Рагозин)
Архитектура и новые возможности B-tree
Ad

More from Pavel Egorov (14)

PPTX
Git basics
PPTX
Интеллект-карты для конспектирования
PPTX
Мастер класс по алгоритмам. Часть 2
PPTX
Code retreat @ крешкурс2013
PPTX
Software Engineering. Введение в специальность. Что дальше?
PPTX
Software engineering. Введение в специальность. Проектирование, требования
PPTX
Software engineering. Введение в специальность. Обзор
PPTX
Машинное обучение (Открытый семинар по средам)
PPTX
Cистема подготовки разработчиков @ CoIT
PPTX
Разработка ПО. Введение в специальность 3. Требования
PPTX
Разработка ПО. Введение в специальность 1
PPTX
AI challenge 2011
PPTX
Highload в контуре @ DUMP 2011
PPTX
Основы Di контейнеров
Git basics
Интеллект-карты для конспектирования
Мастер класс по алгоритмам. Часть 2
Code retreat @ крешкурс2013
Software Engineering. Введение в специальность. Что дальше?
Software engineering. Введение в специальность. Проектирование, требования
Software engineering. Введение в специальность. Обзор
Машинное обучение (Открытый семинар по средам)
Cистема подготовки разработчиков @ CoIT
Разработка ПО. Введение в специальность 3. Требования
Разработка ПО. Введение в специальность 1
AI challenge 2011
Highload в контуре @ DUMP 2011
Основы Di контейнеров

Мастер класс по алгоритмам. Часть 1