Ahora tomar cada palabra, ordenarla alfabeticamente, y checar cuantas veces aparece en el arreglo, despues añadir las veces que aparece esa palabra.
entonces por ejemplo si tenemos http://pagina.unam.mx/cyp
la primera palabra seria
http://pagina 1
unam 1
mx/cpy 1
La primera es la palabra y la segunda las veces que aparece, pero cuando hablamos de mas de 100 000 palabras en el .txt el codigo se torna muy lento y se tarda aprox 5 min en arrojar resultados, alguien me podria ayudar a optimizarlo?
Código:
void Diccionario(char *szNombre, char szPalabras[][TAMTOKEN], int iEstadisticas[], int &iNumElementos) { //char szNombre[50]; //printf("Dame el nombre del archivo"); //scanf_s("%s", szNombre, 49); FILE *libro; fopen_s(&libro, szNombre, "r"); char palabra[TAMTOKEN]; char *palabra1; char szPalabras1[NUMPALABRAS][TAMTOKEN]; int estad[NUMPALABRAS]; char *next = NULL; int i, j, k, conta = 0; int numpala; int mayor[NUMPALABRAS]; char aux[100]; if (libro == NULL) { printf("No se pudo abrir el archivo"); } else { i = 0; while (!feof(libro)) { fscanf_s(libro, "%s", palabra, 49); _strlwr_s(palabra); palabra1 = strtok_s(palabra, " ;,.)(", &next); while (palabra1 != NULL) { //printf("%s\n", palabra1); strcpy_s(szPalabras1[i], palabra1); palabra1 = strtok_s(NULL, " ;,.)(", &next); i++; } //strcpy_s(diccionario[i], palabra1); //printf("%s\n", diccionario[i]); //i++; } numpala = i; // ORDENAR CADENAS for (i = 0; i < numpala -1 ; i++) { k = i; strcpy_s(aux, szPalabras1[i]); for (j = i + 1; j < numpala; j++) { if (strcmp(szPalabras1[j], aux) < 0) { k = j; strcpy_s(aux, szPalabras1[j]); //permite hacer una copia auxiliar de la cadena szPalabras[j]; } } strcpy_s(szPalabras1[k], szPalabras1[i]); strcpy_s(szPalabras1[i], aux); } for (i = 0; i < numpala; i++) { //printf("%s\n", diccionario[i]); } } //ordenamos por estadisticas. for (i = 0; i < numpala; i++) { estad[i] = 0; for (j = 0; j < numpala; j++) { if (strcmp(szPalabras1[i], szPalabras1[j]) == 0) { estad[i]++; } } } i = 0; while (i < numpala) { if (estad[i] != 1) { //printf("La palabra %s se repite %i veces\n", diccionario[i], esta[i]); } else { //printf("La palabra %s solo se encuentra una vez\n", diccionario[i]); } i = i + estad[i]; } iNumElementos = 0; for (i = 0; i < numpala; i++) { if (strcmp(szPalabras1[i], szPalabras1[i + 1]) != 0) { iNumElementos++; } } //printf("%i\n", iNumElementos); i = 0; while (i < numpala) { mayor[i] = 0; if (estad[i] != 1) { for (j = i; j < i + estad[i]; j++) { if (estad[j] >= mayor[i]) { mayor[i] = estad[j]; } else { mayor[i] = mayor[i]; } } } else { mayor[i] = estad[i]; } //imprimimos diccionario //printf("%s %i\n", szPalabras[i], mayor[i]); strcpy_s(szPalabras[conta], szPalabras1[i]); iEstadisticas[conta] = mayor[i]; conta++; i = i + estad[i]; } fclose(libro); }