Cómo encontrar elementos comunes en 3 matrices ordenadas

Algoritmo: búsqueda binaria
Complejidad: O (N1 * (log (N2) + log (N3))).

Para el algoritmo O (n1 + n2 + n3): encuentre elementos comunes en tres matrices ordenadas – GeeksforGeeks

La idea es atravesar la primera matriz y encontrar si está presente tanto en la segunda como en la tercera.
Si está allí en ambas matrices, agréguelo a la lista y, para los valores siguientes, busque binariamente los valores próximos con índices iniciales de arr2 y arr3 como los índices de búsqueda anteriores +1 y el índice final igual

En la primera iteración: x = Búsqueda binaria (array2, int i, int size);
y = Binarysearch (array3, int j, int size);

En la siguiente iteración, actualice como i = x + 1; y j = y + 1; y continúa la búsqueda

La idea es que las matrices están ordenadas y no encontraremos los siguientes elementos en la región 0-x y 0-y.

PD: este código se vuelve eficiente cuando los tamaños de entrada son muy grandes

#include
usando el espacio de nombres estándar;
int bsearch (int arr [], int key, int l, int r)
{
int mid;
mientras que (l <= r)
{
mid = l + (rl) / 2;
if (arr [mid] == key) return mid;
if (arr [mid] <tecla) l = mid + 1;
sino r = mid-1;
}
si (l <= r) devuelve l;
de lo contrario, devuelve -1;

}

int min (int a, int b)
{
si (a <= b) devuelve a;
de lo contrario, devuelve b;
}

int main ()
{
int n1, n2, n3;
scanf (“% d% d% d”, & n1, & n2, & n3);
int i, j, k, l, m;
l = min (min (n1, n2), n3);
int arr1 [10], arr2 [10], arr3 [10], cmn [10];

para (i = 0; i <n1; i ++) scanf ("% d", & arr1 [i]);
para (i = 0; i <n2; i ++) scanf ("% d", & arr2 [i]);
para (i = 0; i <n3; i ++) scanf ("% d", & arr3 [i]);
m = 0;
int st1 = 0, st2 = 0, dep, tep;

para (i = 0; i <n1; i ++)
{
j = bsearch (arr2, arr1 [i], st1, n2-1);
k = bsearch (arr3, arr1 [i], st2, n3-1);
si (j! = – 1 && k! = – 1)
{
cmn [m ++] = arr1 [i];
dep = arr2 [j];
tep = arr3 [k];
while (j> 0 && arr2 [j] == dep) j–;
while (k> 0 && arr3 [k] == tep) k–;
if (arr2 [j]! = dep) j ++;
if (arr3 [k]! = tep) k ++;
arr2 [j] = – 100000;
arr3 [k] = – 100000;
st1 = j + 1;
// valores clave actualizados de las búsquedas para la próxima iteración.
st2 = k + 1;
}

}

para (i = 0; i <m; i ++)
{
printf (“% d”, cmn [i]);
}
printf (“\ n”);

}

Entrada:
3 5 4

1 5 5
3 4 5 5 10
5 5 10 20
Salida: 5 5
Buena Suerte 🙂

Utilice tres índices A, B, C que apuntan al inicio de las matrices.
while (A Si todos los elementos son iguales (arr1 [A] == arr2 [B] == arr3 [C]) señalados por los índices, entonces es un elemento común e incrementa todos los índices en 1 (A ++, B ++, C ++)
más
obtenga el más pequeño de los tres elementos e incremente ese índice en 1. Ejemplo (si arr1 [A] }

Está obteniendo un bucle infinito porque no incrementa el i y j, por lo que while (i

if (arr1 [i] == arr2 [j]) {al.add (arr1 [i]); i ++, j ++;}
si no (arr1 [i] de lo contrario j ++;
Además, el segundo bucle no debe estar dentro del primero.

Aquí hay una solución generalizada para encontrar elementos comunes de n matrices ordenadas:

Encuentra elementos comunes en matrices ordenadas ‘n’

El algoritmo es el siguiente:

Se nos dan matrices ordenadas ‘n’, digamos matriz-1, matriz-2 a matriz-n. Para descubrir elementos comunes en estas matrices, seleccionamos cada elemento a partir del elemento en el índice 0 de la matriz-1 y verificamos si ese elemento está presente en todas las matrices restantes. Para verificar si un elemento de array-0 (elementArray0) está presente en array-‘i ‘(1 <= i <= n), comenzamos a mirar los elementos en array-'i' comenzando desde 'último índice verificado' hasta encontramos un elemento que es mayor o igual que el elemento de array-0 (elementArray0). Este último índice verificado se inicializaría a 0 para todas las matrices: matriz-1 a matriz-n. Nos detenemos cuando encontramos un elemento que es mayor o igual que 'elementArray0', guardamos este índice como 'último índice verificado' para array-'i 'y procedemos a array-'i + 1' para que coincida el elemento 'elementArray0'. Dado que array-'i 'está ordenado, no necesitamos verificar la coincidencia del índice 0 nuevamente cuando intentamos hacer coincidir el siguiente elemento de array-0. Este 'último índice verificado' se usaría para reanudar la operación de coincidencia para el siguiente elemento de array-0.

Espero que esto ayude.

Recorre las tres matrices en paralelo:

  1. Cree tres variables de índice, cada una apuntando a la posición actual en una de las matrices. Comience con todas las variables de índice establecidas en 0.
  2. Si los tres números en las posiciones del índice son iguales, usted encontró una coincidencia.
  3. incremente el índice que apunta al valor más bajo (elija cualquiera si más de un índice apunta al mismo valor más bajo).
  4. si el índice ahora está más allá del final de la matriz, deténgase.
  5. Repita desde el paso 2

Esto está fuera de mi cabeza, después de explorar quora durante unas horas en lugar de irme a la cama … Así que no hay garantías de que esto realmente funcione 😉 Pero si lo hace, es O (n). Y debería funcionar incluso si las matrices tienen una longitud muy diferente.

EDITAR: Oh, no vi la respuesta de Adrian, se parece mucho a lo que tenía en mente. Responder directamente desde mi Feed es confuso, pierdo contexto …

¿Por qué no simplemente pasar por todos los elementos de la primera matriz y aplicar la búsqueda binaria en los otros dos?
Si su elemento se encuentra utilizando la búsqueda binaria en las otras dos matrices, puede insertarlo en la lista de elementos comunes.
La complejidad total es O (N (log (M) + log (P)).
Dónde;
N es la longitud de la primera matriz.
M es la longitud de la segunda matriz.
P es la longitud de la tercera matriz.

Una posible solución es usar una tabla hash para observar qué elementos han ocurrido cuántas veces; entonces es irrelevante cuántas matrices tiene o si están ordenadas: observa cuántas veces se ha producido un elemento de matriz determinado y cuando procesa la última matriz observa los elementos que ocurrieron en todas las matrices hasta el momento.

More Interesting

¿Es posible que un ingeniero sin experiencia en CS obtenga un trabajo en Google, Facebook, Microsoft o Amazon en 6 meses?

Llevo un tiempo codificando y he desarrollado varias aplicaciones web. No he usado ningún algoritmo o incluso muchas matemáticas. No he hecho ninguna de las cosas complicadas de las que tanto se habla en informática. ¿Por qué?

¿Cómo diseñaría un algoritmo codicioso que conecta cada punto negro con un punto blanco para que la longitud total de los cables utilizados para formar tales pares conectados sea mínima?

¿Cuál es el código de vestimenta en la entrevista de San Esteban y qué tipo de preguntas se hacen para recibir honores económicos?

¿Cuáles son las preguntas técnicas que se hacen durante la entrevista en el sitio como desarrollador front-end?

¿Qué tipo de preguntas se hacen durante las entrevistas de codeNation? ¿Son principalmente del tipo que se solicitan en Codechef (es decir, la codificación matemática) o lo hacen desde un enfoque de estructura de datos?

Cómo hackear una entrevista de codificación

Dado un puntero a cualquier nodo, ¿cuál es el número óptimo de nodos que necesita atravesar para encontrar el orden de clasificación en una lista ordenada de forma circular?

No he recibido respuesta 2 meses después de una entrevista en una empresa de alta tecnología. ¿Tengo alguna posibilidad de conseguir el trabajo?

¿Qué necesito saber sobre el recolector de basura en Java para una entrevista técnica?

Cómo usar el hash para el problema de la suma de tripletas

¿Algoritmo de libros o proyecto de código abierto para ser contratado por empresas tecnológicas de San Francisco como Google?

Escriba una función recursiva para llenar una matriz MXN con valores de 1 a M * N en el patrón ESPIRAL (debería funcionar para cualquier M> = 0 y cualquier N> = 0).

Cómo buscar en una matriz ordenada por filas y columnas

Dada una cadena, ¿encuentra la longitud de la subcadena más larga donde ningún personaje se repite dos veces?