Рубрики
Без рубрики

Строительство демонстрации алгоритма Флахолета-Мартина в Python

Я отдыхал в моем большим классе анализа данных на днях, когда я столкнулся с интересной темой. … с меткой Python, CodeNewie.

Я отдыхал в моем большим классе анализа данных на днях, когда я столкнулся с интересной темой. Инструктор говорил о алгоритмах, которые используются для работы по потокам данных. Один из этих алгоритмов называется алгоритмом флаеолета-Мартина, и он используется для поиска числа различных элементов в потоке данных. Википедия: 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.

У меня было две вещи, которые мне нужно было сделать здесь:

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

Но из-за двоичного формата мне пришлось сломать шаги вниз к:

  1. Вычислить хэш
  2. Преобразовать его в двоичный
  3. Преобразовать двоичный в строку
  4. Отделить эту строку, чтобы вы получили двоичный ты хочешь
  5. Положить его в список для вычислений

Это привело к этой одной строке кода. Python Rocks: D

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

Оригинал: “https://dev.to/theantisnipe/building-a-demonstration-of-the-flajolet-martin-algorithm-in-python-39a4”