Advertisement
jtentor

Ejemplo de Análisis de Algoritmos

Aug 31st, 2020
2,057
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.82 KB | None | 0 0
  1. //
  2.  
  3. import java.util.PriorityQueue;
  4. import java.util.Scanner;
  5.  
  6. public class AnalisisDeAlgoritmos1 {
  7.  
  8.  
  9.     static Scanner scanner = new Scanner(System.in);
  10.  
  11.  
  12.     public static void main(String[] args) {
  13.         try
  14.         {
  15.             long n = forceReadPositiveLong();
  16.             showDivisorsData(n);
  17.             showDivisorsData_REFACTORED(n);
  18.             showDivisorsData_ORDERED(n);
  19.         }
  20.         catch (Exception e) {
  21.             System.out.println("Error al realizar los cálculos, probablemente se necesite ¡BigInteger! para este número.");
  22.         }
  23.     }
  24.  
  25.  
  26.     static long forceReadPositiveLong()
  27.     {
  28.         long n = 0;
  29.         while(true)
  30.         {
  31.             try
  32.             {
  33.                 System.out.print("Introduzca el valor de N: ");
  34.                 n = Long.parseLong(scanner.nextLine());
  35.                 if(n <= 0 )
  36.                 {
  37.                     System.out.println("El valor de N debe ser positivo.");
  38.                     continue;
  39.                 }
  40.                 return n;
  41.             }
  42.             catch(Exception ex)
  43.             {
  44.                 System.out.println("Se introdujo un número inválido, reintente.");
  45.             }
  46.         }
  47.     }
  48.  
  49.  
  50.     //region Retroalimentación
  51.     /*
  52.     showDivisorsData es una excelente solución al enunciado planteado
  53.  
  54.     Determinar cuáles y cuántos son los divisores de un número positivo (validado)
  55.     ingresado por el usuario.
  56.     Calcular el promedio de los divisores.
  57.  
  58.     Utiliza una estructura de datos PriorityQueue
  59.     es una colección ordenada de elementos almacenados en forma de secuencia (lista)
  60.     permite agregar elementos manteniendo el orden y extraer el menor de los elementos
  61.  
  62.     La complejidad de PriorityQueue en la operación agregar es O(log(n))
  63.     al incluir esa operación en un ciclo, la complejidad del médoto es O(nlog(n))
  64.  
  65.     Muestra los divisores de menor a mayor
  66.     Trata de ser eficiente, analiza los valores hasta sqrt(n)
  67.  
  68.      */
  69.     //endregion
  70.  
  71.     static void showDivisorsData(long n)
  72.     {
  73.         long startTime = System.currentTimeMillis();
  74.  
  75.         float sumDiv = 0;
  76.  
  77.         PriorityQueue<Long> divisors = new PriorityQueue<Long>();
  78.  
  79.         for(long i = 1; i*i <= n; i++)
  80.         {
  81.             if(n%i == 0)
  82.             {
  83.                 divisors.add(i);
  84.                 sumDiv+= i;
  85.  
  86.                 if(i*i == n) {
  87.                     continue;
  88.                 }
  89.  
  90.                 divisors.add(n/i);
  91.                 sumDiv+=(n/i);
  92.             }
  93.         }
  94.         System.out.println("Cantidad.: "+ divisors.size());
  95.         System.out.println("Promedio.: "+ sumDiv/divisors.size());
  96.         System.out.print("Divisores: [");
  97.         while(!divisors.isEmpty())
  98.         {
  99.             System.out.print(divisors.remove() + ((divisors.isEmpty() ? "]\n" : ",")));
  100.         }
  101.  
  102.         long elapsedTime = System.currentTimeMillis() - startTime;
  103.         System.out.println("Ejecución: " + elapsedTime + " milisegundos");
  104.     }
  105.  
  106.  
  107.     //region Retroalimentación
  108.     /*
  109.     showDivisorsData_REFACTORED es otra solución al enunciado planteado
  110.  
  111.     Determinar cuáles y cuántos son los divisores de un número positivo (validado)
  112.     ingresado por el usuario.
  113.     Calcular el promedio de los divisores.
  114.  
  115.     Se implementa un ciclo, de manera que la complejidad del método es O(n)
  116.  
  117.     Muestra los elementos en el orden en que los encuentra
  118.     Trata de ser eficiente, analiza los valores hasta sqrt(n)
  119.     La salida es desordenada
  120.  
  121.      */
  122.     //endregion
  123.  
  124.     static void showDivisorsData_REFACTORED(long n)
  125.     {
  126.         long startTime = System.currentTimeMillis();
  127.  
  128.         float sumDiv = 1L;
  129.         int countDiv = 1;
  130.         System.out.print("\n\nDivisores: [1");
  131.  
  132.         if (n > 1L) {
  133.  
  134.  
  135.             for (long i = 2; i*i <= n; i++) {
  136.                 if (n % i == 0) {
  137.                     sumDiv += i;
  138.                     countDiv++;
  139.                     System.out.print("," + i);
  140.  
  141.                     if(i*i == n) {
  142.                         continue;
  143.                     }
  144.  
  145.                     sumDiv += n/i;
  146.                     countDiv++;
  147.                     System.out.print("," + n/i);
  148.                 }
  149.             }
  150.             sumDiv += n;
  151.             countDiv++;
  152.             System.out.print("," + n +"]\n");
  153.  
  154.         }
  155.         System.out.println("Cantidad.: " + countDiv);
  156.         System.out.println("Promedio.: "+ sumDiv/countDiv);
  157.  
  158.         long elapsedTime = System.currentTimeMillis() - startTime;
  159.         System.out.println("Ejecución: " + elapsedTime + " milisegundos");
  160.     }
  161.  
  162.  
  163.     //region Retroalimentación
  164.     /*
  165.     showDivisorsData_ORDERED es otra solución al enunciado planteado
  166.  
  167.     Determinar cuáles y cuántos son los divisores de un número positivo (validado)
  168.     ingresado por el usuario.
  169.     Calcular el promedio de los divisores.
  170.  
  171.     Se implementa un ciclo, de manera que la complejidad del método es O(n)
  172.     La salida es ordenada
  173.  
  174.      */
  175.     //endregion
  176.  
  177.     static void showDivisorsData_ORDERED(long n)
  178.     {
  179.         long startTime = System.currentTimeMillis();
  180.  
  181.         float sumDiv = 1L;
  182.         int countDiv = 1;
  183.         System.out.print("\n\nDivisores: [1");
  184.  
  185.         if (n > 1L) {
  186.  
  187.             for (long i = 2; i < n; i++) {
  188.                 if (n % i == 0) {
  189.                     sumDiv += i;
  190.                     countDiv++;
  191.                     System.out.print("," + i);
  192.                 }
  193.             }
  194.             sumDiv += n;
  195.             countDiv++;
  196.             System.out.print("," + n +"]\n");
  197.  
  198.         }
  199.         System.out.println("Cantidad.: " + countDiv);
  200.         System.out.println("Promedio.: "+ sumDiv/countDiv);
  201.  
  202.         long elapsedTime = System.currentTimeMillis() - startTime;
  203.         System.out.println("Ejecución: " + elapsedTime + " milisegundos");
  204.     }
  205.  
  206. }
  207.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement