bases cadena coincidente (bajo): BM algoritmo entender fácilmente cómo utilizar el algoritmo KMP?

bases cadena coincidente (bajo): BM algoritmo entender fácilmente cómo utilizar el algoritmo KMP?

KMP justificación algoritmo

Supongamos que la primaria es una cadena de un patrón de encordado es b, los caracteres que no pueden ser igualados llamado mal carácter, el partido ha sido llamado a hacer esa parte de la cadena de prefijo

Cuando se enfrentan a su mala disposición, la diapositiva patrón de vuelta cadena, tobogán en el proceso, siempre y cuando la cadena de patrón de arriba a abajo y tienen una coincidencia buena prefijo, la comparación es equivalente para tomar un prefijo del patrón de subcadena sufijo con los primeros caracteres de una cadena en comparativo prefijo subcadena

KMP algoritmo es el principal modo de cuerdas y proceso de coincidencia de cadenas, cuando se enfrentan a un mal carácter, para una mejor alineación del prefijo ha sido la posibilidad de encontrar una ley, la cadena de una sola vez de modo deslizante una gran cantidad de bits.

Grab prefijo mismo, en su subcadena sufijo, busque la cadena más larga que puede ser bueno con el prefijo sub-prefijo, se supone que la parte más larga del prefijo puede ser igualada subcadena es {v}, una longitud de k, las cadenas de patrones de un solo uso se deslizan hacia atrás poco jk, cada vez que el equivalente de su mala disposición, el j actualizado k, i sin cambios, y luego continúan para comparar

La buena prefijo todos los sufijos puede ser el más largo coincidente subcadena prefijo subcadena sufijo que se llama la subcadena más larga coincide con un sufijo subcadena correspondiente prefijo subcadena que puede llamarse la coincidencia más larga prefijo subcadena

KMP algoritmo por delante para construir una matriz para almacenar las cadenas de patrones más larga emparejamiento de prefijo subcadena puede ser el final de cada índice de caracteres de prefijo, que se define como el conjunto al lado de la matriz, también llamada la función de fallo, por los índices de matriz valor de índice prefijo es el prefijo para el final de la matriz puede ser el más largo emparejamiento de prefijo subcadena de caracteres al final de la subíndice

cadenas de patrones: ababacd

cadena de patrón prefijo (candidata buena prefijo) prefijos subíndice de caracteres final puede ser la más larga de caracteres de prefijos sub-cadena al final del siguiente valor del subíndice

un 0 -1 (ausencia) siguiente [0] = -1

ab 1 -1 siguiente [1] = -1

aba 2 0 siguiente [2] = 0

ABAB 3 1 siguiente [3] = 1

ababa 4 2 siguiente [4] = 2

ababac 5 -1 siguiente [5] = -1

Por ejemplo, el candidato prefijo: aba

Deje aba encontrar la combinación prefijo más largo puede ser sub-índice final cadena de caracteres

abaaba

aa

baab // fin, ba! = ab, sólo la primera línea de un = a, un subíndice 0, el siguiente [2] = 0

KMP marco algoritmo:

//a,b分别是主串和模式串;n ,m 分别是主串和模式串的长度
public static int kmp(char[] a ,int n,char[] b ,int m ){
	int[] next = getNexts(b,m);
	int j = 0 ;
	for(int i = 0 ; i < n ; ++i){
		while(j  > 0 && a[i] != b[j]){       //一直找到a[i]和b[j]
			j = next[j - 1] + 1;
		}
		if(a[i] == b[j]){
			++j;
		}
		if(j == m){     //找到匹配模式串的了
			return i - m +1;
		}
	}
	return -1;
}

Cálculo función de fallo

Cómo matriz siguiente contado a cabo?

Según pequeña subíndice para valores grandes calculan sucesivamente siguiente matriz, cuando queremos calcular el siguiente [I], cuando delante de la siguiente [0], junto [1], ......, junto [i-1] son ​​considerados a estar fuera por el siguiente valor se ha calculado, puede valor rápidamente derivan próxima [i] es?

Si el siguiente [i-1] = k -1, es decir, subcadena b [0, k-1] es b [0, i-1] BE la coincidencia más larga prefijo subcadena, si b [0, k-1] el siguiente carácter b [k], y b [0, i-1] del siguiente carácter b [i] partidos que subcadena b [0, k] es b [0, i] pueden ser la más larga sub coincidente cadena, el siguiente [i] = k

// b 表示模式串,m表示模式串的长度
private static int[] getNexts(char[] b ,int m){
	int[] next = new int[m];
	next[0] = -1;
	int k = -1;
	for(int i = 1 ; i < m ; ++i){
		while(k != -1 && b[k+1] != b[i]){
			k = next[k];
		}
		if(b[k + 1] == b[i]){
			++k;
		}
		next[i] = k ;
	}
	return next;
}

recomendado:

http://www.zhihu.com/question/21923021 respuesta fila feliz

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

Supongo que te gusta

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