autómata AC: ¿Cómo lograr múltiples coincidencia de patrones de filtrado de palabra sensible?

autómata AC: ¿Cómo lograr múltiples coincidencia de patrones de filtrado de palabra sensible?

algoritmo de coincidencia de cadenas, mediante el mantenimiento de una palabra en el diccionario sensible, después de introducir un texto por el algoritmo de coincidencia de cadenas, para encontrar este texto introducido por el usuario, contiene palabras sensibles, si la hay, para usar *** sustituto

¿Cómo lograr un sistema de filtrado de palabra sensibles de alto rendimiento? algoritmo de coincidencia de cadenas múltiples

Basado en un solo modo de filtrado cadenas de palabras sensibles y la Trie logra

BF, RK, BM, KMP, árbol Trie, el primero de cuatro patrón único algoritmo de coincidencia de cadenas, sólo el Trie es un algoritmo de coincidencia de varios patrones

cadena única patrón llamado es una cadena y entre una cadena de coincidencia de patrones maestro, múltiple coincidencia de cadenas se realiza entre una pluralidad de cadena de patrón principal y una cadena de

¿Qué tan sensibles palabras con el Trie filtrarla?

palabras sensibles de pretratamiento, construir la estructura de árbol Trie, si la palabra carácter sensible actualiza de forma dinámica, y sólo necesitamos actualizar dinámicamente el aspecto árbol de Trie, cuando el usuario introduce un contenido de texto, la entrada del usuario como una cadena principal, desde el primer iniciar caracteres, igualando en el trie, cuando se combina con el nodo hoja Trie no coincide con el carácter cuando se encuentran, o cuando la cadena principal coincide con la posición inicial de un próximo paso, el siguiente carácter es un carácter de inicio reiniciar el partido en el trie

Más eficientes algoritmos clásicos múltiples cadena coincidente: autómata AC

La relación entre Trie y AC máquina automática como una única cadena que coinciden con los algoritmos de simple cadena a juego, el algoritmo KMP con el mismo, pero el Trie para una cadena de multi-modo sólo, por lo que la máquina automática de CA es en la parte superior de la Trie, además la siguiente serie similar de KMP, pero ahora la siguiente matriz se construyó en los árboles Bale

public class AcNode{
	public char data;
	public AcNode[] children = new AcNode[26];//字节集只包含a~z这26个字符
	public boolean isEndingChar = false; //结尾字符为true
	public int length = -1;   //当isEndingChar = true时,记录模式串长度
	public AcNode fail;//失败指针
	public AcNode(char data){
		this.data = data;
	}
}

constructo autómata AC comprende dos operaciones:

  • La pluralidad de cadenas de patrones construido para la Trie
  • Trie construido árbol puntero fracaso (siguiente función correspondiente a la insuficiencia de la matriz KMP)

Cómo Después de construir el puntero Trie no construye en la parte superior de la misma?

Hay cuatro tales cadena de patrón C, BC, BCD, ABCD, es la principal cadena de ABCD

raíz

abecedario

bc

cd

d

Trie árbol cada nodo tiene un puntero a un fracaso, si p Ir a lo largo de los nodos Trie, el nodo C es rojo, y que el puntero P es el fracaso de la cadena abc rojo viene desde el nodo raíz se forma, la cadena patrón con todos los prefijos bc más larga subcadena coincidencia de patrones coincide con un sufijo, flecha apunta a una cadena que

Sobre subcadena más larga que coincide con una cadena ABC sufijo sufijo subcadena dos bc, c, para llevarlos a otra coincidencia de patrones, si un sufijo prefijo subcadena coincide con una cadena de patrón, el sub-sufijo llama la subcadena sufijo cadena coincidente puede encontrar un partido más largo de una subcadena sufijo es la subcadena más larga que coincide con un sufijo

Falla puntero p que señala a nodo que coincide con la cadena patrón subcadena más larga sufijo correspondiente al prefijo último nodo es el primero de un segundo punto c c

Proceso de construcción falla puntero es un proceso en capas a través del árbol, la raíz si falla el puntero es nulo, que es el punto a sí mismos

Cuando tenemos que orar por un fallidos punteros nodo p, consejos sobre cómo encontrar el fracaso de sus nodos hijos?

Conjunto de nodos fallidos puntero P apunta al nodo Q, para ver si el nodo hijo de p pc carácter correspondiente se puede encontrar en el nodo hijo q, si un niño nodo de control de calidad nodo se encuentra q, el carácter que corresponde con PC de nodo correspondiente el mismo carácter, se producirá un error de puntero punto de nodo PC nodo de control de calidad, si el nodo q no es de carácter sub-nodo es igual a los personajes de la PC nodo incluye, de manera que q = q -> fallar (a prueba indica puntero del fallo), seguir buscando hasta q = raíz hasta ahora, si el nodo secundario de los mismos personajes no encuentran, por no pc puntero fallo de un nodo que apunta a la raíz

Deja de puntero de construcción:
public void buildFailurePointer(){
	Quene<AcNode> quene = new LinkedList<>();
	root.fail = null;
	quene.add(root);
	while(!quene.isEmpty()){
		AcNode p = quene.remove();
		for(int i = 0 ; i < 26 ; ++i){
			AcNode pc = p.children[i];
			if(pc == null) continue;
			if(p == root){
			pc.fail = root;
			}else{
				AcNode q = p.fail;
				while(q != null){
					AcNode qc = q.children[pc.data - 'a'];
					if(qc != null){
						pc.fail = qc;
						break;
					}
					q = q.fail;
				}
				if(q == null){
					pc.fail = root;
				}
			}
			quene.add(pc);
		}
	}
}
Cómo coincidir con la cadena en el autómata principal de CA?

Proceso, principal cadena comienza desde i = 0, el AC autómata comienza a partir de p = puntero de raíz, se supone que la cadena de patrón B, es una cadena principal

  • Si hay un nodo apuntado por p es igual a b [i] de nodo secundario x, p actualización punto x, que fallan cuando sea necesario por el puntero, el puntero para detectar una serie de ruta de acceso fallido terminando cadena de patrón, post-tratamiento, i + 1, continuar
  • Si no es el nodo apuntado por p = b nodo hijo [i], de modo que p = p-> fallar

El código que coincide con el código de salida es :( posición en las principales cadenas de cada ocurrencia de la lata cadena de coincidencia de patrones)

public void match(char[] text){     //text是主串
	int n = text.length;
	AcNode p = root;
	for(int i = 0 ; i < n ; ++i){
		int idx = text[i] - 'a';
		while(p.children[idx] == null && p != root){
			p = p.fail;        //失败指针发挥作用的地方
		}
		p = p.children[idx];
		if(p == null)  p = root;   //如果没有匹配的,从root开始重新匹配
		AcNode tmp = p ;
		while (tmp != root){  //打印出可以匹配的模式串
			if(tmp.isEndingChar == true){
				int pos = i - tmp.length+1;
				System.out.println("匹配起始下标" + pos + ";长度" + tmp.length);
			}
			tmp = tmp.fail;
		}
	}
}

Sensible sistema de filtrado de palabra AC Autómatas sea más eficiente que el modelo único método de cadena a juego?

Las palabras sensibles AC construidos máquina automática que comprende la construcción de la Trie y el puntero fallado

Desde el punto de vista de la complejidad, la eficiencia del partido autómata de CA con el Trie, como, de hecho, la mayor parte del puntero que apunta a la falta de raíz,

https://www.cnblogs.com/sclbgw7/p/9260756.html

https://www.cnblogs.com/hyfhaha/p/10802604.html

Publicado 75 artículos originales · ganado elogios 9 · vistas 9185

Supongo que te gusta

Origin blog.csdn.net/ywangjiyl/article/details/104525867
Recomendado
Clasificación