Ingresar:

Concurso programacion :: Blog :: El ejercicio de las raices cuadradas

March 06, 2007

Bueno aqui posteo la solución del ejercicio de las raices cuadradas, no es tan eficiente pero fue aceptado en el juez tarda mas o menos 1.2 segundos, se puede mejorar bastante a momento de leer los datos, creo se pude utilizar una arreglo de chars, pero bueno ... se debe codificar un poco más ... tengo 8 versiones ... las primeras fuerón rechazadas por limite de tiempo, pero esta versión es bastante aceptable ...

/**    Clase ReverseRoot8.java  *  Autor Wilfredo Vargas Almendras  *  Fecha 02/03/2007  *  Hora 07:13:04 PM  *  Proyecto Yachay Wasej Punkun  *  */ import java.text.DecimalFormat; import java.util.HashMap; import java.util.Scanner;   public class ReverseRoot8 {         static HashMap<Long,String> raices = new HashMap<Long, String>();     static long[] numeros = new long[262144];         static Scanner lector = new Scanner(System.in);         static DecimalFormat formateador = new DecimalFormat("####.####");         public static void main(String[] args) {                 long sig;         int contador = 0;         while( lector.hasNext()){             sig = lector.nextLong();             numeros[contador++] = sig;         }                 StringBuffer res = new StringBuffer(contador);                 for (int i = contador-1; i >= 0; i--)             res.append( siguienteRaiz( numeros[i] )+"\n");                 System.out.println(res);             }               private static String siguienteRaiz(Long indice) {         String res="";                 res = raices.get(indice);                 if( res == null ){             res = calcularRaiz(indice);             raices.put(indice, res);         }                 return res;     }       private static String calcularRaiz(Long indice) {         String res;                 long raiz = (long)(Math.sqrt(indice)*100000);                 if( raiz/100000.0 == raiz/100000 )             res = raiz/100000+".0000";         else             res = ""+formateador.format(raiz/100000.0+0.00005);                         return res;     }     }  

Ahora un problema interesante, se trata de un arbol genealógico, creo la solución más sencilla seria armando todo el "arbol" (grafo), pero creo se puede hacer de alguna otra forma más eficiente. Espero opiniones y otras soluciones :). Tanto de las raices como este del árbol genealógico.. Si pueden mejorar mi código... posteenlo, sera bueno tener alguna versión bastante optima.. :)

Enviado por Wilfredo Vargas Almendras @ Concurso programacion



Comentarios

  1. Acá hay métodos para sacar raíces por aproximación, pero creo que no es necesario para este problema: http://en.wikipedia.org/wiki/Methods_of_computing_square_roots

    En python:

     #!/usr/bin/env python   import sys from math import sqrt   data = []                   # empty data   for line in sys.stdin:     data = data + line.split()   # add elements to data   # use list generators #print [ sqrt(float(n)) for n in reversed(data) ]   for n in reversed(data):     print '%.4f' % sqrt(float(n))  

    Con un input de 10000 números  1000000000000000000, osea 200Kbytes:

    rolando@boo:~$ time cat 1001.test.2 |python 1001.reverse-root.py  > /dev/null
     
    real    0m1.310s
    user    0m1.252s
    sys     0m0.020s
     

    user iconRho on Tuesday, 06 March 2007, 14:48 BOT # |

  2. Por experiencia se que al hacer varios print (al menos en PERL, parecido a python). Tarda mucho mas que concatenar la respuesta y luego imprimir la salida todo en uno :). Una ventaja que veo en el lenguaje tanto como de python, C, C++, sobre JAVA, es sencillo formatear la salida. Solo como sugerencia... si la entrada fuese:
    1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 ....
    cada vez estarias calculando la raiz de 1000, eso me parece innecesario hacer tal tarea, mas bien se deberia reutilizar lo que ya se ha calculado. No se si python almacena los resultados ya calculados (sacame de dudas), algo asi como en haskell (almacenando en celdas). Pero bueno ... la solucion simple sirve ... la cosa seria implementarlo en un lenguaje que se pueda enviar al juez y probar si acepta :)

    user iconWilfredo Vargas on Tuesday, 06 March 2007, 17:57 BOT # |

  3. Que tal Wilfredo,

    tengo una consulta respecto al problema de reverseRoot,

    ¿como controlo "A size of the input stream does not exceed 256 KB"? 

    Existe alguna forma de controlar que el tamaño del stream no exceda a 256 KB,

    tal parece que tu codigo no controla esto, o ¿como lo interpretaste tu? 

     

     

    user iconCarliros on Monday, 17 March 2008, 13:51 BOT # |

  4. Hola, que bueno que estes resolviendo ejecicios. Bueno, lo que dice es: "A size of the input stream does not exceed 256 KB" Es una afirmación, por lo que te da una idea del tamaño de la entrada, para ello utilice el arreglo: static long[] numeros = new long[262144], por que? bueno cada numero en texto plano ocupa un byte (considerando a un número de un dígito). Entonces 256Kb * 1024 bytes/1 Kb = 262144 --> este seria el peor de los casos, es decir los números de un dígito, separados por un enter o por un espacio (quizás en mi solución falta considerar los enter y los espacios que puedan existir). Pero le pongo como cota superior a ese valor. También quizás seria bueno poner en la condición: while( lector.hasNext() && contador

    user iconWilfredo Vargas Almendras on Monday, 17 March 2008, 16:04 BOT # |

  5. Buen punto de vista wilfredo.

     

    Proximamente estare colocando mas ejercicios, pues ya que se hacerca el concurso. Wilfredo no te olvides de revizar este post.

    user iconCarliros on Monday, 24 March 2008, 10:26 BOT # |

  6. hola me puel explicar del tema de la raices cuadradas por EJEPLO:nose nadas de matematicas ok bay

    maria martinez on Tuesday, 13 May 2008, 01:14 BOT # |

  7. puras mentiras que dcen yo se mas las matematicas esos son falsos los estan engajando

    cristian on Tuesday, 13 May 2008, 01:18 BOT # |

  8. OLA BUSCO AMIGOS LISTO PARA Q ME AYUDEN EM IMGLES

    Invitado on Thursday, 22 January 2009, 15:05 BOT # |

  9. !hola!nesecito k m ayuden a resolver raices cuadradas

    jessie on Thursday, 02 April 2009, 21:56 BOT # |

  10. Sera bueno conocer que informacion tienes y el avance al respecto.

    Invitado on Monday, 06 April 2009, 14:59 BOT # |

  11. hola soy laura quiero mandarles besos a todos el ecuedor que me ve en television

    laura on Tuesday, 26 May 2009, 20:20 BOT # |

  12. hola soy genesis the  quisiera que pongan  raises por que tengo que hacer bastantes y po eso los nesecito

    genesis on Tuesday, 26 May 2009, 20:24 BOT # |

  13. hola seria bueno q pusieran raices cuadradas con procedimiento por q necesito saber como hacerlas...

    Invitado on Tuesday, 30 June 2009, 17:47 BOT # |

Añadir un comentario

Tu texto de comentario

Tu nombre

Por favor ingresa el código de la imagen

Security Code