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.

¿Cómo puedo unir dos listas en menos de O(N*M)?

Supongamos que tenemos dos tablas (pensar como en tablas SQL), donde la clave primaria en una de ellas es la clave externa en la otra. Se supone que debo escribir un algoritmo simple que imite la combinación de estas dos tablas. Pensé en iterar sobre cada elemento en la columna de la clave primaria en la primera tabla, teniendo un segundo bucle donde verifica si la clave externa coincide, luego almacenarlo en un arreglo o lista externa. Sin embargo, esto tomaría O(N*M) y necesito encontrar algo mejor. Hay una pista en el libro de texto que involucra el hash, sin embargo, no estoy seguro de cómo se podría implementar el hash aquí o cómo mejoraría la situación.

Editar para agregar un ejemplo:

Tabla Empleados

ID (Clave Primaria) Nombre Departamento
1 Jack IT
2 Amy Finanzas

Tabla Transacciones

Producto Vendido Vendido Por (Clave Externa) Vendido a
TV 1 Mary
Radio 1 Bob
Teléfono 2 Lisa

Lo que quiero hacer es escribir un algoritmo que combine estas dos tablas usando el hashing, y no algo complejo, solo una idea simple de cómo hacerlo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Algoritmo para unir dos tablas usando Hashing

    Para mejorar el rendimiento de la unión de dos tablas con una relación de clave primaria y clave externa, podemos usar hashing. Aquí tienes un algoritmo simple para lograrlo:

    1. Crea una tabla hash vacía con la clave externa como clave y la fila correspondiente en la segunda tabla como valor.
    2. Itera a través de la columna de clave primaria en la primera tabla.

    3. Para cada valor, verifica si existe en la tabla hash.

    4. Si existe, recupera la fila correspondiente de la segunda tabla y añádela al resultado de la unión.

    5. Si no existe, continúa con el siguiente valor.

    6. Una vez que se hayan verificado todos los valores, el resultado de la unión contendrá todas las filas de ambas tablas que tengan claves primarias y claves externas coincidentes.

    El uso de una tabla hash reduce la complejidad temporal a O(N + M) ya que solo necesitamos iterar una vez por cada tabla para construir la tabla hash y realizar la operación de unión. Esto es significativamente más rápido que el enfoque O(N*M) sugerido en la pregunta.

    Aquí tienes una implementación del algoritmo para las tablas de ejemplo proporcionadas:

    HashMap<integer, string[]=""> tablaHash = new HashMap<integer, string[]="">();
    String[] fila;
    for(int i = 0; i < tabla2.length; i++){ //iterar a través de las filas en la tabla 2
        fila = tabla2[i];
        tablaHash.put(Integer.parseInt(fila[1]), fila); //agregar fila a la tabla hash con la clave externa como clave
    }
    List<string[]> resultadoUnion = new ArrayList<string[]>();
    for(int i = 0; i < tabla1.length; i++){ //iterar a través de las filas en la tabla 1
        fila = tabla1[i];
        int claveExterna = Integer.parseInt(fila[0]);
        if(tablaHash.containsKey(claveExterna)){ //si la clave externa existe en la tabla hash
            String[] filaUnion = new String[5];
            String[] filaTabla2 = tablaHash.get(claveExterna);
            //agregar columnas de ambas tablas a la fila de unión
            filaUnion[0] = filaTabla2[0];
            filaUnion[1] = filaTabla2[1];
            filaUnion[2] = filaTabla2[2];
            filaUnion[3] = fila[1];
            filaUnion[4] = fila[2];
            resultadoUnion.add(filaUnion);
        }
    }
    

    Esta implementación asume que las tablas están representadas como arreglos de cadenas, donde cada cadena representa una fila y los valores en cada fila están separados por un delimitador (por ejemplo, una coma). El resultado de la unión se almacena en una lista de arreglos de cadenas, donde cada arreglo de cadenas representa una fila en la tabla unida.</string[]></string[]></integer,></integer,>

Comments are closed.