Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Мастер-класс по алгоритмам
Часть 2
Павел Егоров
https://twitter.com/xoposhiy
pe@kontur.ru
Домашнее задание 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 не удалённых комментариев,
которые менялись (добавлялись или
лайкались) самыми последними.
ещё немного

О ПРИМЕНЕНИИ ХЭШЕЙ
Криптография
Требования:
1. Необратимость
2. Стойкость к коллизиям
Применение:
Digest, хранение паролей.
Алгоритмы:
Md5 — взломан!
Sha1 — взломан теоретически.
Sha2, Sha256 — ОК
ГОСТ — меееедлееееннныыыый
Сравнение длинных строк
Строки с длинными общими префиксами
Пути файлов
Адреса в интернете
…
Полиномиальный хэш
p3

p2

p

1

H E L L O !
p3

p2

!

p

1

H E L L O !

!

!
!
Алгоритм Рабина-Карпа (87 г.)
Поиск подстроки в тексте
http://en.wikipedia.org/wiki/Rabin-Karp_string_search_algorithm

Поиск «паттерна» в потоке событий
Хэширование N-грамм
Потоковая обработка событий
Нужно поддерживать какие-то статистики об
интенсивном потоке событий.
Хотим тратить RAM меньше, чем O(N)
Хотим тратить времени ~ O(1) на событие
• Биллинг
• Статистика ошибок
• …
Биллинг
K клиентов, нужно раз в месяц выставлять
счет, основываясь на количестве и типах
произошедших транзакций (звонков,
покупок, …)
Постоянно показывать текущий баланс
Биллинг
Дано:
Лог транзакций
Хотим:
Id клиента → текущий счет / баланс
«Сумматор»
Каждую секунду регистрируются события:
AddNextTickEventCount(int time, int count)
Периодически делаются запросы вида
«Сколько событий было за промежуток?»
int GetEventsCount(int from, int to)
«Сумматор»
1

20

26

5

10

4

16

2

2

1

32

35

• Если ячеек стало (P+1)2 → переразбиваем и
пересчитываем нижние блоки
• N вставок
sqrt(N) переразбиений O(N) каждое
суммарная сложность O(N*sqrt(N))
Прагматичный подход
Хранить суммы за каждый месяц
Статистика с забыванием
Много типов событий. Про каждое нужно
уметь смотреть исторические данные.
1. Не хотим хранить все. Много.
2. Не хотим нагружать процессор.
Это всего лишь статистика.
Логарифмическое забывание
Последние 2 месяца — помнить разбивку по дням
Последние 2 дня — по часам
Последние 2 часа — по минутам
Последние 2 минуты — по секундам
…
Можно продолжать в обе стороны
Память — O(60 + 48 + 120 + 120) ~ O(log T)
Время — O(log T)
Интеллектуальные задачи
Не применимы категории «правильно/не правильно»
Нужно решить задачу «как можно лучше»
Задача классификации
Спам / не спам
Давать кредит / не давать
Кликнет на рекламу / не кликнет
Бот / человек
Купит / не купит
Хороший / плохой
…
Задача «продление абонента»
Абонент «продляет» подписку каждый год.
Зная что-то про абонента можно догадаться,
продлится он или нет.
Потенциальных непродленцев можно
«растормошить». Как их выявить?
Векторизация
Исходные данные — множество векторов
vi = (1, 0.5, 1.37, 2.8, -1, -0.1, …)

Координата вектора — фича
Что есть вектор?
• Абонент?
• Абонент + момент времени?
• Абонент в момент, когда пора продлять
подписку!
Какие фичи?
Размеченная база
Накопленную статистика «продлился/не
продлился» по прошлым данным можно
использовать для построения классификатора.

Это вектора, про которые мы точно знаем
фактический ответ
Training set / Testing set
Качество классификатора
Задачу классификации можно
переформулировать в задачу поиска:
«Ищем всех непродленцев»
Для «поиска» используют две метрики:
• Точность = доля ошибочно найденных.
• Полнота = доля найденных
Уровни точности и полноты обычно диктуются
сферой применения классификатора
Точность и полнота
Классификаторы
…тренируются классифицировать на обучающей
выборке
•
•
•
•
•
•

Нейронные сети
KNN (K nearest neighbors)
Линейное разделение
Дерево решений
Рандомизированный лес
SVM
Weka Live Demo
Методы «поиска»
Задачи «поиска» — что это?
• Календарное планирование
• Составление расписания
• Задачи раскроя
Объект поиска: план, расписание, раскрой.
Random
Генерируем случайные объекты,
и запоминаем лучшего
Обычно очень плохо работает
Локальный поиск
Начать со случайного.
Искать улучшающую микромодификацию.
Работает хорошо, когда пространство
решений «выпуклое».
В зашумленном постранстве забивается в
локальный оптимум
Имитация отжига
Начать со случайного
Перебирать локальные модификации:
Если нашли улучшающую — применять ее
Иначе, применять с некоторой вероятностью p
Каждый шаг уменьшать вероятность p.
Интеллектуальные алгоритмы
Куда бежать?
Coursera Machine learning course
https://www.coursera.org/course/ml

Weka Book
http://www.cs.waikato.ac.nz/ml/weka/book.html

More Related Content

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