[C] Buscando repeticiones

zildjian

Buenos días compatriotas! Veréis, tengo una cadena de más de mil carácteres y tengo que buscar repeticiones de cadenas de longitud 6 ó 7, además de calcular la distancia entre el string original y su repetición.

Pues bien, se me ocurre cómo ir cogiendo los strings "originales", pero no se cómo ir comparándolo con tooodas las otras cadenas posibles. Lo había escrito con for's y una llamada a una función, pero no me ha dado resultado y por eso recurro a vosotros!

Saludos.

Buffoncete

Welcome to the NP complete friend!

a las 3 salgo de currar y te miro si tengo el algoritmo reducido ;)

S

tipico ejercicio para reventar el borland... xDDDD como tienes q buscar las cadenas?

zildjian

Pues la verdad es para una práctica... xD Para criptoanalizar el código Vigenère, me fijo en el maximo comun divisor de la longitud de las repeticiones. A alguno que vaya a mi uni ya le sonará esto, pero ahora a mi me toca hacerlo para septiembre... xD

Dod-Evers

Carrera y uni? Porque a mí no me suena de nada...

zildjian

Carrera: Ing. informática superior
Uni: UPF
Clase: Programacio I

xDDD

bLaKnI

Buff, xD
Yo lo hice hace MUCHISIMO! En UPF, con el sr. Navarrete! xD
Ya no está él, no?
Navarrete daba también la "reina puta" llamada Enginyeria del Software II, el bloque A de desarrollo, y ahora lo da Vladimir.
Vladimir da también ProgI? xDD

Que pequeño es el mundo...

JuAn4k4

http://www.mediavida.com/vertema.php?fid=9&tid=358636

ahi tienes algo, yo no logre hacerlo pero se puede hacer "rapido".

LOc0

Teniendo en cuenta para lo que lo quieres usar podrías mirarte esto -> http://en.wikipedia.org/wiki/Coincidence_counting

Si prefieres hacerlo buscando cadenas repetidas tienes varios métodos chachis pero poco intuitivos tipo http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm o el árbol PATRICIA que comenta JuAn4k4 que ni Dios sabe usar xD

http://en.wikipedia.org/wiki/String_searching_algorithm

Salu2 ;)

Gnos1s

También puedes hacerlo con un autómata: un bucle que lea letra 1 a 1 y que según la letra, pase al estado Qi. En cada Qi haces lo correspondiente.

Seguramente Q0 es cuando empiezas a buscar la palabra desde el principio, y a Q0 vas cuando estás a medio y ya no corresponde (sigues en la posición i de la cadena entera, pero pasas a la posición 0 de la palabra a buscar).

También puedes ir desde el estad Qf cuando encuentras la palabra completa, y tener una variable que cuente el número de veces que llegas a Qf (incrementas la variable en Qf y listo).

Creo que no más de 4 estados necesitarías.

zildjian

#7 No, está la señorita Vanesa que es peor xD

He creado una función tal que así que va dentro de dos for:

[b]void[/b] busca_rep(int i, int j, char buf1[], char buf2[], char * texto){
    /* Rellenamos el vector buf1 */
    int k;
    for(k = i; k<(i+6); k++){
        buf1[k-i] = texto[k];
    }

/* Llenamos el vector buf2 */
for(k = i; k<(i+7); k++){
    buf1[k-i] = texto[k];
}

char aux[6];
char auxx[7];

/* Llenamos el vector auxiliar de 6 posiciones */
for(k = j ; k<(j+6); k++){
    aux[k-j] = texto[k];
}

/* Llenamos el vector auxiliar de 7 posiciones */
for(k = j ; k<(j+7); k++){
    auxx[k-j] = texto[k];
}

if(!strcmp(aux, buf1)){
    printf("Las cadenas son iguales!");
}
}

...donde los parámetros:
· i: Index de la palabra de 6 ó 7 letras original (la que se tiene que repetir)
· j: Index de donde empezar a crear el vector auxiliar de 6 ó 7 letras (el que se supone que es igual)
· buf1: Primer vector de los "originales"
· buf2: Segundo vector
· texto: un array que son 1000 y pico letras seguidas

Pero me peta porque la shell de linux no me devuelve el control hasta que no finalizo el proceso con el ctrl+c xD

Buffoncete

tu función peta si le pasas un buffer con una i o j tal que i+6 ó i+7 se pasa de la dimensión real del array texto !!!

además programais demasiado complicado para lo que es el ejercicio xD, para que quieres tantos fors ? esto se hace con punteros no como lo has hecho tú.

zildjian

Lo del i+X lo entiendo, pero lo de los punteros, a qué te refieres? Cuál sería su utilidad aquí? Pregunto >.<

Buffoncete

texto es un string que no vas a modificar, con lo cuál no tienes que copiar el valor que tiene en un nuevo array, pierdes memoria, eficiencia, cuando con punteros.

char * primero = texto[X]
char * segundo = texto[Y]

y si quieres comparar 6 posiciones

int i = 6;
while(i-->0)
     if(*primero++ != *segundo++)
             break;

así ahorras espacio en la pila del programa y ganas eficiencia no haciendo tantas llamadas.

sabes que hace el código entero porque i==0, luego las dos palabras son iguales de 6 carácteres.

No le voy a resolver el ejercicio, está claro, por que se lo han puesto para que aprenda :P se tiene que comer más la cabeza.

Usuarios habituales