Permítanme intentar darle una oportunidad a esto para ver cuánto puedo matarlo. :-)
Entonces, para comenzar, debe ser capaz de crear un filtro de floración regular que permita un número finito de elementos con una probabilidad máxima de un falso positivo. Es necesario agregar estas características a su filtro básico antes de intentar construir una implementación escalable.
Antes de intentar controlar y optimizar cuál es la probabilidad, descubramos cuál es la probabilidad para un tamaño de filtro de floración dado.
Primero dividimos el campo de bits por la cantidad de funciones hash que tenemos (número total de bits / número de funciones hash = sectores) para obtener k segmentos de bits que representan cada función hash para que cada elemento siempre se describa con k bits.
Si aumenta el número de cortes o el número de bits por corte, la probabilidad de falsos positivos disminuirá.
También se deduce que a medida que se agregan elementos, se establecen más bits en 1, por lo que aumentan los falsos positivos. Nos referimos a esto como la "relación de relleno" de cada segmento.
Cuando el filtro contiene una gran cantidad de datos, podemos suponer que la probabilidad de falsos positivos para este filtro es la relación de relleno elevada al número de sectores (si tuviéramos que contar los bits en lugar de usar una relación, esto se simplifica en una permutación con problema de repetición).
Entonces, ¿cómo descubrimos cómo elegir una probabilidad de falsos positivos en un filtro de floración? Podemos modificar el número de cortes (lo que afectará la relación de relleno).
Para determinar cuántas rebanadas deberíamos tener, comenzamos por calcular la relación de relleno óptima para una rebanada. Dado que la proporción de relleno está determinada por el número de bits en un segmento que son 1 versus el número de bits que son 0, podemos determinar que cada bit permanecerá sin establecer con una probabilidad de (100% - (1 / bits en un segmento) ) Dado que vamos a tener múltiples elementos insertados, tenemos otra permutación con un problema de reputación y ampliamos las cosas a la relación de llenado esperada, que es (100% - ((100% - (1 / bits en un segmento)) ^ "elementos insertados")). Bueno, resulta que esto es muy similar a otra ecuación. En el documento, relacionan la relación de relleno con otra ecuación, por lo que encaja perfectamente en una serie taylor (1-e ^ (- n / m)). Después de un poco de frustración con esto, resulta que la relación de llenado óptima siempre es de aproximadamente 50%,
Entonces, dado que la probabilidad de un filtro es la proporción de relleno elevada al número de cortes, podemos completar el 50% y obtener P = (50%) ^ k o k = log_2 (1 / P). Entonces podemos usar esta función para calcular la cantidad de cortes que deberíamos generar para un filtro dado en la lista de filtros para un filtro de floración escalable.
def slices_count(false_positive_probability):
return math.ceil(math.log(1 / false_positive_probability, 2))
Editar: Después de escribir esto, me encontré con una mención de la "regla del cincuenta por ciento" al leer sobre la asignación de memoria dinámica basada en el sistema de amigos en TAoCP Vol 1, pp 442-445 con un razonamiento mucho más limpio en lugar de ajustar la curva a (1 -e ^ (- n / m)). Knuth también hace referencia a un documento "La regla del cincuenta por ciento revisado" con algunos antecedentes sobre el concepto ( pdf disponible aquí ).