Структуры данных (16 сентября 2019)
- [30 минут] Амортизированое время работы
- На операцию (real time) ti, в среднем (average time) mi = (sum ti) / n, амортизированное ai = ti + Δφ
- Теорема о связи амортизированного и среднего времени
- Примеры на амортизированное время (amortized time)
- Пример с вектором
- Пример со стеком
PUSH, POP_K
- Пример a2 + b2 = N : правильный потенциал = b
- Пример a2 + b2 = N : пример неправильного потенциала, b2
- Амортизация монетками, определение и равносильность.
- [20 минут] Бинпоиск
- Сортированный массив: sort(a, a+n)
- Поиск позиции x в сортированном массиве. 3 ветки: x.
lower_bound
(первый >= x) и upper_bound
(первый >x),
- Правильный бинпоиск: по инварианту. В l выполняется, в r не выполняется, r-l>1.
- Вещественный бинпоиск. Поиск корня многочлена нечётной степени.
− Перерыв −
- [15 минут] Два указателя + сортированный массив
- Online решение : sort + bs (задача: поиск всех элементов массива B в массиве A)
- Offline решение : sort + sort + два указателя
- Пересечение множеств (и мультимножеств!), C++
set_intersection
. Пишем две версии кода: while и for.
- Ещё задачи на два указателя и множества:
merge, union, set_difference
.
- [30 минут] Хеш-таблица
- Введение: зачем это надо, что мы делаем.
- Задача: для каждого x помнить, сколько раз он встречается. Если x=1..106, просто массив. А если x до 109?
unordered_map
- Другая задача. Множество с операциями: добавить, удалить, проверить, есть ли элемент. Если x=1..106, просто массив. А если x до 109?
unordered_set
- HashSet на списках:
vector<int> h[M]; hash(x), vecor::push_back, vector::find
- Как выбрать функцию
hash
? Самая простая hash(x) = x % M
- C++ :
unordered_set<int> s(N), unordered_map<int,int> m(N), MyHash { size_t operator() ( T t ); }
- Умеем Add, Del, Find. Интерфейсы HashSet, HashMap. Решение задачи про два указателя хеш-таблицей.
- Открытая адресация:
i = hash(x), while (h[i] && h[i] != x) i++;
- Сравнение открытой и списков: открытая быстрее, из списков проще удалять. Удаление из открытой: просто помечаем, когда помеченных слишком много, перестроим таблицу.