El principio y realización del filtro Bloom.

1. Conceptos básicos

Bloom Filter (Filtro Bloom) fue propuesto por Bloom en 1970. En realidad, es un vector binario muy largo y una serie de funciones de mapeo aleatorias . Los filtros Bloom se pueden usar para recuperar si un elemento está en una colección.
Su ventaja es que la eficiencia del espacio y el tiempo de consulta superan con creces el algoritmo general, pero la desventaja es que tiene una cierta tasa de reconocimiento erróneo y dificultad para borrar.
Los rastreadores de Google tienen que juzgar. Qué páginas web se rastrearon.
Si desea juzgar si un elemento está en un conjunto, la idea general es guardar todos los elementos y luego determinar por comparación. Las listas vinculadas, los árboles y otras estructuras de datos son todas estas formas de pensar, pero a medida que aumentan los elementos de la colección, necesitamos más y más espacio de almacenamiento, y la velocidad de recuperación se vuelve cada vez más lenta (O (n), O (logn)) .
Sin embargo, también existe una estructura de datos (una matriz dinámica + una función hash) llamada tabla hash (también llamada tabla hash) en el mundo. Puede mapear un elemento a un punto en una matriz de bits a través de una función Hash. De esta forma, solo necesitamos ver si este punto es 1 para saber si está en el conjunto. Esta es la idea básica del filtro Bloom.
El problema que enfrenta Hash es el conflicto. Suponiendo que la función Hash es buena, si la longitud de nuestra matriz de bits es m puntos, entonces si queremos reducir la tasa de colisión a, por ejemplo, 1%, esta tabla hash solo puede contener m / 100 elementos. Obviamente, esto no se llama espacio eficiente. La solución también es simple, es usar múltiples Hash, si uno de ellos dice que el elemento no está en el conjunto, no debe estar ahí. Si todos dicen que sí, aunque existe cierta posibilidad de que mientan, la probabilidad de juzgar intuitivamente tales cosas es relativamente baja.
Bloom Filter es una estructura de datos aleatoria con una eficiencia espacial muy alta. Utiliza matrices de bits para expresar un conjunto de manera muy concisa y puede juzgar si un elemento pertenece a este conjunto. La eficiencia de Bloom Filter tiene un precio determinado: al juzgar si un elemento pertenece a un determinado conjunto, es posible confundir elementos que no pertenecen a este conjunto como pertenecientes a este conjunto (falso positivo). Por lo tanto, Bloom Filter no es adecuado para esas aplicaciones de "error cero". En aplicaciones donde se pueden tolerar bajas tasas de error, Bloom Filter ha logrado grandes ahorros en espacio de almacenamiento con muy pocos errores.
En resumen:
bloomfilter, bloom filter: determina rápidamente si un elemento está en un conjunto enorme, pero tiene una
debilidad: tiene una cierta tasa de errores de juicio. Tasa de errores de juicio: elementos que no existen originalmente en el conjunto, El filtro Bloom puede juzgar que existe, pero si el filtro Bloom considera que un elemento no existe en el conjunto, entonces el elemento no debe estar en el conjunto.

En segundo lugar, las ventajas y desventajas de los filtros de floración.

1. Ventajas

En comparación con otras estructuras de datos, los filtros Bloom tienen enormes ventajas en el espacio y el tiempo.
(1) El espacio de almacenamiento del filtro Bloom y el tiempo de inserción / consulta son constantes.
(2) Además, las funciones Hash no tienen relación entre sí, lo que es conveniente para la implementación paralela por hardware.
(3) El filtro Bloom no necesita almacenar el elemento en sí, lo que tiene ventajas en algunas ocasiones con requisitos de confidencialidad muy estrictos.
(4) Los filtros Bloom pueden representar el conjunto completo, pero ninguna otra estructura de datos;
(5) kym son iguales, y la operación de intersección y diferencia de dos filtros Bloom que usan el mismo conjunto de funciones Hash pueden usar operaciones de bits.
(6) Puede determinar rápidamente la presencia o ausencia de un elemento, lo que reduce en gran medida la escala de los datos almacenados.

2. Desventajas

Pero las desventajas y ventajas de los filtros Bloom son igualmente obvias.
(1) La tasa de error de cálculo es uno de ellos. A medida que aumenta el número de elementos almacenados, aumenta la tasa de errores de cálculo. Pero si el número de elementos es demasiado pequeño, una tabla hash es suficiente.
(2) Además, en general, los elementos no se pueden eliminar del filtro Bloom. Es fácil para nosotros pensar en convertir la matriz de bits en una matriz de enteros, agregando 1 al contador correspondiente a cada elemento insertado, de modo que el contador disminuya cuando se elimine el elemento. Sin embargo, garantizar la eliminación segura de elementos no es tan simple. En primer lugar, debemos asegurarnos de que el elemento eliminado esté efectivamente en el filtro Bloom. Esto no está garantizado solo por este filtro.
(3) Además, la envoltura del mostrador también causará problemas. En términos de reducir la tasa de errores de cálculo, mucho trabajo ha llevado a la aparición de muchas variantes de filtros Bloom.

3. Consideraciones de escenarios de uso

(1) Existe una cierta tasa de errores de cálculo, por lo que si no puede tolerar la tasa de error, el filtro Bloom no es aplicable;
(2) El filtro Bloom no admite operaciones de eliminación

Tres, principio de realización

El filtro Bloom requiere una matriz de bits (similar al mapa de bits (mapa de bits), matriz de bytes) y funciones de mapeo K (similar a la tabla Hash). En el estado inicial, para una matriz de matriz de bits de longitud m, su Todos los bits se establecen en 0.
El principio y realización del filtro Bloom.

1. Agrega elementos al filtro Bloom

(1) Para un conjunto S = {S1, S2 ... Sn} con n elementos, mediante k funciones de mapeo {f1, f2, ... fk};
(2) Ponga cada uno de los conjuntos S Los elementos Sj (1 <= j <= n) se asignan a k valores {g1, g2 ... gk},
(3) y luego a la matriz correspondiente [g1], matriz [g2] en la matriz de matriz de bits. ..... array [gk] se establece en 1.

2. Elemento de consulta de filtro Bloom

(1) Al consultar si los elementos W existen en el conjunto, pase W a través de la función de mapeo hash {f1, f2, ... fk} para obtener el conjunto g
(2) Obtenga los valores K del conjunto g {g1, g2 ... gk}, correspondiente a k puntos en la matriz de bits.
(3) Si uno de los k puntos no es 1, se puede juzgar que el elemento no debe existir en el conjunto. Por el contrario, si todos los k puntos son 1, el elemento puede existir en el conjunto.
Nota: No es posible juzgar si el elemento debe existir en el conjunto aquí, y puede haber una cierta tasa de errores de cálculo. Se puede ver en la figura: Supongamos que cierto elemento corresponde a los tres puntos 4, 5 y 6 a través del mapeo. Aunque estos 3 puntos son todos 1, es obvio que estos 3 puntos son las posiciones obtenidas al hacer hashing de diferentes elementos. Por lo tanto, esta situación muestra que aunque los elementos no están en el conjunto, pueden corresponder a todos 1. Esta es la tasa de error de juicio La razón de la existencia.

3. Qué se debe hacer al personalizar un filtro Bloom

(1) inicializar una matriz de bits
(2) realizar una función hash K
(3) se debe realizar la operación de inserción para consultas y
consultas e insertar operaciones: los cálculos del valor hash insertado entrante, hay varias funciones hash, calcula algunas En segundo lugar, el valor del resultado calculado cada vez se basa en este valor, y la posición correspondiente en la matriz de bits se cambia a 1;
para las operaciones de consulta, solo necesita realizar k funciones hash en el valor clave que desea consultar Llame y luego juzgue si uno de los valores calculados en la matriz de dimensiones correspondiente a los valores k es 0, si uno es 0, significa que la clave no está en este conjunto.

Cuatro, función hash / tabla hash

1. Concepto

Los elementos de la tabla hash están determinados por la función hash. La clave K del elemento de datos se usa como una variable independiente, y a través de una cierta relación funcional (llamada función hash), el valor calculado es la dirección de almacenamiento del elemento, es decir, la posición de un elemento en la tabla hash está determinada por Determinado por la función hash.

2. Características

(1) Si los dos valores hash no son iguales (según la misma función), la entrada original de los dos valores hash tampoco es la misma.
(2) La entrada y la salida de la función hash no se corresponden de forma única. Si los dos valores hash son iguales, es probable que los dos valores de entrada sean iguales. Pero también puede ser diferente. Esta situación se llama "colisión hash" (o "colisión hash").

3. Método de construcción hash

(1) El método de direccionamiento directo
toma la palabra clave o un valor de función lineal de la palabra clave como dirección hash. Es decir, H (tecla) = tecla o H (tecla) = akey + b (a, b son constantes).
(2) En el método de análisis numérico,
si la palabra clave es un número basado en r (como un número decimal basado en 10), y las palabras clave que pueden aparecer en la tabla hash se conocen de antemano, se pueden usar varias palabras clave Los dígitos forman una dirección hash.
(3) Al cuadrar
el método del medio y tomar los dígitos del medio después del cuadrado de la palabra clave, se encuentra la dirección hash, que es la más utilizada.
(4) El método de plegado
divide la palabra clave en varias partes con el mismo número de bits (el número de bits en la última parte puede ser diferente) y luego toma la suma superpuesta de estas partes (redondeada hacia arriba) como la dirección hash. Es adecuado cuando la palabra clave tiene una gran cantidad de dígitos y los dígitos de cada dígito en la palabra clave están distribuidos de manera uniforme.
(5) Además del método del resto, la
clave se divide por un número p no mayor que la longitud m de la tabla hash, y el resto es la dirección hash (p es un número primo)
H (clave) = clave MOD p, p <= m (El más simple y de uso más común) La elección de p es muy importante. En
general, p puede seleccionarse como un número primo o un número compuesto que no contenga un factor primo menor que 20 (los números compuestos se refieren a números naturales que pueden integrarse por 1 y él mismo, pero también pueden ser otros Número (excepto 0).

(6) El método de número aleatorio
selecciona una función aleatoria y toma el valor de la función aleatoria de la palabra clave como su dirección hash. Es decir, H (clave) = rando (clave), donde aleatorio es una función aleatoria. Aplicable cuando las palabras clave tienen diferentes longitudes.

Resumen: En el trabajo real, se seleccionan diferentes funciones hash de acuerdo a diferentes situaciones. Generalmente, se consideran los siguientes factores:

(1) El tiempo necesario para calcular la función hash (incluidos los factores de instrucción de hardware)

(2) Longitud de las palabras clave

(3) El tamaño de la tabla hash

(4) Distribución de palabras clave

(5) Frecuencia de búsqueda de registros

4. Colisión de hash

Concepto: dos palabras clave diferentes tienen el mismo valor de resultado calculado por la misma función hash.

5. Resuelve la colisión de hash

(1) El método de cremallera
extrae una lista vinculada dinámica en lugar de una estructura de almacenamiento secuencial estática, lo que puede evitar el conflicto de la función hash, pero la desventaja es que el diseño de la lista vinculada es demasiado engorroso, lo que aumenta la complejidad de la programación. Este método puede evitar completamente el conflicto de la función hash.
(2)
El método de hash múltiple que diseña dos o más funciones hash puede evitar conflictos, pero aún hay posibilidades de conflictos. Cuanto mejor o más se diseñe la función, la probabilidad se puede minimizar (a menos que el carácter sea demasiado malo, de lo contrario Es casi imposible entrar en conflicto).
(3) Método de dirección abierta El método de dirección
abierta tiene una fórmula: Hi = (H (tecla) + di) MOD mi = 1,2, ..., k (k <= m-1)
donde m es una tabla hash La mesa es larga. di es la secuencia incremental cuando ocurre un conflicto.
Si el valor de di puede ser 1, 2, 3, ... m-1, llame a detección lineal y luego hash.
Si di toma 1, luego de cada conflicto, retrocede 1 posición.
Si el valor de di puede ser 1, -1,4, -4,9, -9,16, -16, ... kk, -kk (k <= m / 2), se denomina segunda detección y luego hash.
Si el valor de di puede ser una secuencia de números pseudoaleatorios, se llama detección pseudoaleatoria y luego hash.
(4) El método de construcción de dominio
asume que el rango de valores de la función hash es [0, m-1], luego el vector HashTable [0..m-1] se establece como la tabla básica y el vector de espacio de almacenamiento OverTable [0..v] también se configura Se utiliza para almacenar registros en conflicto.

5. Estimación de la tasa de falsos positivos

Ahora que entendemos el principio de funcionamiento general del filtro Bloom, calculemos la tasa de falsos positivos.

数组的大小:m 
总共的数据大小为:n 
hash函数的个数为:k

Suponga que la función hash en el filtro Bloom satisface la hipótesis de hash uniforme simple: cada elemento tiene la misma probabilidad que cualquiera de las m ranuras y cuál de los otros elementos tiene hash Slot no tiene nada que hacer. Si m es el número de bits, entonces:
para un cierto bit, después de que se llame a una determinada función hash en un elemento, la probabilidad de que cambie a 1 es:
El principio y realización del filtro Bloom.
para un cierto bit, una determinada función hash en un elemento La probabilidad de que no se establezca en 1 durante la inserción es: la probabilidad de
El principio y realización del filtro Bloom.
que ninguna de las k funciones hash se establezca en 1, es decir, la probabilidad de que el bit permanezca en 0 después de k veces de hash:
El principio y realización del filtro Bloom.

Si se insertan n elementos, pero no se establecen en 1, es decir, después de insertar todos los elementos, la probabilidad de que cierto bit no se haya cambiado a 1:
El principio y realización del filtro Bloom.
entonces esta posición se establece en 1. La probabilidad de (cambiado a 1), es decir, la probabilidad de que un determinado bit cambie a 1 después de que se inserten todos los elementos:
El principio y realización del filtro Bloom.

Ahora compruebe si un elemento está en el conjunto. Indica si un elemento está en el conjunto. Las k posiciones requeridas se establecen en "1" de acuerdo con el método anterior, pero este método puede hacer que el algoritmo crea erróneamente que un elemento que no está en el conjunto se detecta como si estuviera en el conjunto. Media (falsos positivos), es decir, la probabilidad de que todas las k posiciones sean 1 está determinada por la siguiente fórmula:

El principio y realización del filtro Bloom.

De hecho, los resultados anteriores se calculan asumiendo que las posiciones de los bits que deben establecerse calculadas por cada Hash son independientes entre sí. No es difícil ver que a medida que aumenta m (tamaño de la matriz de bits), los falsos positivos (Falso La probabilidad de positivos) disminuirá y, a medida que aumenta el número de elementos insertados n, la probabilidad de falsos positivos aumentará nuevamente, para un m dado, n.
(1) La siguiente fórmula determina cómo elegir el número k de funciones hash:

El principio y realización del filtro Bloom.
Proceso de derivación: a
partir de los resultados calculados anteriormente, ahora calcule el valor de k para los myn dados, lo que puede minimizar la tasa de errores de cálculo. Sea la función de la tasa de errores de cálculo k:
El principio y realización del filtro Bloom.
traducir, es decir, cuando se determinan myn, ¿cuánto deberíamos establecer k para minimizar la tasa de errores de cálculo?
Después de determinar myn, pedimos una k para minimizar el valor de f (k).
Después de que podamos determinar la relación entre k, myn, podemos asegurarnos de que la tasa de error de cálculo sea la más pequeña.
Primero, suponga que
El principio y realización del filtro Bloom.
la fórmula anterior se simplifica a:
El principio y realización del filtro Bloom.
Tome el logaritmo de ambos lados y obtenga:
El principio y realización del filtro Bloom.
Ambos lados toman la derivada de k , inferido:
El principio y realización del filtro Bloom.

Luego, para encontrar el mejor valor:
El principio y realización del filtro Bloom.

y entonces:
El principio y realización del filtro Bloom.

Entonces:
El principio y realización del filtro Bloom.
Entonces:
El principio y realización del filtro Bloom.

La tasa de errores de juicio en este momento:
El principio y realización del filtro Bloom.
se puede ver que si la tasa de errores de juicio es ≤1 / 2, entonces:
El principio y realización del filtro Bloom.

(2) Para una probabilidad p dada de falsos positivos, la fórmula para seleccionar el tamaño óptimo de matriz de bits m es:
El principio y realización del filtro Bloom.

La fórmula anterior muestra que el tamaño de la matriz de bits es mejor para tener una relación lineal con el número de elementos insertados. Para un m, n, k dado, la probabilidad máxima de falso positivo es:

El principio y realización del filtro Bloom.

6. Implementación del código

(1) Implementación de código Python


import mmh3
from bitarray import bitarray

# zhihu_crawler.bloom_filter

# Implement a simple bloom filter with murmurhash algorithm.
# Bloom filter is used to check wether an element exists in a collection, and it has a good performance in big data situation.
# It may has positive rate depend on hash functions and elements count.

BIT_SIZE = 5000000

class BloomFilter:

    def init(self):
        # Initialize bloom filter, set size and all bits to 0
        bit_array = bitarray(BIT_SIZE)
        bit_array.setall(0)

        self.bit_array = bit_array

    def add(self, url):
        # Add a url, and set points in bitarray to 1 (Points count is equal to hash funcs count.)
        # Here use 7 hash functions.
        point_list = self.get_postions(url)

        for b in point_list:
            self.bit_array[b] = 1

    def contains(self, url):
        # Check if a url is in a collection
        point_list = self.get_postions(url)

        result = True
        for b in point_list:
            result = result and self.bit_array[b]

        return result

    def get_postions(self, url):
        # Get points positions in bit vector.
        point1 = mmh3.hash(url, 41) % BIT_SIZE
        point2 = mmh3.hash(url, 42) % BIT_SIZE
        point3 = mmh3.hash(url, 43) % BIT_SIZE
        point4 = mmh3.hash(url, 44) % BIT_SIZE
        point5 = mmh3.hash(url, 45) % BIT_SIZE
        point6 = mmh3.hash(url, 46) % BIT_SIZE
        point7 = mmh3.hash(url, 47) % BIT_SIZE

        return [point1, point2, point3, point4, point5, point6, point7]```

# 7、总结
在计算机科学中,我们常常会碰到时间换空间或者空间换时间的情况,即为了达到某一个方面的最优而牺牲另一个方面。Bloom Filter在时间空间这两个因素之外又引入了另一个因素:错误率。在使用Bloom Filter判断一个元素是否属于某个集合时,会有一定的错误率。也就是说,有可能把不属于这个集合的元素误认为属于这个集合(False Positive),但不会把属于这个集合的元素误认为不属于这个集合(False Negative)。在增加了错误率这个因素之后,Bloom Filter通过允许少量的错误来节省大量的存储空间。
自从Burton Bloom在70年代提出Bloom Filter之后,Bloom Filter就被广泛用于拼写检查和数据库系统中。近一二十年,伴随着网络的普及和发展,Bloom Filter在网络领域获得了新生,各种Bloom Filter变种和新的应用不断出现。可以预见,随着网络应用的不断深入,新的变种和应用将会继续出现,BloomFilter必将获得更大的发展。

Supongo que te gusta

Origin blog.51cto.com/12824426/2555710
Recomendado
Clasificación