Dadas 2 matrices ordenadas de enteros, ¿cómo se combinan en 1 matriz para que no haya duplicados y esté en orden ascendente?

Un algoritmo para fusionar dos matrices ordenadas, eliminando duplicados y suponiendo que cada matriz puede incluir ejecuciones de duplicados, y suponiendo que las matrices no necesitan tener la misma longitud, y asumiendo que cualquiera de las matrices de entrada podría estar vacía, es así:

  1. Haga una nueva matriz lo suficientemente grande como para contener todo
  2. Señale el inicio de la nueva matriz.
  3. Señale el inicio de cada matriz de entrada
  4. Si al final de al menos una matriz de entrada, vaya al paso 9
  5. Compare los valores en la ubicación apuntada a cada matriz de entrada
  6. Agregue el más pequeño o igual a la nueva matriz y avance ese puntero de entrada
  7. Si bien el puntero de la matriz de entrada es válido y apunta a un valor igual al que acaba de copiar en la nueva matriz, avance el puntero de esa matriz de entrada
  8. Si no está al final de al menos una matriz de entrada, vaya al paso 4
  9. Usando cualquier matriz de entrada, si la hay, no está al final de:
  10. … Si la matriz de salida no está vacía: mientras el puntero de entrada apunta a un valor igual al que acaba de copiarse a la nueva matriz, avance el puntero de esa matriz de entrada
  11. … Si no está al final de la matriz de entrada, agregue el valor en la ubicación apuntada a la matriz de salida, avance el puntero de esa matriz de entrada y vaya al paso 10
  12. Está al final de ambas matrices de entrada y ha terminado de fusionar y eliminar duplicados; Es posible que tenga celdas no utilizadas al final de la nueva matriz, pero ya sabe cuántas celdas utilizó. Si lo desea, puede copiar a otra nueva matriz de exactamente el tamaño correcto y deshacerse de la de gran tamaño.

Probémoslo:

Paso 1, Paso 2, Paso 3 …

INA: | 1 | 2 | 2 | 36 100 |
^
INB: | 1 | 1 | 5 | 100 | 100 | 1000 | 1000 |
^
NUEVO: | El | El | El | El | El | El | El | El | El | El | El | El |
^

Paso 4, Paso 5, Paso 6 …

INA: | 1 | 2 | 2 | 36 100 |
^
INB: | 1 | 1 | 5 | 100 | 100 | 1000 | 1000 |
^
NUEVO: | 1 | El | El | El | El | El | El | El | El | El | El | El |
^

Paso 7 …

INA: | 1 | 2 | 2 | 36 100
^
INB: | 1 | 1 | 5 | 100 100 | 1000 | 1000 |
^
NUEVO: | 1 | El | El | El | El | El | El | El | El | El | El | El |
^

Paso 8, Paso 4, Paso 5, Paso 6 …

INA: | 1 | 2 | 2 | 36 100 |
^
INB: | 1 | 1 | 5 | 100 | 100 | 1000 | 1000 |
^
NUEVO: | 1 | 2 | El | El | El | El | El | El | El | El | El | El |
^

Paso 7 …

INA: | 1 | 2 | 2 | 36 100 |
^
INB: | 1 | 1 | 5 | 100 | 100 | 1000 | 1000 |
^
NUEVO: | 1 | 2 | El | El | El | El | El | El | El | El | El | El |
^

Paso 8, Paso 4, Paso 5, Paso 6, Paso 7 …

INA: | 1 | 2 | 2 | 36 100
^
INB: | 1 | 1 | 5 | 100 100 | 1000 | 1000 |
^
NUEVO: | 1 | 2 | 5 | El | El | El | El | El | El | El | El | El |
^

Paso 8, Paso 4, Paso 5, Paso 6, Paso 7 …

INA: | 1 | 2 | 2 | 36 100
^
INB: | 1 | 1 | 5 | 100 100 | 1000 | 1000 |
^
NUEVO: | 1 | 2 | 5 | 36 El | El | El | El | El | El | El | El |
^

Paso 8, Paso 4, Paso 5, Paso 6 …

INA: | 1 | 2 | 2 | 36 100
^
INB: | 1 | 1 | 5 | 100 100 | 1000 | 1000 |
^
NUEVO: | 1 | 2 | 5 | 36 100 | El | El | El | El | El | El | El |
^

Paso 7 …

INA: | 1 | 2 | 2 | 36 100 |
^
INB: | 1 | 1 | 5 | 100 100 | 1000 | 1000 |
^
NUEVO: | 1 | 2 | 5 | 36 100 El | El | El | El | El | El | El |
^

Paso 8, Paso 4, Paso 9, Paso 10, Paso 11 …

INA: | 1 | 2 | 2 | 36 100 |
^
INB: | 1 | 1 | 5 | 100 | 100 | 1000 | 1000 |
^
NUEVO: | 1 | 2 | 5 | 36 100 | 1000 | El | El | El | El | El | El |
^

Paso 10, Paso 11, Paso 12 …

INA: | 1 | 2 | 2 | 36 100 |
^
INB: | 1 | 1 | 5 | 100 | 100 | 1000 | 1000 |
^
NUEVO: | 1 | 2 | 5 | 36 100 | 1000 | El | El | El | El | El | El |
^

Hecho.

Este problema es una réplica exacta de la función Merge en MergeSort, dejando de lado el hecho de que no necesita duplicados. Veamos el pseudocódigo de este problema:

fusionar (a [], b [])
n = a.length + b.length
deja que c [n] sea una nueva matriz
i = 0
j = 0
mientras que i si a [i] c [k] = a [i]
i = i + 1
más
c [k] = b [j]
j = j + 1
mientras yo c [k] = a [i]
k = k + 1
i = i + 1
mientras j c [k] = b [j]
k = k + 1
j = j + 1

Ahora, tenemos una matriz c , que está ordenada. Todo lo que tenemos que hacer ahora es eliminar los duplicados. Esto es bastante simple si usa un conjunto. Un conjunto es una colección que no contiene duplicados. Por ejemplo, en Java podemos hacer

int end = c.length;
Set set = new HashSet ();
for (int i = 0; i set.add (arr [i]);

}

Si su idioma no tiene una implementación predeterminada del Conjunto, puede hacerlo manualmente. Aquí está cómo hacerlo

en = c [0]
dejar que [c.length] sea nueva matriz
j = 0
encontrado = falso
para i = 0 a c.length-1
si en == c [i] y! encontrado
encontrado = verdadero
más si en! = c [i]
fuera [j] = en
j = j + 1
en = c [i]
encontrado = falso
fuera [j] = en

Ahora la matriz está ordenada y no tiene duplicados. Sin embargo, puede contener ceros al final, pero eso es fácil de solucionar.

Complejidad de tiempo: O (n) , donde n es la suma de las longitudes de las 2 matrices

Aquí hay una implementación Java de este programa.

Supongo que este código JAVA será suficiente para que entiendas el algoritmo. Además, con ligeras modificaciones, este código se puede convertir fácilmente en otros lenguajes de programación como C, C ++, Python, etc.

public static int [] mergeArray (int [] a, int [] b) {

int indexA = 0, indexB = 0;

int [] rv = new int [a.length + b.length];

int indexRV = 0;

while (indexA

if (a [indexA]

rv [indexRV] = a [indexA];
indexA ++;
indexRV ++;

} más {

rv [indexRV] = b [indexB];
indexB ++;
indexRV ++;
}
}

if (indexA! = a.length) {

while (indexA

rv [indexRV] = a [indexA];
indexA ++;
indexRV ++;

}
}

if (indexB! = b.length) {

while (indexB

rv [indexRV] = b [indexB];
indexB ++;
indexRV ++;
}
}
volver rv;
}

PD: siéntase libre de comentar, si tiene algún problema para comprender, alguna parte del código.

El libro de Introducción a los algoritmos (CLRS) tiene una muy buena explicación de esto mientras explica el tipo de combinación. La idea misma del proceso de fusión del tipo de fusión es su pregunta. En la página 31 de la tercera edición se dio una buena explicación.

Por favor, ayúdese a implementarlo.

Una excepción con su caso es que tiene dos matrices separadas. Pero aquí se fusionan dos partes continuas de la misma matriz.

Aquí se usa un elemento centinela (líneas 8 y 9). No desea utilizar el elemento centinela en su caso. Si desea hacerlo de esa manera, debe copiar sus matrices en dos matrices diferentes con tamaño n + 1 ym + 1 (donde n y m son tamaños de sus matrices de entrada respectivamente). En su lugar, puede implementar lo mismo sin elemento centinela.

La peor complejidad del caso podría ser O (n + m).

More Interesting

¿Qué debo esperar en la entrevista de pasantía en IIT Bombay?

¿Es posible aprender algoritmos y estructuras de datos (sin conocimientos previos, solo Python básico para aprendizaje automático) en 1.5 meses para estar listo para la entrevista para una pasantía SWE de primer año?

¿Cómo debería uno comenzar a prepararse para una entrevista en Java con 3 años de experiencia?

¿Cuáles son los conceptos que podrían ayudar a descifrar una entrevista de Google que no sean estructuras de datos y algoritmos?

¿Qué tan útil es la preparación de InterviewBit para candidatos que tienen 0 a 3 años de experiencia industrial?

¿Qué hace que una buena entrevista técnica sea una pregunta?

¿Puedo elegir codificar en Java durante una entrevista con Apple para un puesto de ingeniero de software?

Cómo prepararse para una entrevista técnica

¿Por qué las compañías de software, durante las entrevistas, se preocupan si los candidatos conocen la sintaxis exacta del código?

Además de la búsqueda binaria, ¿hay otros ejemplos de código que tengan un tiempo de ejecución de O (log n)?

¿Cuál es la manera eficiente de encontrar todos los números en orden en una matriz en el tiempo O (N)?

Cómo completar esta tarea de programación

¿Las preguntas de entrevistas de software en las principales compañías tecnológicas están específicamente diseñadas para sesgar a los programadores más jóvenes (que aún recuerdan los conceptos teóricos en detalle)?

¿Cuáles son las preguntas de la entrevista formuladas en el software Hypermesh?

¿Cuál es la mejor manera de prepararse para la entrevista de Amazon, cuando todos son nuevos en la codificación?