Foros del Web » Programación para mayores de 30 ;) » Programación General »

Optimizar búsqueda de cadena.

Estas en el tema de Optimizar búsqueda de cadena. en el foro de Programación General en Foros del Web. Me refiero a este código: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código AS de Macromedia Flash 5: Ver original // Elms_candidatos: Desde A, +1. E = "A"; // Otros ...
  #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.
  #2 (permalink)  
Antiguo 23/11/2015, 14:31
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 9 años, 10 meses
Puntos: 52
Respuesta: Optimizar búsqueda de cadena.

Cita:
Iniciado por Tachikomaia Ver Mensaje
¿Cómo optimizar el código?
http://stackoverflow.com/questions/3...ns-of-a-string

Si querés "optimizar", yo te diría que empieces por usar una plataforma de software seria que permita procesamiento paralelo.

https://es.wikipedia.org/wiki/Algoritmo_paralelo

http://stackoverflow.com/a/10811309
  #3 (permalink)  
Antiguo 24/11/2015, 12:26
Tachikomaia
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Optimizar búsqueda de cadena.

"Si no puedes hacerlo, haz algo más simple primero". Siguiendo eso hice este código:
Código a:
Ver original
  1. E = "0";
  2. // Otros elms:
  3. Char0ID = 0;
  4. Char1ID = 0;
  5. CursorMaxPos = 0;
  6.  
  7. // Anali:
  8. if (E == "33") {
  9.     Resp = "Un elemento que cumple la condición es el "+E+"\n"+Resp;
  10.     stop ();
  11. }
  12.  
  13. Resp = "El elemento "+E+" no cumple la condición.\n"+Resp;
  14. Cursor = 0;
  15.  
  16. Char0ID = Char0ID+1;
  17. if (Char0ID<10) {
  18.     E = String(Char0ID);
  19.     if (Cursor<CursorMaxPos) {
  20.         Cursor = Cursor+1;
  21.         E = Char1ID+E;
  22.     }
  23. } else {
  24.     Char0ID = 0;
  25.     CursorMaxPos = CursorMaxPos+1;
  26.     E = String(Char0ID);
  27.     Char1ID = Char1ID+1;
  28.     if (Char1ID<10) {
  29.         E = Char1ID+E;
  30.     } else {
  31.         Resp = "No es posible cumplir la condición.\n"+Resp;
  32.         stop ();
  33.     }
  34. }
  35.  
  36. gotoAndPlay (2);
Proximamente intentaré que no tenga el límite de 2 dígitos, es decir, este produce desde "0" hasta "99" nada más. Conste: No fue mi intención que generara números, sino sería mucho más fácil:
Código a:
Ver original
  1. E = 0;
  2. // Otros elms:
  3. Resp = "";
  4.  
  5. // Anali:
  6. if (E > 10) {
  7.     Resp = "Un elemento que cumple la condición es el "+E+"\n"+Resp;
  8.     stop ();
  9. }
  10.  
  11. Resp = "El elemento "+E+" no cumple la condición.\n"+Resp;
  12. E = E+1;
  13. gotoAndPlay (2);
aunque también mucho más diferente de lo que quiero hacer. La idea es hacerlo con caracteres que no sean número. Usé números pero como si no lo fuesen. Porque así me resulta más fácil entender y aplicarlo (no tengo que usar la variable Data ni las funciones charat, etc), puede sonar contradictorio, pero bueno, lo que quería practicar y conscientizar más era el tema de los cursores. De hecho, acá no se usan o podrían no usarse, pero los puse precisamente para ver más o menos cómo. Cuando luego intente que no haya límites, tendré que usarlos.

Edit un día después:
He estado acomodando la versión simplificada, de modo que parezca más a la original, y me he hartado; le quité el else que en la original no tenía necesidad -sólo estaba para recordarme algo- y por ahora no lo seguiré intentando optimizar. Pero la ayuda con las condiciones que dije sigue siendo bienvenida.

Última edición por Tachikomaia; 24/11/2015 a las 22:25

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:34.