$ Структуры данных (2 пары) # Терминология ## Online, Offline ## Static data, Dynamic data ## Амортизированное время работы, real time ## get-запрос, change-запрос # Базовые структуры ## Стек, очередь, дек, вектор. Интерфейсы. Без индексации за O(1) и с индексацией. ## Односвязные списки (поддерживает 3 операции), двусвязные списки (поддерживает 4 операции) ## Массивы → очередь, дек ## Вектор: массив с push\_back за амортизированную O(1) ## Вектор за O(1) без амортизации ## Хеш-таблица на основе списков
Перевыделение памяти, неамортизированное O(1), в C++ и Java амортизированное
HashSet, HashMap, сказать, что есть ключ, что есть значение ## Частичные суммы: sum[L,R) = s[R] - s[L], s[0] = 0 ## Отсортированный массив + бинарный поиск (здесь же рассказать про три разных бинарных поиска: (0, 1) и (-1, position) и lower\_bound ## set<int>, map<int, int> (только описание интерфейсов) # Задачи ## [sort, hash table] Найти число различных чисел в массиве ## [hash table, map] Числа добавляются и удаляются. После каждого запроса в online говорить, сколько различных чисел в мультимножестве.
Тут же показываем, что Add → Build и разницу offline и online. ## [vector,array] Дек, но размер заранее не известен, offline версия предыдущей задачи ## [list] Аллокатор кусков памяти константного размера ## [stack] Аллокатор кусков памяти произвольного размера, память мы не освобождаем
Конец первой пары
Здесь нужно напомнить все полученные интерфейсы и структуры: стек, очередь, дек, вектор, список, двусвязный, хеш-таблица, sorted array. Рассказать про get-запрос, change-запрос.
## [hash table, map] var := value (хранение значения от переменной)
Нужно научиться по string получать хеш типа int, далее hash table ## [sorted array, binary search] offline версия предыдущей задачи ## [стек] разбор арифметического выражения без скобок: +, -, *, /, ^ (два стека, левоассоциативность) ## [стек] разбор арифметического выражения со скобками: +, -, *, /, ^ (скобка -- не операция, заодно выражение теперь можно взять в скобки) ## [стек] проверка скобочной последовательности на правильность, несколько видов скобок, разбиение скобок на пары: pair[i] # Преобразование операций ## merge → add (add и есть merge) ## add → merge (меньшее к большему, пример: set, hash table) ## find/ничего → delete (пометить, как удаленное, пример: хеш-таблица с открытой адресацией) ## build, get → add, merge (пополняемые структуры, static → dynamic, пример: sorted array & lower\_bound) ## build, get → add, delete (отдельно хранить множество удаленных, операция "кол-во x: L ≤ x ≥ R") # Задачи ## [find → delete] Хеш-таблица с открытой адресацией с удалением
Конец второй пары

## [add → merge] Дано корневое дерево, в вершинах числа. Посчитать количество различных чисел в каждом из поддеревьев. ## [build → add, del] Упражняемся с Ахо-Корасиком, который за O(Σ|s_i|) строит и за O(|text|) говорит число вхождений: научимся добавлять и удалять строки. ## [static → dynamic] Множество точек, поддерживать размер выпуклой оболочки, точки добавляются.