Imprimir elementos de una array según el orden definido por otra array | conjunto 2

Dadas dos arrays a1[] y a2[], imprima los elementos de a1 de tal manera que el orden relativo entre los elementos sea el mismo que el de a2. Es decir, los elementos que vienen antes en el arreglo a2[], imprima esos elementos primero del arreglo a1[]. Para los elementos que no están presentes en a2, imprímalos por fin en orden. 
También se da que el número de elementos en a2[] es menor o igual que el número de elementos en a1[], y a2[] tiene todos los elementos distintos.
Ejemplo: 
 

Entrada: a1[] = {2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8} 
a2[] = {2, 1, 8, 3} 
Salida: 2 2 1 1 8 8 3 5 6 7 9
Entrada: a1[] = {2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8} 
a2[] = {1, 10, 11} 
Salida: 1 1 2 2 3 5 6 7 8 8 9 
 

Enfoque simple: creamos una array temporal y una array visitada donde la array temporal se usa para copiar los contenidos de a1[] y la array visitada se usa para marcar aquellos elementos en la array temporal que se copian en a1[]. Luego ordenar la array temporal y hacer una búsqueda binaria para cada elemento de a2[] en a1[]. Puedes encontrar la solución aquí .
Enfoque eficiente: podemos imprimir los elementos de a1[] según el orden definido por a2[] usando map en c++en tiempo O(mlog(n)). Atravesamos a1[] y almacenamos la frecuencia de cada número en un mapa. Luego recorremos a2[] y verificamos si el número está presente en el mapa. Si el número está presente, imprímalo tantas veces y borre el número del mapa. Imprima el resto de los números presentes en el mapa secuencialmente, ya que los números se almacenan en el mapa en orden ordenado.
A continuación se muestra la implementación del enfoque anterior: 
 

C++

// A C++ program to print an array according
// to the order defined by another array
#include <bits/stdc++.h>
using namespace std;
 
// Function to print an array according
// to the order defined by another array
void print_in_order(int a1[], int a2[], int n, int m)
{
    // Declaring map and iterator
    map<int, int> mp;
    map<int, int>::iterator itr;
 
    // Store the frequency of each
    // number of a1[] int the map
    for (int i = 0; i < n; i++)
        mp[a1[i]]++;
 
    // Traverse through a2[]
    for (int i = 0; i < m; i++) {
        // Check whether number
        // is present in map or not
 
        if (mp.find(a2[i]) != mp.end()) {
            itr = mp.find(a2[i]);
 
            // Print that number that
            // many times of its frequency
            for (int j = 0; j < itr->second; j++)
                cout << itr->first << " ";
            mp.erase(a2[i]);
        }
    }
 
    // Print those numbers that are not
    // present in a2[]
    for (itr = mp.begin(); itr != mp.end(); itr++) {
        for (int j = 0; j < itr->second; j++)
            cout << itr->first << " ";
    }
 
    cout << endl;
}
 
// Driver code
int main()
{
    int a1[] = { 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 };
    int a2[] = { 2, 1, 8, 3 };
    int n = sizeof(a1) / sizeof(a1[0]);
    int m = sizeof(a2) / sizeof(a2[0]);
 
    print_in_order(a1, a2, n, m);
 
    return 0;
}

Python3

# A Python3 program to print an array according
# to the order defined by another array
 
# Function to print an array according
# to the order defined by another array
def print_in_order(a1, a2, n, m) :
 
    # Declaring map and iterator
    mp = dict.fromkeys(a1,0);
 
    # Store the frequency of each
    # number of a1[] int the map
    for i in range(n) :
        mp[a1[i]] += 1;
 
    # Traverse through a2[]
    for i in range(m) :
        # Check whether number
        # is present in map or not
 
        if a2[i] in mp.keys() :
 
            # Print that number that
            # many times of its frequency
            for j in range(mp[a2[i]]) :
                print(a2[i],end=" ");
                 
            del(mp[a2[i]]);
 
    # Print those numbers that are not
    # present in a2[]
    for key,value in mp.items() :
        for j in range(value) :
            print(key,end=" ");
 
    print();
 
 
# Driver code
if __name__ == "__main__" :
 
    a1 = [ 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 ];
    a2 = [ 2, 1, 8, 3 ];
    n =len(a1);
    m = len(a2);
 
    print_in_order(a1, a2, n, m);
     
    # This code is contributed by AnkitRai01

Javascript

<script>
 
// A JavaScript program to print an array according
// to the order defined by another array
 
// Function to print an array according
// to the order defined by another array
function print_in_order(a1, a2, n, m){
 
    // Declaring map and iterator
    let mp = new Map();
 
    // Store the frequency of each
    // number of a1[] int the map
    for(let i=0;i<n;i++){
        if(mp.has(a1[i]))
            mp.set(a1[i],mp.get(a1[i])+1);
        else
            mp.set(a1[i],1);
    }
 
    // Traverse through a2[]
    for(let i=0;i<m;i++){
        // Check whether number
        // is present in map or not
 
        if(mp.has(a2[i])){
 
            // Print that number that
            // many times of its frequency
            for(let j=0;j<mp.get(a2[i]);j++)
                document.write(a2[i]," ");
                 
            mp.delete(a2[i]);
        }
    }
 
    // Print those numbers that are not
    // present in a2[]
    for(let [key,value] of mp)
        for(let j=0;j<value;j++)
            document.write(key," ");
 
    document.write("</br>");
}
 
// Driver code
let a1 = [ 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 ];
let a2 = [ 2, 1, 8, 3 ];
let n = a1.length;
let m = a2.length;
 
print_in_order(a1, a2, n, m);
 
// This code is contributed by shinjanpatra
 
</script>
Producción: 

2 2 1 1 8 8 3 5 6 7 9

 

Publicación traducida automáticamente

Artículo escrito por soumya7 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *