Хеширование и архиваторы (18 ноября 2024)
- Универсальное семество хеш функций (M → m)
- Определение через 1/m.
- Плохое хеширования: x → x mod m. Почему плохое?
- Пример хорошего хеширования: x → ((ax + b) mod p) mod m. Hp,m = {(a, b)} − универсальное семейство хеш-функций.
- Хеш-таблица: детерминированная версия, рандомизированная версия
- Хеш-таблица на списках: среднее число коллизий (m = n, m = n2), средняя длина списка.
- Фильтр Блюма
- Структура: есть k хеш-функций, и m бит. Элемент x есть в множестве, если все биты h1(x),...,hk(x) стоят.
- Вероятность одного бита: (1 - 1/m)kn ≈ e-kn/m
- Вероятность ложного срабатывания: (1 - e-kn/m)k. При фиксированных (n,m) получаем оптимальное k = ln2 * (m/n). Pr = 2-k = 0.6185m/n
- Сравнение с хеш-таблицей: пусть для каждого x считаем 16-битный хеш, тогда даже для открытой адресации нужно 16*1.5*n = 24n бит. Взяв m/n=24, получаем ошибку <10-6.
- Совершенное хеширование
- Постановка задачи: даны x1, x2, ... xk, придумать f: f(xi) различны и попадают в диапазон.
- Пример: младший бит числа, m[2k mod 67] = k для всех k=0..63
- У нас уже есть рандомизированное O(1): хеш-таблица. Теперь нужно детерминированное O(1).
- Двухуровневая схема (внешняя таблица имеет размер m=n, внутренняя для i-й корзины имеет размер ki2). Сколько памяти нужно? O(nlogn) бит.
− Перерыв −
- Сжатие данных
- Постановка задачи: придумать обратимую f для битовых строк (строк над алфавитом?)
- Не существует идеального архиватора: 2k > ∑ 2i
- Существует не сильно портящий архиавтор: s → 0s или 1f(s)
- Что уже знаем? 7-битное кодирование. Хаффман.
- Хаффман: реализация
- Декодирования: бесконечный спуск по бору.
- Хранение словаря частотами: k*logN бит.
- Хранение словаря бором: z*(2+logk) бит (z − кол-во символов с ненулевой частотой)
- Арифметическое кодирование
- Проблемы Хаффмана: k=3, равные частоты ; k=2, сильно неравные частоты.
- Заметим, что 35 = 243 ⇒ за 8 бит можно сохранить 5 символов при k=3.
- Идея: делить отрезок рекурсивно на части, кидать точку, куда попали, тот и символ.
- Kraft-McMillan inequality: ∑ 2-leni ≤ 1
- Gibbs' inequality: Оптимальные коды: leni = -log2pi. Теоретическая оценка: ∑ -pi*log2pi.
- Словарное кодирование
- Пример с английскими словами и новым алфавитом
- LZW. Нет оверхеда на хранение словаря. Пример: ababc.
- BWT.
- Определение: последний столбец массива циклических сдвигов
- Примеры:
harryharry
→ hhyyaarrrr
| harry,oh,harry,harry
→ hyyhhho,y,,aaarrrrrr
- Что хорошего мы тут видим? Цепочки одинаковых символов.
- Время: O(n) прямое, O(n) обратное (изучим на практике).
- RLE. Принцип кодирования. Пример: BMP. Аккуратное битовое хранение.
- Время: один проход, максимально быстро.
- MTF. Принцип кодирования. Пример: 999000559 → 900100302.
- Время: O(nk) прямое, O(nk) обратное (изучим на практике). Оба на практике улучшим до O(nlogk).
- Соединяем: BWT + MTF + RLE + Арифметическое кодирование
- Как сжимать лучше? Предсказание текста. Суффиксный автомат и вероятностые модели над исходным алфавитом и метаалфавитом.
− Перерыв −
- Бонус. Случайные графы. Забавные факты.
- В графе из n/3 рёбер с большой вероятностью нет циклов
- В графе из n, 3n, 5n, 7n рёбер каково размера компоненты связности? (4/5n, n-sqrt(n), n-O(1), n)
- В графе без циклов из n/2, n/3 рёбер какой диаметр дерева? (sqrt(n), logn)
- Бонус. Схема со случайным графом [Czech'92]
- x → ребро (h1(x),h2(x)). x → i = (f[h1(x)] + f[h2(x)]) mod n, все i различны
- Если получили ацикличный граф, можем расставить числа. Сколько памяти нужно? O(nlogn) бит.
- С какой вероятностью получим случайный граф? Какое выбрать n? (6m)
- Бонус. Хеширование кукушки [Pagh,Rodler'01]
- Схема: для каждого x есть две ячейки h1(x) и h2(x). Если хоть одна свободна, иначе выталкиваем того, кто лежит в h1(x), туда кладём x... если циклимся, перестариваем всё.
- Время работы: add за O(1) в среднем, find и del за O(1) в худшем
- Сравнение: в обычной цепочечной хеш-таблице add за O(1) в худшем, find и del за O(1) в среднем