Está en la página 1de 3

ALGORITMO KNUTH-MORRIS-PRATT (KMP)

El algoritmo KMP tiene por objeto buscar la existencia de palabra dentro de una cadena de texto. Para ello utiliza informacin basada en los fallos previos, aprovechando la informacin que la propia palabra a buscar contiene de s (sobre ella se precalcula una tabla de valores), para determinar donde podra darse la siguiente existencia, sin necesidad de analizar ms de 1 vez los caracteres de la cadena donde se busca.

TABLA DE FUNCION DE FALLO:


El objetivo de la tabla (pre calculada) es no permitir que cada carcter de S() sea examinado ms de 1 vez.

01234567890123456789012345 'PARTICIPARIA EN PARACAIDAS' -10000000123000000123000000

EFICIENCIA DEL ALGORITMO


Debido a que el algoritmo precisa de 2 partes donde se analiza una cadena en cada parte, la complejidad resultante es O(k) y O(n), cuya suma resulta ser O(n + k). La capacidad del algoritmo queda patente al apreciar como logra saltar varios caracteres a la vez cuando hay un fallo. Esto se aprecia mejor, mirando la tabla T, cuantos ms ceros existan tanto ms grande es el salto resultante. De modo que puede deducirse caso peores y ptimos. Los casos ptimos se denotan porque son todos ceros, o lo que es lo mismo, no se repiten caracteres desde el principio. Ejemplo W ="ABCDEFG". El peor caso se da cuando la cadena se compone de 1 nico carcter. Ejemplo: W= "AAAAAAAA"

FUNCION PRINCIPAL DEL KNUTH-MORRIS-PRATT:


int m=0;//m va ir saltando dentro del texto hasta encontrar la posicin buscada int i=0;//va a recorrer la palabra int donde=0;//sirve como contador de ayuda, cuando no existe la palabra if(ltexto>=lpalabra) { tabla(palabra,tablakmp,lpalabra); cout<<"\n\tTABLA FUNCION FALLO: \n\n\t"; for(int j=0;j<lpalabra;j++) cout<<tablakmp[j]<<" "; while((m<ltexto)&&(i<=lpalabra)) { if(palabra[i]==texto[m+i]) { if(i==lpalabra-1) {donde++; cout<<"\n\n\tLa palabra se encuentra en la posicion: "<<m; } i++; } else { m=m+i-tablakmp[i]; if(i>0) i=tablakmp[i];} } if(donde==0) cout<<"\n\n\tLa palabra no se encuentra...!"; } else cout<<"\n\n\tNo puedes hacer esto...!";

FUNCION PARA CREAR LA TABLA


void tabla(char cadena[],int tabla[],int tam_p) { int k=0;//k va a recorrer el arreglo tabla q va ser llenada int cont=0; tabla[0]=-1; tabla[1]=0; for(int i=1;i<tam_p;i++) { if(cadena[i]==cadena[0]) { k=i; while(cadena[k]==cadena[cont]&&(cont<=tam_p-i-1)) { tabla[k+1]=tabla[k]+1; k++; cont++; } cont=0; i=k-1; } else tabla[i+1]=0; } }