Я отдыхал в моем большим классе анализа данных на днях, когда я столкнулся с интересной темой. Инструктор говорил о алгоритмах, которые используются для работы по потокам данных. Один из этих алгоритмов называется алгоритмом флаеолета-Мартина, и он используется для поиска числа различных элементов в потоке данных. Википедия: https://en.wikipedia.org/wiki/flajolet%e2%80%93Martin_algorithm
Для тех из вас, кто не в курсе, когда дело доходит до потоков данных, вы не можете сделать что-то вроде:
DemoStream = [1,2,2,3,4] Печать (Len (Set (DemoStream))))
Это потому, что, поскольку мы работаем в потоке данных, у нас нет возможности хранить вещи в список (хотя я сделал это в моем коде XD).
Поскольку мы работаем в большом потоке данных без хранилищ, чтобы помочь нам, что мы приберем в большинство случаев, являются вероятностными алгоритмами. Или, в этом конкретном случае алгоритм аппроксимации. На первый взгляд алгоритм Flajolet-Martin выглядел как колдовство для меня. В основном вы принимаете «n» хеш-функции, из формы:
H (x) = (ax + b)% c, где a, b, c являются постоянными коэффициентами, а х представляет собой отдельный элемент потока.
Затем вы преобразуете выход каждого элемента потока в двоичные и подсчитываете количество конечных нулей. Затем вы найдете максимальное количество конечных нулей в этом потоке данных. Ваше приближение для этого конкретного хеша:
R ^ R. Где R – количество аппроксимированных элементов, и R – максимальное количество конечных нулей для этого конкретного хеша.
Но подождите, что есть больше! Этот следующий шаг необходим для повышения точности. Затем вы вычисляете «R» для всех хэшей, затем объединяйте в разные списки, найдите среднее значение каждого списка и найдите среднюю ценность этих средств. Это приблизительное количество элементов в потоке данных.
Статья Википедии забрала некоторые из «это колдовство!» Вибрации я получал, но все еще странный алгоритм, тем не менее.
Хорошо, что произошло, вероятно, предсказуемо. Мне надоело один день, и попытался написать демонстрацию этого алгоритма. Он стал подписью Hacktoberfest в код REPO через несколько дней после этого факта. Мое первое представление на самом деле. (Первый таймер здесь хехегон). Вы можете увидеть это здесь: https://github.com/sukhdeepg/hacktoberfest/tree/master/python.
Большая часть реализации было не слишком сложно, но некоторые части были действительно веселыми для кода. Один из них:
binelems.append (ул. (bin ((i [0] * j + I [1])% I [2])). Сплит (“B”) [1]) Итератор I – список, содержащий каждую коэффициенты хэш, и так далее). Итератор J в основном каждый элемент в потоке (X).
Обработка двоичных элементов в Python была сначала для меня, и если вы похожи на меня, вот вкус. Бинарный для 2 в Python выражается как:
0b010.
У меня было две вещи, которые мне нужно было сделать здесь:
- Вычислить хэш
- Преобразовать его в двоичный
- Положите его в список для вычислений (это также может быть сделано, просто обработая его тогда и там, и только сохраняя максимальное количество конечных нулей, но я сохранил его на потом, ради читаемости)
Но из-за двоичного формата мне пришлось сломать шаги вниз к:
- Вычислить хэш
- Преобразовать его в двоичный
- Преобразовать двоичный в строку
- Отделить эту строку, чтобы вы получили двоичный ты хочешь
- Положить его в список для вычислений
Это привело к этой одной строке кода. Python Rocks: D
Код имеет некоторые изящные трюки, которые я поднял, пожалуйста, пройдите через него. Я не профессионал, будут ошибки, я хотел бы услышать от вас, ребята, ребята и галс здесь! Конструктивная критика оценила!
Оригинал: “https://dev.to/theantisnipe/building-a-demonstration-of-the-flajolet-martin-algorithm-in-python-39a4”