Ver Mensaje Individual
  #5 (permalink)  
Antiguo 25/11/2016, 02:05
aguml
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 9 meses
Puntos: 3
Respuesta: Optimizar un codigo

Haces cosas muy poco eficientes. Por ejemplo usas la variable i para contar el número de palabras y luego asignas el resultado a otra variable la cual su función es almacenar el número de palabras ¿por qué no usar esa variable para contar las palabras? Así te ahorras asignaciones, que no es que se vaya a notar mucho pero es absurdo hacer lo que haces.
Luego el método de ordenación de burbuja es poco eficiente y si encima usas funciones de cadenas la cosa empeora pero si encima usas más funciones y asignaciones de las necesarias ya no hablemos. Prueba con esta modificacion:
Código PHP:
// ORDENAR CADENAS
        
for (0numpala -i++)
        {
            for (
1numpalaj++)
            {
                if (
strcmp(szPalabras1[j], szPalabras1[i]) < 0)
                {
                    
strcpy_s(auxszPalabras1[j]);
                    
strcpy_s(szPalabras1[j], szPalabras1[i]);
                    
strcpy_s(szPalabras[i], aux);
                }
            }
        } 
Prueba lo y veras que mejora los tiempos simplemente por haber eliminado varias copias innecesarias. Si además usas punteros para ordenar en vez de estar copiando cadenas la cosa mejora mucho más y si cambias el método de ordenación ya sería la leche jajaja.
La parte con la que obtienes las palabras podría quedar asi para trabajar con punteros:
Código C:
Ver original
  1. char **szPalabras1;
  2. ...
  3. ...
  4. ...
  5.       szPalabras1 = (char**) malloc(sizeof(char*) * NUMPALABRAS);
  6.       i = 0;
  7.       while (!feof(libro))
  8.         {
  9.             fscanf_s(libro, "%s", palabra, 49);
  10.             _strlwr_s(palabra);
  11.             palabra1 = strtok_s(palabra, " ;,.)(", &next);
  12.             while (palabra1 != NULL)
  13.             {
  14.                 szPalabras1[i] = palabra1;
  15.                 palabra1 = strtok_s(NULL, " ;,.)(", &next);
  16.                 i++;
  17.             }
  18.         }
Con eso en vez de tener un array de cadenas tendrías un array de punteros a cadenas con lo que no necesitas la función strcpy para intercambiarlos y puedes hacerlo con el operador de asignación.

Código PHP:
// ORDENAR CADENAS
      
char *aux;
        for (
0numpala -i++)
        {
            for (
1numpalaj++)
            {
                if (
strcmp(szPalabras1[j], szPalabras1[i]) < 0)
                {
                    
aux szPalabras1[j];
                    
szPalabras1[j] = szPalabras1[i];
                    
szPalabras[i] = aux;
                }
            }
        } 
Lo único que al final te tienes que asegurar de liberar la memoria.
Código C:
Ver original
  1. free(szPalabras1);

Última edición por aguml; 25/11/2016 a las 02:47