elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Optimización programa básico
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Optimización programa básico  (Leído 2,511 veces)
HelThunder

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Optimización programa básico
« 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.


En línea

1mpuls0


Desconectado Desconectado

Mensajes: 1.186


Ver Perfil
Re: Optimización programa básico
« Respuesta #1 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.  


« Última modificación: 3 Septiembre 2015, 18:33 pm por 1mpuls0 » En línea

abc
HelThunder

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Optimización programa básico
« Respuesta #2 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  ;)
En línea

1mpuls0


Desconectado Desconectado

Mensajes: 1.186


Ver Perfil
Re: Optimización programa básico
« Respuesta #3 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.
En línea

abc
kaostias

Desconectado Desconectado

Mensajes: 19


Mi método da menos excepciones ergo es mejor


Ver Perfil
Re: Optimización programa básico
« Respuesta #4 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.
En línea

- ¡Éste código sin documentar es un galimatías!
- Es tuyo, de hace 3 semanas
- ¡Es una obra maestra aunque esté sin documentar! ¿Qué decías que hace?
egyware


Desconectado Desconectado

Mensajes: 526



Ver Perfil WWW
Re: Optimización programa básico
« Respuesta #5 en: 4 Noviembre 2013, 16:19 pm »

**coff** **coff*

Programación dinámica

**coff** **coff*
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda en un programa basico
Programación C/C++
JOSE23 3 3,030 Último mensaje 21 Febrero 2011, 19:32 pm
por Pirata LOL
Ayuda en un programa basico
Programación C/C++
JOSE23 2 2,372 Último mensaje 23 Febrero 2011, 06:30 am
por leogtz
Ayuda programa matematico basico!!
Programación C/C++
prometheus48 6 3,234 Último mensaje 9 Octubre 2011, 07:12 am
por rir3760
Problema con este programa básico
Programación C/C++
Manimecker 3 2,112 Último mensaje 22 Octubre 2011, 01:41 am
por rir3760
Duda programa básico c++
Programación C/C++
thealberteitor 6 2,305 Último mensaje 10 Agosto 2016, 18:29 pm
por thealberteitor
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines