es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Programa que dado una lista de longitud n encuentra todas las ternas i, j y k con i <= j tal que a[i] * a[j] = a[k]

Estoy tratando de averiguar cómo puedo escribir un programa de manera que una lista de longitud n encuentre todas las tripletas i, j y k con i <= j tal que a[i] * a[j] = a[k] y devuelva la cantidad de veces que esto ocurre. La solución obvia es un triple bucle que tiene un tiempo de ejecución de O(n^3) de la siguiente manera.

public static int count(int[] a) {
    int total = 0;
    for (int i = 0; i < a.length; i++) {
        for (int j = 0; j < a.length; j++) {
            if (a[i] <= a[j]) {
                for (int k = 0; k < a.length; k++) {
                    if (a[i] * a[j] == a[k])
                        total++;
                }
            }
        }
    }
    return total;
}

Pero se me ocurrió una forma más rápida utilizando hashsets de esta manera.

public static int count(int[] a) { // O(n^2)
    int total = 0;
    Set<integer> set = new HashSet<>();
    for (int i : a) { // O(n)
        set.add(i); // O(1)
    }
    for (int i : a) { // O(n^2)
        for (int j : a) {
            if (i <= j) {
                if (set.contains(i * j)) // O(1)
                    total++;
            }
        }
    }
    return total;
}

Esta tiene un tiempo de ejecución de O(n^2). ¿Es posible hacerlo más rápido que esto?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Java y Big-O, puedo confirmar que el tiempo de ejecución de la segunda solución utilizando hashsets es realmente O(n^2). Es poco probable obtener un tiempo de ejecución más rápido que este, ya que necesitamos recorrer la lista al menos una vez para crear el hashset, lo que lleva tiempo O(n). Los bucles anidados con la operación set.contains() también llevan tiempo O(n^2). Por lo tanto, esta solución es óptima en términos de complejidad temporal. Sin embargo, si el uso de memoria es una preocupación, es posible que queramos considerar otros enfoques que utilicen menos memoria que un hashset, pero podrían tener tiempos de ejecución más largos.

Comments are closed.