Algoritmo análisis de caso-algoritmo de coincidencia de patrones de cadena

Algoritmo análisis de caso-algoritmo de coincidencia de patrones de cadena

Vi un blog de alta calidad en Internet para compartirlo con ustedes. Reimpreso del conocido blogger "Little Grey Ape" , si lo desea, apoye el original.

Enlace original


Hoy compartiré con ustedes un algoritmo de coincidencia de patrones sobre la comparación de cadenas. Entre las operaciones relacionadas con las cadenas en la estructura de datos, la operación de posicionamiento en las subcadenas se suele llamar coincidencia de patrones de cadenas, y también es la más importante en varios procesos de cadenas. Una de las operaciones importantes, y la subcadena también se llama cadena de patrón. Hay principalmente dos algoritmos de coincidencia de uso común para la cadena principal y la cadena de patrón: el algoritmo de coincidencia de patrón ingenuo y el algoritmo KMP (algoritmo de coincidencia de patrón mejorado). Analice estos dos algoritmos por separado.

1. Algoritmo de coincidencia de patrones ingenuo

El algoritmo de coincidencia de patrones ingenuo también se conoce como algoritmo de Brute-Fuchs. Su idea básica es comparar el primer carácter de la cadena principal con el primer carácter de la cadena de patrón. Los caracteres se comparan; de lo contrario, el segundo carácter de la cadena principal se vuelve a comparar con el primer carácter de la cadena del patrón, hasta que cada carácter en la cadena del patrón coincida con la secuencia de caracteres consecutivos en la cadena principal. Esto se llama Si la coincidencia es exitosa, si el contenido que coincide con la cadena de patrón no se puede encontrar en la cadena principal, se denomina falla de coincidencia.

A continuación, dé un ejemplo de almacenamiento de cadenas en matrices de caracteres para implementar un algoritmo de coincidencia de patrones simple.

//传入主串s和模式串t,同时设定从主串中开始匹配的位置pos
int index(char s[],char t[],int pos) {
	int i,j,slen,tlen;
	i = pos;
	j = 0;
	slen = s.length;	//获取到主串的长度
	tlen = t.length;	//获取到模式串的长度
	while (i<slen && j<tlen) {
		if (s[i] == t[j]) {
			i++;
			j++;
		}
		else {
			i = i-j+1;
			j=0;
		}		
	}
	if (j>=tlen) {
		return i-tlen;
	}
	return 1;
}

2. Algoritmo KMP (algoritmo de coincidencia de patrones mejorado)

El algoritmo KMP es una mejora del algoritmo anterior. En comparación con el algoritmo de coincidencia de patrones ingenuo, el algoritmo KMP no necesita retroceder siempre que los caracteres comparados no sean iguales en el proceso de coincidencia de la cadena principal y la cadena de patrón. El puntero de posición de carácter de la cadena principal, en lugar de utilizar el resultado de "coincidencia parcial" que se ha obtenido, "deslice" la cadena de patrón hacia la derecha tanto como sea posible antes de continuar con la comparación.

Suponga que la cadena del patrón es "P0 ... P (m-1)", la idea del algoritmo de coincidencia KMP es: cuando el carácter Pj en la cadena del patrón no es igual al carácter correspondiente Si en la cadena principal, porque los primeros j caracteres ("P0 … P (j-1) ”) se ha emparejado correctamente, por lo que si“ P0… P (k-1) ”en la cadena del patrón es lo mismo que“ P (jk)… P (j-1) ”, entonces P0 se puede comparar con Si, por lo que no necesito retroceder.

En el algoritmo KMP, el deslizamiento de la subcadena se puede realizar de acuerdo con el siguiente valor de función de la cadena de patrón. Si next [j] = k, entonces next [j] significa cuando el Pj en la cadena de patrón no es igual al carácter correspondiente en la cadena principal , Compare el Pnext [j] de la cadena del patrón con los caracteres correspondientes de la cadena principal,

La definición de la siguiente función es la siguiente:

Inserte la descripción de la imagen aquí

El siguiente es el procedimiento para encontrar la siguiente función de la cadena de patrón:

//求模式串p的next函数值,并存入数组next中
void Get_next(char *p,int next[])
{
	int i,j,slen;
	slen = strlen(p);	//获取到模式串的长度
	i=0;
	while (i<slen) {
		if (j==-1||p[i]==p[j]) {
			++i;
			++j;
			next[i] = j;
		} else {
			j = next[j];
		}
	}
}

Después de obtener la siguiente función,

En el algoritmo de coincidencia de patrones KMP, si el subíndice del primer carácter de la cadena del patrón es 0, el algoritmo KMP es el siguiente:

/*利用模式串p的next函数,求p在主串s中从第pos个字符开始的位置*/
/*若匹配成功,返回模式串在主串的位置下标,否则返回-1 */
int Index_KMP(char *s,char *p,int pos,int next[])
{
	int i,j,slen,plen;
	i=pos-1;
	j=-1;
	slen = strlen(s);	//求主串的长度
	plen = strlen(p);	//求模式串的长度
	while (i<slen && j<plen) {
		if (j==-1||s[i]==p[j]) {
			++i;
			++j;
		} else {
			j=next[j];
		}
	}
	if (j>=plen) {
		return i-plen;
	}
	else {
		return -1
	}
		
}
Compartiré el algoritmo de coincidencia de patrones de cadena aquí. Si hay alguna deficiencia, espero que todos puedan corregirme.

Inserte la descripción de la imagen aquí

Me gusta por favor apoya original

Enlace original

Supongo que te gusta

Origin blog.csdn.net/weixin_45820444/article/details/108544901
Recomendado
Clasificación