Hola!

Registrándote como bakuno podrás publicar, compartir y comunicarte en privado con otros bakuos :D

Regístrame ya!

Como almacenar cadenas en C

celta179

Bovino maduro
Desde
3 Ago 2009
Mensajes
137
Hola, tengo que hacer un programa en C en el cual tengo una cadena de caracteres los cuales son todas las letras del abecedario, y despues tengo que hacer todas las combinaciones pero en cadenas de 4 caracteres, ejemplo:
aaaa aaba aaca .............................. zzza
aaab aabb aacb .............................. zzzb
aaac aabc aacb ................................ zzzc
aaad aabd aacd ............................... zzzd
. . . .
. . . .
. . . .
. . . .
aaaz aabz aacz ................................. zzzz

Pero conforme se van creando se van comparando con una una cadena de 4 caracteres, por ejemplo "hola"
En el momento en q coincide con la palabra el programa se detiene.
En lo de generar las cadenas y compararlas no tengo mucho prolema,mas o menos tengo la idea, mi verdadero problema es como ir almacenando las cadenas en una variable para irlas comparando.
Espero que me puedan ayuder en como almacernar las cadenas generadas!!!!!!!
 
EN una pila? en una lista enlazada? mejor guardar la direccion donde estan las cadenas a comparar.... son ideas que de momento me vienen a la mente. Busca los temas en un libro... suerte.
 
Quien te encargó eso?
456976 posibles combinaciones (tomando el alfabeto gringo, que no tiene ñ)
Y tienes que imprimir todas las combinaciones en pantalla?! Y aparte checar cuando estas combinaciones van a compararse con otra palabra de 4 caracteres? Amigo, primero se te congela la computadora, un algoritmo chilero estoy casi seguro que es de la forma O(n^4) sin necesidad de hacer un ciclo invariante.

Lo que quieres hacer se llama permutacion de palabras.
Bueno veamos, lo que tienes que hacer es sencillo.

Pongamonos a pensar un poco en la forma de logica digital, para construir una tabla de verdad, siempre usamos la formula 2^n , donde n son la cantidad de variables y 2, la cantidad de simbolos a utilizar para hacer combinaciones (0 y 1).

Por ejemplo la tabla de verdad para AND de 2 variables es:
A B AB
0 0 0
0 1 0
1 0 0
1 1 1

para tres variables (2^3 = 8)
A B C ABC
0 0 0 0
0 0 1 0
0 1 0 0
0 1 1 0
1 0 0 0
1 0 1 0
1 1 0 0
1 1 1 1



donde 8, representa el numero de renglones (o el numero de combinaciones), y luego se divide entre 2, y sabemos que para la primer columna, tenemos 4 ceros y 4 unos, para la segunda columna, ese 4 se divide entre 2, y tendremos 2 ceros y 2 unos alternadamente y la tercer columna tenemos 0 y 1 alternadamente.

Ahora extrapolemos este razonamiento a la permutacion de palabras.

Ahora en lugar de 2 posibles simbolos, tenemos 26, de los cuales solo nos interesa tener una palabra de 4, y no nos importa que esa palabra sea a a a a, b b b b, c c c c , d d d d, etc.. osea que las letras se pueden repetir.

entonces tenemos un total de 26^4 combinaciones (456976)
si dividimos ese número entre 26
nos da un resultado de 17 576, esto quiere decir... que para la primer columna (de izquierda a derecha), vas a tener
17576 as
17576 bes
17576 ces
17576 des
.
.
.
17576 zetas

para la segunda columna, vas a tener 646 as 646 bes 646 ces ... 646 zetas, pero eso solo te va a dar, 17576 combinaciones (646*26), asi que lo tienes que repetir dos veces, para que alcances a llenar los 456976 combinaciones posibles.
para la tercer columna, necesitas 26as, 26 bes, 26 ces, 26 des, ... pero eso solo te va a dar 17576 combinaciones, asi que lo tienes que repetir 4 veces, para que alcances las 456976 combinaciones posibles.
Para la cuarta columna, solo necesitas una a, una b, una c, una d... pero solo solo te va a dar 26, y eso lo tienes que repetir 16 veces, para que te den las 456976 combinaciones.

Entonces la manera chilera de lograrlo... es con ciclos anidados.
uno adentro del otro, minimo 4, y ya 4 anidados, te da un T(n) = O(n^4)

y eso sin comparar, yo te recomiendo que dejes que tu programa te genere tus combinacionesy lo escriba a un archivo, luego con otro programa te busque las palabras en tu archivo. Si es un vil y corriente archivo de texto, cada letra te ocupa un byte, asi que tendras un archivo de aproximadamente 456 kilobytes, con todas tus combinaciones, y luego utilices algun algoritmo de divide and conquer, porque una busqueda lineal se tardaria un rato en encontrarlo (no demasiado, pero si algo), busqueda binaria te recomendaria, sin sentinelas, no es necesario.


Aqui te dejo un sample con un programita que acabo de escribir en menos de 20 minutos:

Mi conjunto universo, es de 4 elementos, y me interesa formar palabras de 3 caracteres de longitud, con la combinacion de estas cuatro letras:
U = {a,b,c,d}
Lo cual me da un total de:
4^3 = 64 combinaciones

Donde la primer columna (izq a derecha), tiene 16 as, 16 bes 16 ces y 16 des (64/4), la segunda columna tiene 4 as, 4 bes, 4 ces y 4 des, y eso lo repeti 4 veces, para cubrir todas las combinaciones, y la ultima columna, tiene 1 a, 1 b 1 c y 1 d, y eso lo repeti 16 veces, para cubrir las 64 combinaciones.

aaa
aab
aac
aad

aba
abb
abc
abd

aca
acb
acc
acd

ada
adb
adc
add

baa
bab
bac
bad

bba
bbb
bbc
bbd

bca
bcb
bcc
bcd

bda
bdb
bdc
bdd

caa
cab
cac
cad

cba
cbb
cbc
cbd

cca
ccb
ccc
ccd

cda
cdb
cdc
cdd

daa
dab
dac
dad

dba
dbb
dbc
dbd

dca
dcb
dcc
dcd

dda
ddb
ddc
ddd

Mira como se forma el conjunto, analizalo, el problema es sencillo y no te recomiendo en lo mas minimo, una funcion recursiva, porque si de por si el tiempo de ejecucion de tu programa va a ser alto, con una funcion recursiva, lo unico que conseguiras es que se te trabe el programa. Suerte!

Por cierto, la palabra "hola" aparecera mas o menos por la posicion:

151 061

Resultado de la suma de
140 608 + 10 140 + 312 + 1

me pude haber equivocado... lo hice al tanteo,
pero si mis calculos son correctos, en la primer columna en el renglón 140608 aparece la primera h, en la segunda columna, en la posicion 10140 aparece la primera o, asi que de la primera h, solo tienes que bajar 10140 renglones para ver la o. y 312 mas para ver una l, y un renglon mas para ver la a, formando la palabra hola.

aun asi, checalo, ya escribi un programa que te genera todas las combinaciones de letras posibles, con un universo variable.

permutacion.exe abcd 4 baba

donde el primer argumento es el universo, 4 la longitud de tus caracteres y baba el string a buscar, el output, es el indice de la palabra.
 
Volver
Arriba