Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: remphenter en 26 Enero 2020, 05:06 am



Título: [?][C++] Comparar cada elemento de 2 vectores
Publicado por: remphenter en 26 Enero 2020, 05:06 am
He estado buscando guías y vídeos pero no encuentro como comparar el elemento de un array a todos los elementos del array2, por ejemplo:

array1 = {1,2,3,4,5};

array2 = {3,4,1,0,0};

El programa me debe decir que hay 3 elementos en el array2 que aparecen en el array1, para ello según yo se tiene que crear un tercer array como auxiliar inicializándolo como 0, es decir:

for(i=0; i<5; i++){
array3(i) = 0;
}

pero en mi lógica solo he podido lograr lo siguiente:
Código
  1. for(i=0;i<10;i++){
  2. for(j=0;j<10;j++){
  3. if(array1[i] == array2[j]){   //fila 3
  4. array3[j] = array[i];   //fila 4
  5. }
  6. }
  7. }

En la fila 3 está el problema en la comparación, lo que hace solamente es comparar el elemento de la posición 0 con el elemento de la posición 0 del otro array después, el 2 con el 2 y así.

Además creo tengo un problema con la asignación del array3.

Saludos


Título: Re: [?][C++] Comparar cada elemento de 2 vectores
Publicado por: @XSStringManolo en 26 Enero 2020, 13:38 pm
for(j = 0; j < tamArray1; ++j) {

  for(i = 0; i < tamArray2; ++i) {
   
    if(array1[j] == array2) {
    ++array[j];
    }

  }

}


Título: Re: [?][C++] Comparar cada elemento de 2 vectores
Publicado por: Serapis en 26 Enero 2020, 18:14 pm
Si emites/imprimes el valor cuando existe, no sería preciso un tercer array, salvo que se pida expresamente en el enunciado del 'problema'.

En cualquier caso, el sistema usado es subóptimo, aunque muy válido para pequeños arrays... Consume un tiempo n². Luego, cuando 'n' sea un número muy grande, te puedes imaginar lo lento que sería...

Algo muy óptimo sería ordenar ambos arrays (si se sabe de entrada que alguno está ordenado, puede omitirse para el mismo dicha operación), obviamente con un algoritmo rápido como quickSort (recurrir a uno lento como uno de burbuja no optimiza nada).
Una vez ordenados un simple bucle (lineal en 'n'), es suficiente para ir comparando...

La estrategia es entonces tomar uno de los arrays (sugiero tomar aquel cuyo último elemento sea menor), como referencia y tomar el ítem (del ciclo) actual, e ir indagando en el otro bucle mientras sea menor o igual al valor actual en el array de referencia...


Código:
// Se supone que ya se han ordenado los arrays al llegar a este punto, que quedan tal como se muestran:
Array1: 1,2,3,4,5
Array2: 0,0,1,2,4

// Bucle lineal.
Bucle para k desde 0 a array.lenght -1
   v = Array1(k)
   Hacer mientras (v<= Array2(n) )
       si v=(array2(n)) imprimir "El ítem de valor " + v + " está presente en ambos arrays."
       n +=1
       Si (n >= array2.lenght) salirdelafuncion
    Repetir
Fin bucle

OJO: No confundir que el bucle 'do' dentro del bucle 'for', es un bucle anidado, pués no lo es, son colineales... si se alcanza el final del array2, aún cuando se esté dentro del primer ítem del bucle 'for' la función acaba, cosa que no sucedería nunca con 2 bucles anidados.
Es decir el tiempo final será 'n' + 'm', que salvo para casos muy pequeños de 'n' y 'm' siempre será enromeneteme más óptimo que 'n'*'m' (n², si m=n).