Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/11/2015, 23:51
Tachikomaia
Invitado
 
Mensajes: n/a
Puntos:
Optimizar búsqueda de cadena.

Me refiero a este código:
Código AS de Macromedia Flash 5:
Ver original
  1. // Elms_candidatos: Desde A, +1.
  2. E = "A";
  3. // Otros elms:
  4. Data = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";
  5. Char0ID = 0;
  6. CursorMaxPos = 0;
  7.  
  8. // Anali:
  9. if (E == "OK") {
  10.     Resp = "Un elemento que cumple la condición es el "+E+"\n"+Resp;
  11.     stop ();
  12. }
  13.  
  14. Resp = "El elemento "+E+" no cumple la condición.\n"+Resp;
  15. Cursor = 0;
  16. E = "";
  17.  
  18. Resu = "Char"+Cursor+"ID";
  19. EvaledResu = eval(Resu)+1;
  20. set (Resu, EvaledResu);
  21.  
  22. if (EvaledResu < 27) {
  23.     // Agrega caracter.
  24.     E = Data.charAt(EvaledResu)+E;
  25.     Cursor = Cursor+1;
  26.     if (Cursor > CursorMaxPos) {
  27.         // Todos agregados.
  28.         gotoAndPlay (2);
  29.     } else {
  30.         // Volverá a agregar.
  31.     }
  32. } else {
  33.     // El char a agregar está fuera del límite.
  34.     set (Resu, 0);
  35.     E = E+Data.charAt(0);
  36.     Cursor = Cursor+1;
  37.     if (Cursor > CursorMaxPos) {
  38.         // Hay que agregar uno.
  39.         CursorMaxPos = CursorMaxPos+1;
  40.         set ("Char"+CursorMaxPos+"ID", 0);
  41.         E = E+Data.charAt(0);
  42.         gotoAndPlay (2);
  43.     } else {
  44.         // Hay que aumentar/agregar uno.
  45.         gotoAndPlay (4);
  46.     }
  47. }
  48.  
  49. Resu = "Char"+Cursor+"ID";
  50. EvaledResu = eval(Resu);
  51. gotoAndPlay (5);

En pseudocódigo -o lo más parecido que puedo hacer a eso- sería:
Código Pseudo:
Ver original
  1. Parte 1:
  2. // Cadenas candidatas: Desde "A", +1 ("B", "C"... "Z", "AA", etc).
  3. Cadena = "A";
  4. // Otros elementos:
  5. Caracteres = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";
  6. Caracter0ID = 0;
  7. CursorMaxPos = 0;
  8.  
  9. Parte 2:
  10. // Análisis:
  11. Si la cadena es "OK", fin.
  12.  
  13. Parte 3:
  14. Cursor = 0;
  15. Cadena = "";
  16.  
  17. Parte 4:
  18. Resumen = "Caracter"+Cursor+"ID";
  19. Evaluación_del_Resumen = eval(Resumen)+1;
  20. set (Resumen, Evaluación_del_Resumen);
  21. // Las dos 1eras variables son para evitar repetir la obtención de la suma de "Caracter", Cursor e "ID", y para evitar repetir su evaluación. Si no las usara entonces tendría que hacer, con los mismos valores, las mismas sumas y evaluaciones más de una vez. No tiene sentido, es mejor hacerlo una vez, guardar el resultado y volver a usarlo mientras los valores no cambien. Eso es lo que hago.
  22.  
  23. Parte 5:
  24. Si la Evaluación_del_Resumen es menos que 27
  25.     Agrega (delante), en Cadena, el caracter Evaluación_del_Resumen de Caracteres.
  26.     Cursor = Cursor+1;
  27.     Si Cursor es mayor que CursorMaxPos, el cambio en la cadena está completo, ir a parte 2 a analizarla.
  28.     Sino, volverá a agregar, ver parte 6.
  29. Sino
  30.     // El char a agregar está fuera del límite.
  31.     set (Resumen, 0);
  32.     Cadena = Cadena+"A";
  33.     Cursor = Cursor+1;
  34.     Si Cursor es mayor que CursorMaxPos, es como si del número 9 hubiera pasado al 10, hay que agregar un caracter.
  35.         CursorMaxPos = CursorMaxPos+1;
  36.         set ("Caracter"+CursorMaxPos+"ID", 0);
  37.         Cadena = Cadena+"A";
  38.         ir a Parte 2.
  39.     Sino
  40.         // Hay que aumentar/agregar uno.
  41.         Ir a parte 4.
  42.     fin_del_si
  43. fin_del_si
  44.  
  45. Parte 6:
  46. Resumen = "Caracter"+Cursor+"ID";
  47. Evaluación_del_Resumen = eval(Resumen);
  48. ir al la parte 5.

¿Cómo optimizar el código?
Conste que tengo un criterio especial:
- No usar arrays, do while, for y similares.
- No crear una función por algo que sólo se aplique en una parte del código.
- Si else se puede evitar con un goto, usar goto.
- Si un montón de ifs se pueden evitar con eval, usar eval.
- Goto y eval no son problema, pero evitarlos de ser posible.
...en cuanto a funciones que se llamen recursivamente, no sé, tendría que ver, pero supongo que prefiero goto.

Una de las cosas que me parecen QUIZÁ mejorables es que E (o Cadena) en la parte 3 inicia como "" cuando es sabido que debería iniciar como Char0ID. Uno de los problemas es que Char0ID podría tener que cambiar ANTES, si es 27 o más. Con eso podría suponer que un
if (EvaledResu < 27) {
o
if (Char0ID < 27) {
...es necesario en la parte 3. ¿Pero un if es realmente mejor que definir vacía a una variable? No creo, pero habría que seguir viendo qué más hay.

Otra cosa, en la parte 3, es que
set (Resu, EvaledResu);
...aparentemente conviene ponerlo dentro del 1er if de la parte 4. Porque ahí hay un else con
set (Resu, 0);
...o sea, si queda antes del if entonces puede que se defina la variable y luego se reseté, por lo cual convendría no haberla definido; no se usa para hacer el if así que puede definirse después, momento en que se sabe que no se reseteará. Esto ya lo probé y funciona, es un comentario/ejemplo más para que entiendan qué estoy pidiendo.


En fin, hay más, pero no lo logro entender bien ahora.

Gracias.