2. Домашнее задание 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;
}
3. Домашнее задание 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;
}
4. Домашнее задание 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;
}
5. Домашнее задание 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
6. Домашнее задание 4
Могут происходить следующие события:
• Добавление нового комментария
• Удаление комментария
• «Like» комментарию
• Запросить K не удалённых комментариев,
которые менялись (добавлялись или
лайкались) самыми последними.
11. Алгоритм Рабина-Карпа (87 г.)
Поиск подстроки в тексте
http://en.wikipedia.org/wiki/Rabin-Karp_string_search_algorithm
Поиск «паттерна» в потоке событий
Хэширование N-грамм
12. Потоковая обработка событий
Нужно поддерживать какие-то статистики об
интенсивном потоке событий.
Хотим тратить RAM меньше, чем O(N)
Хотим тратить времени ~ O(1) на событие
• Биллинг
• Статистика ошибок
• …
13. Биллинг
K клиентов, нужно раз в месяц выставлять
счет, основываясь на количестве и типах
произошедших транзакций (звонков,
покупок, …)
Постоянно показывать текущий баланс
15. «Сумматор»
Каждую секунду регистрируются события:
AddNextTickEventCount(int time, int count)
Периодически делаются запросы вида
«Сколько событий было за промежуток?»
int GetEventsCount(int from, int to)
18. Статистика с забыванием
Много типов событий. Про каждое нужно
уметь смотреть исторические данные.
1. Не хотим хранить все. Много.
2. Не хотим нагружать процессор.
Это всего лишь статистика.
19. Логарифмическое забывание
Последние 2 месяца — помнить разбивку по дням
Последние 2 дня — по часам
Последние 2 часа — по минутам
Последние 2 минуты — по секундам
…
Можно продолжать в обе стороны
Память — O(60 + 48 + 120 + 120) ~ O(log T)
Время — O(log T)
21. Задача классификации
Спам / не спам
Давать кредит / не давать
Кликнет на рекламу / не кликнет
Бот / человек
Купит / не купит
Хороший / плохой
…
22. Задача «продление абонента»
Абонент «продляет» подписку каждый год.
Зная что-то про абонента можно догадаться,
продлится он или нет.
Потенциальных непродленцев можно
«растормошить». Как их выявить?
24. Что есть вектор?
• Абонент?
• Абонент + момент времени?
• Абонент в момент, когда пора продлять
подписку!
Какие фичи?
25. Размеченная база
Накопленную статистика «продлился/не
продлился» по прошлым данным можно
использовать для построения классификатора.
Это вектора, про которые мы точно знаем
фактический ответ
27. Качество классификатора
Задачу классификации можно
переформулировать в задачу поиска:
«Ищем всех непродленцев»
Для «поиска» используют две метрики:
• Точность = доля ошибочно найденных.
• Полнота = доля найденных
Уровни точности и полноты обычно диктуются
сферой применения классификатора
31. Методы «поиска»
Задачи «поиска» — что это?
• Календарное планирование
• Составление расписания
• Задачи раскроя
Объект поиска: план, расписание, раскрой.
33. Локальный поиск
Начать со случайного.
Искать улучшающую микромодификацию.
Работает хорошо, когда пространство
решений «выпуклое».
В зашумленном постранстве забивается в
локальный оптимум
34. Имитация отжига
Начать со случайного
Перебирать локальные модификации:
Если нашли улучшающую — применять ее
Иначе, применять с некоторой вероятностью p
Каждый шаг уменьшать вероятность p.