Comment puis-je vérifier si deux std::vector est uniquement contenir les mêmes éléments?
J'ai besoin d'un algorithme ou d'une bibliothèque standard la fonction de comparaison de deux éléments vectoriels, comme ci-dessous:
class Utility
{
template <class T>
static bool CheckIfVectorsEquivalent( const std::vector<T> & Vec1,
const std::vector<T> & Vec2)
{
//???
}
};
De travail en vertu de l'spécifications suivantes:
std::vector<int> v1, v2, v3, v4, v5, v6, v7, v8;
//Returns false when not all the elements are matching between vectors
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v2.push_back(2);
v2.push_back(3);
v2.push_back(8);
Utility::CheckIfVectorsEquivalent(v1, v2); //Must return false
//Returns true when all the elements match, even if the are not in the same order
v3.push_back(3);
v3.push_back(1);
v3.push_back(7);
v4.push_back(7);
v4.push_back(3);
v4.push_back(1);
Utility::CheckIfVectorsEquivalent(v3, v4); //Must return true
//Returns false when one of the vectors is subset of the other one
v5.push_back(3);
v5.push_back(1);
v5.push_back(7);
v6.push_back(7);
v6.push_back(3);
v6.push_back(1);
v6.push_back(18);
v6.push_back(51);
Utility::CheckIfVectorsEquivalent(v5, v6); //Must return false
//Returns true when the both vectors are empty
Utility::CheckIfVectorsEquivalent(v7, v8); //Must return true
Est-il standard (avec TSL) manière de procéder? Si non, comment puis-je écrire cet algorithme? Il me confond trop.
OriginalL'auteur hkBattousai | 2012-05-08
Vous devez vous connecter pour publier un commentaire.
Le standard sera le tri de ces deux vecteurs et de l'aide de l'opérateur
==
, qui compare les valeurs correspondantes.La solution de l'échantillon à la réalisation de cet algorithme est:
Sa complexité est O(n*log(n)), en raison de la tri.
"C'est aussi la manière la plus rapide possible de l'algorithme de" la Preuve?
Pas d'utilisation de jeux ou d'autres choses du genre, mais simplement de tri des vecteurs vient de mon expérience. De la complexité du point de vue de ce est O(n log n). Cela signifie, que vous avez (sans autres hypothèses) de reconnaître
n!
différents vecteurs de l'égalité, et la taille de l'arbre de décision estlog(n!) = Omega(n log n)
. Plus précis de la preuve peut en être fait de même pour le tri à la limite inférieure.Et il y a O(N) dans le meilleur des cas sortes. Comme je l'ai dit "la plus rapide possible" n'est pas une garantie et de l'OMI doit être supprimé.
Vous venez de vous faire de l'intimidation en changeant une seule mauvaise réponse dans un autre, pire réponse? Votre réponse encore n'a de sens qu'avec une commande, mais maintenant que vous avez retiré une intéressante (et corriger) commentaire sur la complexité dans ce cas.
OriginalL'auteur Rafał Rawicki
Si vous pouvez vivre avec juste un c++11 solution, alors
std::is_permutation
est exactement ce que vous voulezSi vous ne pouvez pas faire cela, alors à la prochaine boost 1.50 libération, il y aura
avec la même interface.
Il est O(N^2).
Je pense que c'est la meilleure réponse, car elle ne permet pas de faire des hypothèses de commande sur le type T.
Certainement O(N^2) dans le pire des cas, mais il n'utilise pas de mémoire supplémentaire.
OriginalL'auteur Marshall Clow
Créer un
multiset
de chaque vecteur, puis il suffit de comparer pour l'égalité.OriginalL'auteur Alan Stokes
Il y a un O(n), solution à ce problème de non triés entrées:
qui fonctionne pour entier entrées et exploite le fait que
a ^ b ^ c ^ d == 0
pour toute combinaison de paires de valeurs. Il ne sera jamais à donner de faux négatifs, il pourrait donner de faux positifs potentiellement, mais vous pouvez réduire les autres en O(n) l'espace/temps. Si vous êtes souvent frapper négatifs, alors ce pourrait être utile comme un pré-tri+comparer étape à la règle de l'en sortir rapidement. Il fonctionne pour tous les cas de test que vous avez montré:Donne:
operator==
sur les vecteurs.Comment est
mismatch
une amélioration sur le droit à l'égalité après le tri?L'itérateur il vous donne vous indique où se situe la différence qui peut/ne peut pas être de l'intérêt
Il y a des cas où cela renvoie vrai de manière incorrecte.
À en juger à partir d'un rapide coup d'œil, vous voulez xor de tous les éléments et s'attendre à obtenir de zéro si ils sont tous égaux, non? Voici le problème:
Vec1[0, 12]; Vec2[4, 8]
.OriginalL'auteur Flexo
Façon la plus simple de le faire est de créer des copies de Vec1 et Vec2, de les trier et de les comparer à l'aide de
==
.Une autre façon de faire est de construire deux multisets de Vec1 et Vec2 et de les comparer à l'aide de
==
.Encore une autre façon de le faire est d'utiliser les cartes (std::map ou unordered_map) pour stocker des compteurs - c'est à dire incrémenter la valeur stockée pour chaque élément de Vec1 et de décrémentation pour chaque élément stocké de Vec2, puis vérifiez si la carte contient non nulle éléments. Si il y a des non-zéro les éléments stockés dans la carte, les vecteurs sont non-égalité.
désordre pseudocode exemple:
Selon votre STL (ou boost) la mise en œuvre, le type de données, et l'ordre des données stockées dans des vecteurs) l'une de ces méthodes sera plus rapide, mais il est difficile de dire lequel.
OriginalL'auteur SigTerm
Si l'on considère un entier à être assez grand pour que les calculs effectués dans l'algorithme suivant, il est un simple algorithme O(N).
0: initialisation: Il y a de nombres premiers de la taille de max(v1,v2), produit1=1, produit2=1
1: retourne false si la taille de la v1 != la taille de la v2
2:
3.
OriginalL'auteur Captain Giraffe
la condition ci-dessus, la fonction de comparer renvoie true ou false.J'ai perdu le compte.
si return true.
nous ne pouvons pas utiliser la voie:
Le standard sera le tri de ces deux vecteurs et de l'aide de l'opérateur ==, qui compare les valeurs correspondantes.
OriginalL'auteur bootry