El mapa de bits (BitSet a)

El mapa de bits (BitSet a)

Utilizar el algoritmo bloomfilter . Puede resolver el problema de penetrar caché.

Ideas: la clave se almacena en la tabla de base de bloomfilter, el acceso frontal a la bloomfilter, si se determina que no se puede dejar ir, de lo contrario, devolver el acceso no autorizado directamente. tasa tolerante a fallos no es alta, sino también para asegurar un desempeño efectivo, reducirá el gran número de visitas a una pequeña cantidad de acceso. (Para evitar ataques de hackers maliciosos.)

problema:

Cómo determinar la existencia de 100 millones de datos dentro de un conjunto de datos? La complejidad del algoritmo requiere, dentro de la gama de control constante!

1,4 mil millones de personas Número de identificación, para determinar la rapidez con un número de identificación en el interior?

plan propuesto:

  1. HashSet

    El 1,4 mil millones en la presencia de un interior de cadena HashSet, utilice un HashSet determinar si existe un valor para resolver

  2. TreeSet

    El 1,4 mil millones en la presencia de una cadena dentro de TreeSet, el uso TreeSet determinar si existe un valor para resolver

    [Volcar imagen no pasa la cadena, la estación de origen puede tener mecanismo de cadena de seguridad, se recomienda guardar la imagen abajo subido directamente (img-bgDoGPaY-1582381270869) (activos / 1582353656870.png)]

Debido a la complejidad (O (1)) HashSet TreeSet más larga que la complejidad de tiempo (O (log n)).

problema de la velocidad: Uso Hash >> Árbol

Ventajas y desventajas:

Pros: muy simples, que se pueden utilizar directamente para almacenar HashSet

Contras: Cuando nuestros datos sobre grande, no se medirán sus datos almacenados, pueden causar desbordamiento de la memoria JVM. Programa fue aplastado.

HashSet y TreeSet cadena almacenada directamente tomar demasiada memoria, no es la solución óptima. Tenemos que elegir otra estructura de la

La introducción de un conjunto de bits

[Volcar imagen no pasa la cadena, la estación de origen puede tener mecanismo de cadena de seguridad, se recomienda guardar la imagen abajo subido directamente (img-O7A9J62w-1582381270870) (activos / 1582354218759.png)]

característica

  1. Que sólo puede almacenar una colección de 0/1,
  2. Cada punto está ocupado por un poco

concepto de hash

Lo que es de hash?

Hash es poner un valor asignado en una longitud ordenada anteriormente, para obtener un valor del mapa

[Volcar imagen no pasa la cadena, la estación de origen puede tener mecanismo de cadena de seguridad, se recomienda guardar la imagen abajo subido directamente (img-eex1Yxd0-1582381270872) (activos / 1582354410997.png)]

picadillo 和 hashCode

valor hash es la ubicación de una longitud de

[Volcar imagen no pasa la cadena, la estación de origen puede tener mecanismo de cadena de seguridad, se recomienda guardar la imagen abajo subido directamente (img-0r4q3VoA-1582381270873) (activos / 1582354491290.png)]

hashCode no es igual al valor de la posición,

hashCode en general, es un valor muy especial, se lleva a cabo por un número primo vienen cambios.

[Volcar imagen no pasa la cadena, la estación de origen puede tener mecanismo de cadena de seguridad, se recomienda guardar la imagen abajo subido directamente (img-lGwZxO8b-1582381270874) (activos / 1582354579189.png)]

La relación entre el hash y hashCode: explicación simple código: llegar a un valor de posición por hashCode.

int pos = getPos(hashCode);
int getPos(int hashCode){
 Int pos = hashCode & (len-1) ;
}

hash de conflictos (hash de colisión)

Hay dos valores, sus valores hash y los valores de punto de venta son los mismos, esta vez podría haber conflictos.

solución:

  1. método de cremallera para resolver

enlace de vuelta camino a la lista

  1. hash de secundaria

Si calculamos el valor hash y el valor del conflicto anterior, se utiliza otra función y hashCode hashCode luego calcular, pos era diferente, hay nuevas pos

  1. la ley de salto

[Volcar imagen no pasa la cadena, la estación de origen puede tener mecanismo de cadena de seguridad, se recomienda guardar la imagen abajo subido directamente (img-V2qrQv5r-1582381270875) (activos / 1582354947211.png)]

Utilice un conjunto de bits

[Volcar imagen no pasa la cadena, la estación de origen puede tener mecanismo de cadena de seguridad, se recomienda guardar la imagen abajo subido directamente (img-eeTnUreD-1582381270876) (activos / 1582354990400.png)]

  1. Obtener valor de hashCode
package com.zxm.bitset;

/**
 * 通过值获取hashCode值。
 */
public class HashCodeFun {
    /**
     * 计算hashCode的关键
     */
    private int seed;
    public HashCodeFun(int seed){
        this.seed = seed;
    }

    /**
     * 通过给出的value计算出hashCode
     */
    public int hashCodeFun(String value){
        char[] chars = value.toCharArray();
        int h = 0;
        if (h == 0 && chars.length > 0) {
            char val[] = chars;
            for (int i = 0; i < chars.length; i++) {
                h = seed * h + val[i];
            }
        }
        return h;
    }
}
  1. aplicación bloomfilter
package com.zxm.bitset;

import java.util.BitSet;

public class Question {
    /**
     * 位集合的长度
     */
    private int len = 12;
    /**
     * 创建一个位集合
     */
    private BitSet bitSet = new BitSet(len);

    private int[] seeds = new int[]{31, 37, 43, 47};
    private HashCodeFun[] hashCodeFuns = new HashCodeFun[seeds.length];
    {
        for (int i = 0; i < seeds.length; i++) {
            hashCodeFuns[i] = new HashCodeFun(seeds[i]);
        }
    }

    /**
     * 给位集合里面设置一个值
     *
     * @param value
     */
    public void addValue(String value) {
        for (HashCodeFun hashCodeFun : hashCodeFuns) {
            int hashCode = hashCodeFun.hashCodeFun(value);// 通过质数计算hashCode的值。
            int pos = hashCode & (len - 1);
            System.out.println(pos);
            bitSet.set(pos, true);
        }
    }

    /**
     * 怎么判断该位集合里是否存在某个值
     * 1 判断集合里面的代表该value的4 个点
     *
     * @param value
     * @return
     */
    public boolean existValue(String value) {
        for (HashCodeFun hashCodeFun : hashCodeFuns) {
            int hashCode = hashCodeFun.hashCodeFun(value);
            int pos = hashCode & (len - 1);
            if (!bitSet.get(pos)) { //
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        Question question = new Question();
        question.addValue("mayun");
        System.out.println(question.existValue("mayun"));
    }
}
Publicado 29 artículos originales · ganado elogios 0 · Vistas 2259

Supongo que te gusta

Origin blog.csdn.net/rootDream/article/details/104451895
Recomendado
Clasificación