Презентация по АТД (контейнеры, последовательности и списки). Версия для C++, по сравнению с версией для C# добавлены новые рисунки для последовательностей и детализированные задачи.
Основы С++ (массивы, указатели). Задачи с массивамиOlga Maksimenkova
Расширенная версия презентации со школы учителей 2016. Изменён порядок материала, добавлены сортировки и индексация, слайды Незнанова А.А. и слайды с задачами.
Learning from Swift sources, Иван СметанинMail.ru Group
Что делать разработчику, если хочется узнать немного больше, чем написано в документации или на StackOverflow? Самое логичное – познакомиться с open-source сообществами. Так я и сделал. Самым большим, как это ни странно, оказалось, сообщество языка Swift.
В докладе я расскажу:
- Где, кроме документации и StackOverflow, можно чему-то научиться
- Как устроен Dictionary в Swift
- Какие части стандартной библиотеки мы редко используем, а следует чаще
- Зачем заглядывать на swift.org
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
Web-программирование
Лекция #5. Введение в язык программирования Python 3
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьTanya Denisyuk
После этого доклада вы будете знать, что такое Handlersocket, нужен ли он вам и «как его готовить».
Все как обычно — грабли, шишки, слезы из реальной жизни, направления «куда копать», примеры из практики. Вместе с докладом Сергей выложит код самописного php-клиента для HS, который мы используем в Badoo.
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...Ontico
Довольно часто как адинистраторы, так и разработчики жалуются на низкую производительность приложений, работающих с базой данных, и нередко при этом ищут решения возникших проблем с помощью различных настроек как СУБД, так и операционной системы, пренебрегая при этом самым действенным способом - оптимизацией запросов к собственно БД.
Тому, как понимать, где же узкие места, и как их можно попробовать избежать на примере PostgreSQL и посвящен этот доклад.
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Badoo Development
Мы уже около 3-х лет используем HandlerSocket в нашей инфраструктуре сайта badoo.com. За это время мы накопили опыт решения характерных для Handlersocket проблем, появляющихся при использовании.
Несколько команд внутри Баду активно используют HS для решения разноплановых задач мобильных и настольных приложений Баду. Где-то мы используем HS как замену Memcached, где-то как простой поисковый механизм, где-то как хранилище типа ключ-значение. Наш HS-кластер содержит более 30 серверов, обрабатывая порядка 8000 запросов/сек.
Спикер также предоставляет написанный им код библиотеки-клиента для Handlersocket на PHP.
Про что доклад:
• что это вообще такое;
• чем является HS и чем не является;
• внутреннее устройство и работа HS;
• протокол;
• примеры использования в Баду, с цифрами и графиками;
• особенности: шардирование, Percona Server, постоянные соединения (бенефиты, проблемы и их решения), tips & tricks;
• полезные сслыки, ответы на FAQ.
Доклад рассчитан на highload-разработчиков, работающих с реляционными БД.
Similar to Мастер класс по алгоритмам. Часть 1 (20)
Git allows tracking the history of changes to files in a directory locally through snapshots called commits. The process of creating a commit also creates a snapshot. Commits are added to a directed acyclic graph (DAG) immutable history, ensuring nothing is lost. Branches allow for parallel development through branch pointers and commits to different branches. GitHub enables social coding through forking repositories and pull requests for contributing changes. Remotes allow interacting with versions of repositories on GitHub through fetching, pulling, and pushing changes between local and remote branches. Merging combines changes from different branches though conflicts may occur. Rebelling rewrites history by integrating changes from another branch individually rather than combining them.
2. Disclaimer
• 200 часов — примерно столько нужно для
подготовки минимального специалиста по
алгоритмам
• Длительность мастер-класса — 8 часов
3. Сложность алгоритмов
C.N2 с различными константами
Кажется, что константа очень важна
C.N и C.N log(N) в сравнении с C.N2
Константа уходит далеко на второй план
4. Сложность алгоритмов
• Процессор устроен так, что разные
операции стоят разное количество тиков.
• И даже стоимость одной операции может
различаться в разы в зависимости от
условий
• Константа не имеет смысла!
• Принято писать O(N log N), игнорируя
константу
5. Асимптотическая сложность
Говорят, «сложность алгоритма O(f(n))», если
количество операций подразумеваемого
вычислителя начиная с некоторого достаточно
большого n0 меньше, чем f(n)
(с точностью до константы).
Боле строго:
∃C>0, n₀: ∀n > n₀ → operations(n) < C⋅f(n)
6. Массив
• Массив: область памяти.
• Операции:
– a[i] = x
– x = a[i]
– a.Length
• Важно: нельзя увеличить размер массива
10. Динамический массив
Хотим массив, но с дополнительной
операцией Add(x)
Идея:
– Держать массив размером с запасом.
– Помнить количество использованных
элементов этого массива
– При исчерпании запаса — создавать новый
больший массив и копировать всё в него
16. Бинарное дерево поиска
На той же идее можно сделать и Map
Операции:
Add(key, value)
value = Find(key)
Node {
Node left, right;
int key;
string value;
}
17. Бинарное дерево поиска. Задача
Сделать эффективную (быстрее O(N)) операцию
node = GetNodeAt(index)
Сложность операции?
Node {
Node left, right;
int key;
string value;
int size;
}
18. Бинарное дерево поиска. Задача
Какова может быть сложность операции обхода всех
узлов, начиная с первого узла с ключом left и заканчивая
последним узлом с ключом right?
foreach(Node node in GetAll(left, right))
Write(node.value);
Node {
Node left, right;
int key;
string value;
}
19. Бинарное дерево поиска
Добавление пары (key, value)
Поиск по ключу
Поиск i-ого элемента
Перебор K последовательных
элементов
O(log N)
O(K)
23. 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
25. Задачка 2
Произвести нечеткое сравнение двух текстов.
Результат сравнения — число от 0 до 1:
0 — не похожи, 1 — полностью совпадают
26. Задачка 3
Найти все товары, в описании которых
встречаются все перечисленные теги.
27. SQL Select
SELECT friend1
FROM Friends
WHERE friend2 = ‘134123’
Индекс по friend2 — это что?
Дерево или хэш?
Что ключ, а что значение?
28. Обычные SQL-индексы —
деревья
B-Tree, B*Tree, B+Tree, …
Оптимизируют работу с диском
Очень похожи по характеристикам на
бинарные деревья.
Держать все данные в памяти будет быстрее
(MemCache, Redis, …)
29. SQL и индексы
8.5.3. How MySQL Uses Indexes
http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
31. 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
32. 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';
36. Гео-поиск
«найди кафешку рядом со мной»
SELECT * FROM Poi WHERE type="cafe"
AND Distance(location, me) < 1000
R-Tree (rectangles tree), Geohash
Ключевые слова:
MySQL spatial extensions,
Spatial Index, Geometric types, PostGIS
37. Распределенные БД
Кластер, все данные в памяти →
• Хэш-индексы — скорость
• Деревянные индексы — порядок
Как обрабатывать запросы?
38. Домашнее задание 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;
}
39. Домашнее задание 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;
}
40. Домашнее задание 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;
}
41. Домашнее задание 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
42. Домашнее задание 4
Могут происходить следующие события:
• Добавление нового комментария
• Удаление комментария
• «Like» комментарию
• Запросить K не удалённых комментариев,
которые менялись (добавлялись или
лайкались) самыми последними.
43. Ещё о применении хэшей
Ключевые слова:
полиномиальный хэш, rolling hash