Мастер класс по алгоритмам. Часть 2
DESCRIPTION
http://it-people.ru/master-klass-po-algoritmam-i-stukturam-dannyx/TRANSCRIPT
Домашнее задание 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