Задачи по стримингу
Семинарские задачи
CMS
HLL
Пример
Рассмотрим пример следующего потока:
Точная оценка для него составляет:
Определим хэш-функцию явно:
Элемент | Значение |
|---|---|
1 | |
2 | |
3 | |
4 |
Пример - подсчет HLL с отсечением первых
Элемент | Значение | Индекс | Ранг |
|---|---|---|---|
1 | |||
5 | |||
1 | |||
6 |
Так как все индексы различны, то вектор
Посчитаем среднее гармоническое из оценок:
Задача - подсчет HLL с отсечение
Элемент | Значение | Индекс | Ранг |
|---|---|---|---|
2 | |||
1 | 6 | ||
1 |
В потоке встречаются все элементы из этих
Объяснить результат
Ожидаемый пример ответа: так как здесь мы работаем с маленьким потоком и маленькими величинами, оценки даваемые HLL могут сильно разниться(это соотносится с тем что он дает всего лишь асимптотически несмещенную оценку) в зависимости от частных случаев, как например тут, где более грубое разделение на подпотоки смогло точнее приблизить результат, а для более точного нам просто не хватило данных для наполнения
Задачи для SET
Задача A2. HyperMegaLogLog ProMax++
Разбалловка:
Инфрастуктура тестирования -
баллов Реализация HLL и наивного алгоритма -
балла Проведение тестирования, подбор констант - 3 балла
Анализ результатов, составление графиков - 4 балла
Исследование потенциала улучшения и последующие тестирование -
баллов За реализацию доп алгоритма, пункты
получают балл сверху, в случае если для доп алгоритма были выполнены корректно
Как известно, потоковые алгоритмы зачастую являются аппроксимационными. Выбирая такой алгоритм, мы жертвуем точнстью ответа, но в обмен получаем преимущества по времени исполнения или занимаемой памяти. Такая аппроксимация представляет интерес если мы можем зафиксировать некоторые пределы для ошибки этого алгоритма.
Вам предлагается исследовать один из таких алгоритмов HyperLogLog, который находит оценку для момента
. Что бы провести успешное исследование нужно выполнить несколько важных этапов: Этап
- Создание инфраструктуры: Напишите реализацию класса
RandomStreamGen. Он должен уметь возвращать массив случайных строк(состоящих из больших и маленьких латинских букв, тире и цифр отдо ) длиной до символов. Напишите свой генератор хэш-функций из некоторого семейства, или используйте общедоступный. Учитывайте, что вам нужно взять не любую хэш-функцию, а такую которая может выдать произвольное значение из множества значений приблизительно равновероятно(те в битовой строке данного числа можно ожидать каждое значение для каждого регистра с вероятностью
). Ограничьте множество выдаваемых значений Этап
- Реализация алгоритмов: Реализуйте алгоритм HyperLogLog любым удобным способом, а так же напишите алгоритм вычисляющий точное значение
. Для алгоритма HLL нужно выбрать размер индекса, который определяется первыми регистрами числа. Самостоятельно подберите константу и обоснуйте, почему вы выбрали именно такое число. Для этого может потребоваться провести несколько запусков с разными значениями . Так же на ваш выбор можете добавить еще
алгоритм в сравнение(например таким может быть k - min values, или Linear counting или какой-нибудь другой), если решите его добавить в отчете кратко опишите принцип его работы Этап
- Запуск: Проведите серию тестов при помощи написанных вами классов и алгоритмов. Оцените как изменяется точность ответа алгоритма HLL, насколько она близка к истинному значению, укладывается ли ваша реализация в рамки заявленных отклонений(проверьте для
и где ). Так же зафиксируйте, сколько памяти потребляет алгоритм. Так как модель потока которая предлагается в задаче, допускает только добавления элементов, то целесообразным будет проводить тесты не на отдельных потоках разного размера, а на частях потока сгенерированного
раз. Шаг для разбиения выберите самостоятельно. Сгенерируйте несколько потоков и посчитайте для результатов каждого из них выборочные статистики:
и - где оценка полученная HLL в потоке, в моменте времени (те на момент когда прошло шагов). Этап
- анализ: Постройте график среднего потребления памяти алгоритмами, сравнения истинной
и ее оценки , и выборочных статистик(для отображения дисперсии параллельно перенестие график вверх и вниз на и закрасти получившуюся область) Если вы тестируете
алгоритма, посчитайте эти данные и для него тоже и добавьте его на графики Проанализируйте полученные данные(это значит, прежде всего дать содержательный комментарий, о том, насколько данные полученные на практике соотносятся с теоретическими оценками), предоставьте выводы об эффективности выбранных констант и решений. Если в решении было
алгоритма, проведите сравнения их эффективности Теперь когда вы проверили эффективность оригинального алгоритма, время внести в него что-то новое.
Разработайте или внедрите сторонние улучшения для алгоритма. Улучшения могут быть как технического плана(например заменить vector на bitset и сократить потребление памяти в
раз, и тд), так и статистического(скорректировать алгоритм, так что бы он выдавал более точную оценку, или имел меньшую дисперсию и тд). Если вы внедряете стороннее улучшение обязательно указывайте ссылку на источник, но и так же не забывайте что в обоих случаях вам нужно своими словами отразить в отчете суть нововведений.
Прикрепите вместе с кодом оригинального алгоритма, модифицированный и протестируйте его тоже. Проведите сравнительный анализ(такой же как и в первом пункте задания)