Foro de elhacker.net

Programación => Java => Mensaje iniciado por: HelThunder en 23 Octubre 2013, 19:05 pm



Título: Optimización programa básico
Publicado por: HelThunder en 23 Octubre 2013, 19:05 pm
   public static int numeroDivisores(int n){
      int n =0 ;
      for (int i=1;i<=n;++i){
         if (n%i==0){
            ++n;
         }
      }
      return n;
   }

He hecho ese método para hallar el número de divisores de un número. Pero necesita hacerlo de alguna forma mejor que lleve menos tiempo para compilar. Ya que invoco muchas veces este método en otro método y con cifras grandes tarda mucho tiempo.

¿Alguien sabria alguna forma de optimizar este metodo?

Un saludo, gracias.


Título: Re: Optimización programa básico
Publicado por: 1mpuls0 en 23 Octubre 2013, 20:32 pm
Código
  1. /*Autor: 1mpuls0*/
  2.  
  3. public class NumberOfDivisors {
  4.  
  5.    public static void main(String args[]){
  6.        long start = 0;
  7.        long end = 0;
  8.        int number = 420;
  9.  
  10.        start = System.nanoTime();
  11.        System.out.println("Number of divisors " + number + ": " + countDivisors(number ));
  12.        end = System.nanoTime();
  13.        System.out.println("Execution time was " +(end-start)+" ns");
  14.  
  15.  
  16.        start = System.nanoTime();
  17.        System.out.println("Number of divisors " + number + ": " + countDivisors2(number ));
  18.        end = System.nanoTime();
  19.        System.out.println("Execution time was "+(end-start)+" ns");
  20.  
  21.    }
  22.  
  23.    public static int countDivisors(int number){
  24.        int count = 0 ;
  25.  
  26.        for (int index = 1; index<=number; ++index){
  27.            if (number%index==0){
  28.                ++count;
  29.            }
  30.        }
  31.        return count;
  32.    }
  33.  
  34.    public static int countDivisors2(int number) {
  35.        int index = 1;
  36.        int count = 0 ;
  37.  
  38.        int div_2 = (int)Math.sqrt(number) + 1;
  39.        while(index < div_2){
  40.            if(number % index ==  0 ){
  41.                count++;
  42.            }
  43.            index++;
  44.        }
  45.  
  46.        if(count > 1){
  47.            while(number >= index){
  48.                if(number % index ==  0){
  49.                    count++;
  50.                }
  51.                index++;
  52.            }
  53.        }
  54.  
  55.        return count;
  56.    }
  57. }
  58.  


Título: Re: Optimización programa básico
Publicado por: HelThunder en 23 Octubre 2013, 22:40 pm
Muchísimas gracias Darhius, pero el nuevo método no me mejora el problema, me explico. Por lo que entiendo, tu codigo reduce el tiempo ya que descarta los numeros con pocos divisores ahorrando operaciones. Lo que pasa, es que en el programa en que utilizo este método, tengo que ir mirando los divisores de millones de numeros, y todos ellos son muy grandes, por lo que la condición que has puesto, tan apenas quita procesos.

Incluso tarda más el programa en ejecutarse.

Los tiempos de ejecución han sido los siguientes;

Aclaro que me refiero a la ejecución del programa completo, que invoca a este método y a otro.

NúmerocountDivisors countDivisors 2
6513 80052
125285160592 376253252
20013414467371 14718342716


No acabo de entender a que se debe esto siendo que independentientes, el 2º es más rapido.

Muchas gracias  ;)


Título: Re: Optimización programa básico
Publicado por: 1mpuls0 en 23 Octubre 2013, 23:19 pm
Me imaginé que no solo era para contar los divisores.
Seguiré analizando una alternativa para ver que se puede hacer.

Saludos.


Título: Re: Optimización programa básico
Publicado por: kaostias en 24 Octubre 2013, 18:35 pm
Si los números que utilizas pueden repetirse y tienen alta tendencia a hacerlo, puedes crear una tabla hash que vaya guardando los resultados para cada número, la primera vez que lo ejecutes siempre hará el cálculo, pero a partir de ahí el acceso tiene coste constante.


Título: Re: Optimización programa básico
Publicado por: egyware en 4 Noviembre 2013, 16:19 pm
**coff** **coff*

Programación dinámica (http://es.wikipedia.org/wiki/Programaci%C3%B3n_din%C3%A1mica)

**coff** **coff*