Структуры данных (18 сентября 2017)
- [5 минут] Реализация очереди, дека на циклическом динамическом массиве. Циклический список.
- [10 минут] Разбор выражений. Пишем код для левой ассоциативности.
- [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
.
- [15 минут] Хеш-таблица
- 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 ); }
- [15 минут] Хеш-таблица
- Чем хеш-таблица лучше масива? поиск и удаление за O(1).
- Умеем Add, Del, Find. Интерфейсы HashSet, HashMap. Решение задачи про два указателя хеш-таблицей.
- Открытая адресация:
i = hash(x), while (h[i] && h[i] != x) i++;
- Сравнение открытой и списков: открытая быстрее, из списков проще удалять. Удаление из открытой: просто помечаем, когда помеченных слишком много, перестроим таблицу.