Подсчет количества - это вероятностная структура данных , которая позволяет вам ответить на следующий вопрос:
Чтение потока элементов a1, a2, a3, ..., an
, где может быть много повторяющихся элементов, вв любое время он даст вам ответ на следующий вопрос: сколько элементов ai
вы уже видели.
Вы можете точно получить точное значение в каждый раз, просто поддерживая хэш, гдеключи - это ai
, а значения - это количество элементов, которые вы уже видели.Это быстрый O(1)
add, O(1)
check, и он даст вам точный счет.Единственная проблема в том, что он занимает O(n)
пробел, где n - количество отдельных элементов (имейте в виду, что размер каждого элемента имеет большую разницу, потому что он занимает way more space to store this big string as a key
, чем просто this
.
Итак, чем вам поможет эскизный подсчет? Как и во всех вероятностных структурах данных, вы жертвуете определенностью для пространства. Набросок подсчета позволяет выбрать 2 параметра: точность результатов ε и вероятность неверной оценки δ.
Для этого вы выбираете семейство d
попарно независимых хеш-функций . Эти сложные слова означают, что они не сталкиваются часто (фактически, если оба хэша отображают значения в пространство [0, m]
,вероятность столкновения составляет приблизительно 1/m^2
). Каждая из этих хеш-функций отображает значения в пространство [0, w]
. Таким образом, вы создаете матрицу d * w
.
Теперь, когда вы читаете элемент, вы вычисляете каждыйd
хэшей этого элемента и обновите соответствующие значения в эскизе. Эта часть такая же для эскиза Countи отсчет-мин.
Insomniac хорошо объяснил идею (вычисление ожидаемого значения) для отсчета отсчета, поэтому я просто расскажу об этом с помощью count-мин все еще проще.Вы просто вычисляете d хешей значения, которое хотите получить, и возвращаете наименьшее из них.Удивительно, но это дает надежную гарантию точности и вероятности, которую вы можете найти здесь .
Увеличение диапазона хеш-функций, повышение точности результатов, увеличение количества хеш-функций уменьшает вероятность неверной оценки: ε = e / w и δ = 1 / e ^ d.Еще одна интересная вещь - это то, что значение всегда завышено (если вы нашли значение, оно, скорее всего, больше реального значения, но, конечно, не меньше).