Задачи по стримингу

Семинарские задачи

CMS

HLL

Пример + plus задача

Рассмотрим пример следующего потока:

S={1,3,2,1,2,3,4,3,1,2,3,1} S equals the set 1 comma 3 comma 2 comma 1 comma 2 comma 3 comma 4 comma 3 comma 1 comma 2 comma 3 comma 1

Точная оценка для него составляет: F0=4. F sub 0 equals 4 period Попробуем использовать HLL для аппроксимации этого значения:

Определим хэш-функцию явно:

Элемент

Значение

1

00100100 00100100

2

10000010 10000010

3

01100000 01100000

4

11000001 11000001

Пример - подсчет HLL с отсечением первых 2 2 битов для индексирования (m=4) open paren m equals 4 close paren

Элемент

Значение

Индекс

Ранг

1 1

00 00 100100 100100

002=0 00 sub 2 equals 0

1

2 2

10 10 000010 000010

102= 10 sub 2 equals2

5

3 3

01 01 100000 100000

012=1 01 sub 2 equals 1

1

4 4

11 11 000001 000001

112=3 11 sub 2 equals 3

6

Так как все индексы различны, то вектор ρmax rho sub max после обработки потока будет выглядеть как:

ρmax={1,1,5,6} rho sub max equals the set 1 comma 1 comma 5 comma 6

Посчитаем среднее гармоническое из оценок:

E=2-1+2-1+2-5+2-6=6764=1.046875⇒m1.046875≈ E equals 2 to the negative 1 power plus 2 to the negative 1 power plus 2 to the negative 5 power plus 2 to the negative 6 power equals 67 over 64 equals 1.046875 right double arrow m over 1.046875 almost equals

≈4⋅0.955=3.821 almost equals 4 times 0.955 equals 3.821

F^0=αm⋅m⋅E F hat sub 0 equals alpha sub m times m times E, где αm≈0.5324 alpha sub m almost equals 0.5324

F^0≈0.5324⋅4⋅3.821=8.137 F hat sub 0 almost equals 0.5324 times 4 times 3.821 equals 8.137

Задача - подсчет HLL с отсечение 1 1 бита для индексирования(m=2) open paren m equals 2 close paren

Элемент

Значение

Индекс

Ранг

1 1

0 0 0100100 0100100

0 0

2

2 2

1 1 0000010 0000010

1

6

3 3

0 0 1100000 1100000

0 0

1 1

4 4

1 1 1000001 1000001

1 1

1

В потоке встречаются все элементы из этих 4 4, значит итоговый вектор ρmax rho sub max выглядт как:

ρmax={max⁡(2,1),max⁡(6,1)}={2,6} rho sub max equals the set max of open paren 2 comma 1 close paren comma max of open paren 6 comma 1 close paren equals the set 2 comma 6

E=2-2+2-6=1764=0.265625⇒m0.265625≈7.529 E equals 2 to the negative 2 power plus 2 to the negative 6 power equals 17 over 64 equals 0.265625 right double arrow m over 0.265625 almost equals 7.529

αm≈0.3512 alpha sub m almost equals 0.3512

F^0≈0.3512⋅2⋅7.529≈5.288 F hat sub 0 almost equals 0.3512 times 2 times 7.529 almost equals 5.288

Объяснить результат

Ожидаемый пример ответа: так как здесь мы работаем с маленьким потоком и маленькими величинами, оценки даваемые HLL могут сильно разниться(это соотносится с тем что он дает всего лишь асимптотически несмещенную оценку) в зависимости от частных случаев, как например тут, где более грубое разделение на подпотоки смогло точнее приблизить результат, а для более точного нам просто не хватило данных для наполнения


Задачи для SET

Задача A2. HyperMegaLogLog ProMax++

Разбалловка:

  1. Инфрастуктура тестирования - 5 5 баллов

  2. Реализация HLL и наивного алгоритма - 2 2 балла

  3. Проведение тестирования, подбор констант - 3 балла

  4. Анализ результатов, составление графиков - 4 балла

  5. Исследование потенциала улучшения и последующие тестирование - 5 5 баллов

  6. За реализацию доп алгоритма, пункты 2 2 3 3 4 4 получают +1 positive 1 балл сверху, в случае если для доп алгоритма были выполнены корректно


Как известно, потоковые алгоритмы зачастую являются аппроксимационными. Выбирая такой алгоритм, мы жертвуем точнстью ответа, но в обмен получаем преимущества по времени исполнения или занимаемой памяти. Такая аппроксимация представляет интерес если мы можем зафиксировать некоторые пределы для ошибки этого алгоритма.

  1. Вам предлагается исследовать один из таких алгоритмов HyperLogLog, который находит оценку для момента F0 F sub 0. Что бы провести успешное исследование нужно выполнить несколько важных этапов:

    Этап 1 1 - Создание инфраструктуры:

    Напишите реализацию класса RandomStreamGen . Он должен уметь возвращать массив случайных строк(состоящих из больших и маленьких латинских букв, тире и цифр от 0 0 до 9 9) длиной до 30 30 символов.

    Напишите свой генератор хэш-функций из некоторого семейства, или используйте общедоступный. Учитывайте, что вам нужно взять не любую хэш-функцию, а такую которая может выдать произвольное значение из множества значений приблизительно равновероятно(те в битовой строке данного числа можно ожидать каждое значение для каждого регистра с вероятностью 12 one half). Ограничьте множество выдаваемых значений 232 2 to the 32nd power

    Этап 2 2 - Реализация алгоритмов:

    Реализуйте алгоритм HyperLogLog любым удобным способом, а так же напишите алгоритм вычисляющий точное значение F0 F sub 0. Для алгоритма HLL нужно выбрать размер индекса, который определяется первыми L L регистрами числа. Самостоятельно подберите константу L L и обоснуйте, почему вы выбрали именно такое число. Для этого может потребоваться провести несколько запусков с разными значениями L L.

    Так же на ваш выбор можете добавить еще 1 1 алгоритм в сравнение(например таким может быть k - min values, или Linear counting или какой-нибудь другой), если решите его добавить в отчете кратко опишите принцип его работы

    Этап 3 3 - Запуск:

    Проведите серию тестов при помощи написанных вами классов и алгоритмов. Оцените как изменяется точность ответа алгоритма HLL, насколько она близка к истинному значению, укладывается ли ваша реализация в рамки заявленных отклонений(проверьте для 1.04B the fraction with numerator 1.04 and denominator the square root of B и
    1.3B the fraction with numerator 1.3 and denominator the square root of B где B=2L B equals 2 to the L power ). Так же зафиксируйте, сколько памяти потребляет алгоритм.

    Так как модель потока которая предлагается в задаче, допускает только добавления элементов, то целесообразным будет проводить тесты не на отдельных потоках разного размера, а на частях потока сгенерированного 1 1 раз. Шаг для разбиения выберите самостоятельно.

    Сгенерируйте несколько потоков и посчитайте для результатов каждого из них выборочные статистики: 𝔼⁡(N^t) double struck E of open paren N hat sub t close paren и σ⁡(N^t) sigma of open paren N hat sub t close paren - где N^t N hat sub t оценка полученная HLL F0 F sub 0 в потоке, в моменте времени t t (те на момент когда прошло t t шагов).

    Этап 4 4 - анализ:

    Постройте график среднего потребления памяти алгоритмами, сравнения истинной F0 F sub 0 и ее оценкиN^t N hat sub t, и выборочных статистик(для отображения дисперсии параллельно перенестие график 𝔼⁡(N^t) double struck E of open paren N hat sub t close paren вверх и вниз на σ⁡(N^t) sigma of open paren N hat sub t close paren и закрасти получившуюся область)

    Если вы тестируете 2 2 алгоритма, посчитайте эти данные и для него тоже и добавьте его на графики

    Проанализируйте полученные данные(это значит, прежде всего дать содержательный комментарий, о том, насколько данные полученные на практике соотносятся с теоретическими оценками), предоставьте выводы об эффективности выбранных констант и решений. Если в решении было 2 2 алгоритма, проведите сравнения их эффективности

  2. Теперь когда вы проверили эффективность оригинального алгоритма, время внести в него что-то новое.

    Разработайте или внедрите сторонние улучшения для алгоритма. Улучшения могут быть как технического плана(например заменить vector на bitset и сократить потребление памяти в 8 8 раз, и тд), так и статистического(скорректировать алгоритм, так что бы он выдавал более точную оценку, или имел меньшую дисперсию и тд).

    Если вы внедряете стороннее улучшение обязательно указывайте ссылку на источник, но и так же не забывайте что в обоих случаях вам нужно своими словами отразить в отчете суть нововведений.

    Прикрепите вместе с кодом оригинального алгоритма, модифицированный и протестируйте его тоже. Проведите сравнительный анализ(такой же как и в первом пункте задания)