1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10

# конспект · шаг 10 из 10

Конспект: потоковые алгоритмы и резервуарная выборка

выжимка - её можно унести в заметки

Понятия

Потоковый алгоритм - один проход по данным, состояние много меньше потока, малое время на элемент.

Приближение с параметрами ε, δ - ошибка не больше ε с вероятностью не меньше 1 − δ.

Объединяемая сводка - из сводок двух частей данных получается сводка целого.

Резервуар - k мест, в которых в любой момент лежит равновероятная выборка из уже пришедших элементов.

Мультимножество - набор, где важна кратность элементов и не важен порядок.

Второй момент F₂ - сумма квадратов частот ключей.

Что унести

ТОЧНО, В ПОСТОЯННОЙ ПАМЯТИ                      НЕ СЧИТАЕТСЯ ТОЧНО БЕЗ ПАМЯТИ НА ВСЁ
количество, сумма, наименьшее, наибольшее       число различных элементов
среднее:    a = a + (x − a) / n                 медиана                  
дисперсия:  накопить (x − a_старое)·(x − a_новое)     был ли уже такой элемент
пропущенное число: n(n + 1)/2 − сумма, или исключающее ИЛИ

почему: по памяти точного счётчика различных восстанавливается множество виденных → N бит
ОБЪЕДИНЕНИЕ СВОДОК
сумма - сложение;  наименьшее - минимум;  среднее - только вместе с количеством
200 элементов со средним 10 и 800 со средним 20:  18, а не 15
РЕЗЕРВУАРНАЯ ВЫБОРКА, k мест
элемент номер i:   i ≤ k - положить;   иначе j = случайное от 0 до i − 1,  при j < k:  резервуар[j] = x
при n ≥ k: P(позиция i в выборке) = k/n;  при n < k хранят все n
один из восьми, 6000 опытов:  738 … 781 при ожидаемых 750
ошибка «заменять с вероятностью 1/2»:  265 … 745 при ожидаемых 450
объединение:  хранить число виденных;  для k = 1 взять первую с вероятностью n₁/(n₁ + n₂)
ВЗВЕШЕННАЯ ВЫБОРКА
один элемент:   W = W + w;  заменить выбранного с вероятностью w / W
k элементов:    ключ u^(1/w),  хранить k наибольших          на практике сравнивают ln(u) / w
почему степень: наибольшее из w случайных чисел ≤ t с вероятностью tʷ - как и u^(1/w)
веса 1, 2, 3, 4:  доли 0,097  0,202  0,296  0,405
ключ u·w неверен: для весов 1 и 2 лёгкий выигрывает в 1/4 случаев вместо 1/3
объединение:  слить наборы пар «ключ, элемент», оставить k наибольших - счётчики не нужны
ВЫБОРКА ПО ХЕШУ ИДЕНТИФИКАТОРА
оставить событие, если хеш(пользователь) mod 100 = 0
выбирает 1% ПОЛЬЗОВАТЕЛЕЙ со всеми их событиями;  решение одинаково на всех машинах
резервуар и ключи выбирают СОБЫТИЯ: активные пользователи в такой выборке перепредставлены
ОТПЕЧАТОК МУЛЬТИМНОЖЕСТВА
y = y · (x − a) mod p; p простое, коды 0 ≤ a < p инъективны
x - равномерная общая точка; длины потоков ≤ n
разные отпечатки доказывают различие
для фиксированных разных входов P(коллизия) ≤ n/p
3, 5 и 4, 4:  количество и сумма совпадают, отпечатки нет

ВТОРОЙ МОМЕНТ
знак s(ключ) = ±1, постоянный;   Z = Z + s(ключ) на каждый элемент;   E[Z²] = F₂
Z² = Σ fᵢ²  +  перекрёстные слагаемые со случайными знаками, в среднем ноль
дисперсия до 2·F₂²  ⇒  среднее по группе, затем медиана групп
замер: точно 488 874;  средние групп 139 294 … 899 380;  медиана 475 705;  общее среднее 436 066

Гарантия AMS: четыре независимых знака дают Var(Z²)≤2F₂²; среднее O(ε⁻²) копий и медиана O(log(1/δ)) групп обеспечивают относительную ошибку ε с вероятностью отказа δ.

Джонсон-Линденштраус: общая случайная линейная проекция в O(ε⁻²log(N/δ)) координат сохраняет попарные квадраты евклидовых расстояний конечного набора с отказом не больше δ.

Корсет сохраняет заданное семейство стоимостей, а не все свойства данных; t-спаннер сохраняет расстояния с растяжением не больше t. Для потоков вставок невзвешенных рёбер работает жадное сохранение длинных связей.

Ловушки джокера

Посчитал различных множеством. Память растёт вместе с данными - это доказанное свойство задачи.

Объединил средние без количеств. Среднее средних верно только для частей равного размера.

Написал randrange(k) вместо randrange(videl). Выборка состоит из последних элементов потока.

Взял первые k или каждый сотый. Первые описывают начало потока, каждый сотый ловит периодичность.

Слил две выборки без счётчиков. Строки сервера с малым потоком оказываются перепредставлены.

Взял ключ u · w. Тяжёлые элементы выбираются чаще положенного.

Оценил долю пользователей по выборке событий. Активные пользователи весят в ней больше.

Сверил потоки по сумме или по исключающему ИЛИ. Замена 3, 5 на 4, 4 и пара дубликатов проходят незамеченными.

Перевыбрал знак ключа при повторе. Счётчик превращается в сумму независимых ±1 и перестаёт зависеть от частот.

Проверь себя

Какие вопросы о потоке решаются точно и почему остальные - нет? Почему шанс k/i для новичка даёт всем k/n? Что нужно хранить, чтобы объединять выборки, и почему ключам это не нужно? Чем выборка по хешу отличается от резервуарной? Почему квадрат суммы знаков в среднем равен сумме квадратов частот?

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.