Элементарные структуры данных (23 октября 2013)
- MergeSort, дополнение
- Он умеет считать общее количество инверсий
- А еще он умеет считать количество для каждого элемента [код]
- Какие есть структуры
- Бор (на примере задачи про IP адреса). Памяти = 256*k, время ответа на запрос = 4. [код] [картинка]
- Дерево по неявному ключу (реклама, подумать про стандартные структуры данных) [код]
- Учимся пользовать set-ом и profiler-ом
- Задача: отсортировать массив операцией reverse отрезка
- Решение: bfs с запоминанием [код]
- Тестируем решение: пишем генератор [код]
- Тестируем решение: что такое RuntimeError? Чаще всего выход за пределы допустимой памяти.
- Оптимизируем
- set.insert возвращает pair
- Полиномиальных хеш
- Своя хеш-таблица [код]
- Смотрим, какая часть долго работает
- Запускаем profiler [код]
- Замечаем, что результат зависит от наличия inline функций и уровня оптимизаций (-O0, -O1, -O2)
- Чтобы посмотреть, время работы конкретной части программы, можно вынести ее в функцию
Менеджеры памяти и метод "Разделяй и властвуй"
- Простые менеджеры памяти
- Мотивация
- Тестируем скорость работы вектора [код]
- Тестируем скорость работы массива
- Тестируем скорость работы динамического массива [код]
- Alloc(n), Clear() [статические вычисления]
- Переопределяем оператор new [vector] [array]
- Эксперименты про выделение памяти на C++ :
"int a[(int)1e8]"
не получит MemoryLimit [код]
- Alloc(n), DeleteLast() [рекурсивная функция]
- Not read p=Alloc(const), Delete(p) [список или деревья поиска]
- Реализации Карацубы
- Пишем Карацубу [код] [с аллокатором]
- Чтобы перемножать числа, сперва перемножаем многочлены, затем делаем переносы
- Если использовать систему счисления 106, умножение быстрее
- Сложные задачи на Разделяй и Властвуй
- Ближайшие точки в 2D [код]
- Сколько вершин в дереве находятся на расстоянии ровно k (для каждого k посчитать количество пар вершин) [код] [картинка]