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

Preview:

DESCRIPTION

http://it-people.ru/master-klass-po-algoritmam-i-stukturam-dannyx/

Citation preview

Мастер-класс по алгоритмам

Часть 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 5 10 4 2 2 1 32

26 16 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 coursehttps://www.coursera.org/course/ml

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

Recommended