Sto cercando di trovare il numero di elementi unici in un vettore rispetto a più vettori usando C ++. I vettori sono in ordine e possono essere di taglia 2.000.000.
Supponiamo che io abbia
v1: 5, 8, 13, 16, 20
v2: 2, 4, 6, 8
v3: 20
v4: 1, 2, 3, 4, 5, 6, 7
v5: 1, 3, 5, 7, 11, 13, 15
Il numero di elementi univoci in v1 è 1 (cioè il numero 16).
Ho provato due approcci.
-
Aggiunti i vettori v2, v3, v4 e v5 in un vettore di vettore. Per ogni elemento in v1, controllato se l'elemento è presente in uno qualsiasi degli altri vettori.
-
Combinato tutti i vettori v2, v3, v4 e v5 utilizzando l'ordinamento di unione in un singolo vettore e confrontato con v1 per trovare gli elementi univoci.
Nota: sample_vector = v1 e all_vectors_merged contiene v2, v3, v4, v5
//Method 1
unsigned int compute_unique_elements_1(vector<unsigned int> sample_vector,vector<vector<unsigned int> > all_vectors_merged)
{
unsigned int duplicate = 0;
for (unsigned int i = 0; i < sample_vector.size(); i++)
{
for (unsigned int j = 0; j < all_vectors_merged.size(); j++)
{
if (std::find(all_vectors_merged.at(j).begin(), all_vectors_merged.at(j).end(), sample_vector.at(i)) != all_vectors_merged.at(j).end())
{
duplicate++;
}
}
}
return sample_vector.size()-duplicate;
}
// Method 2
unsigned int compute_unique_elements_2(vector<unsigned int> sample_vector, vector<unsigned int> all_vectors_merged)
{
unsigned int unique = 0;
unsigned int i = 0, j = 0;
while (i < sample_vector.size() && j < all_vectors_merged.size())
{
if (sample_vector.at(i) > all_vectors_merged.at(j))
{
j++;
}
else if (sample_vector.at(i) < all_vectors_merged.at(j))
{
i++;
unique ++;
}
else
{
i++;
j++;
}
}
if (i < sample_vector.size())
{
unique += sample_vector.size() - i;
}
return unique;
}
Di queste due tecniche, vedo che il Metodo 2 dà risultati più veloci.
1) Metodo 1: esiste un modo più efficiente per trovare gli elementi rispetto all'esecuzione di std :: find su tutti i vettori per tutti gli elementi nella v1.
2) Metodo 2: overhead aggiuntivo nel confronto tra vettori v2, v3, v4, v5 e ordinamento.
Come posso farlo in un modo migliore?
[modifica] I vettori sono ordinati.