en C ++ Supposons que vous ayez un ensemble non ordonné ( https: //fr.cppreference. COM / W / CPP / CUPER / ONUORDED_SET ) de chaînes - Existe-t-il un moyen d'extraire efficacement toutes les chaînes de cet ensemble qui répondent à un certain critère (par exemple, trouvez toutes les chaînes dans l'ensemble qui commence par la lettre "A") en utilisant une méthode autre que itérant à travers l'ensemble de l'ensemble avec A pour une boucle et vérifiant le premier caractère de chaque chaîne? p>
3 Réponses :
Au lieu d'utiliser un ensemble non ordonné, adaptez votre structure de données à quelque chose comme une trie. Dans ce cas, cela pourrait vous être plus utile. P>
Pour plus de détails s'il vous plaît vérifier: https://fr.wikipedia.org/wiki/trie a> p>
Mise en œuvre: https://www.geeksforgeeks.org/trie-insert- et-recherche / . p>
Selon vos besoins, vous pourriez penser à d'autres algorithmes tels que Aho-Corasick / suffixe-Tableaux, etc. Vous devrez peut-être faire des recherches sur la structure de données dont vous avez besoin en fonction de la quantité de données que vous avez, le recalculture que vous avez besoin et la quantité de requêtes que vous faites. p>
J'espère que cela vous aidera. P>
Edité, je voulais dire std :: unomment_sed_set code>, mais il est identique à celui de
std :: Set code>.
Ce que je voulais dire, c'est que, ne pensez pas à étendre votre structure de données que vous vous sentez appropriées, ce qui pourrait entraîner des résultats de complexité vraiment graves, mais plutôt jeter un coup d'œil sur plusieurs structures de données et sur la base de vos besoins, utilisez le meilleur besoin.
pour tout critère em> Ce n'est pas possible, voir Cette réponse pour plus de détails. p>
Selon vos autres besoins, un Cela étant dit, il est recommandé d'utiliser le conteneur qui semble mieux adapté au problème à portée de main et que les optimisations intelligentes que s'il y a un goulot d'étranglement réel de performances. P> std :: vecteur code> est très probable em> être le plus efficace pour la partie extraction seule. Utilisez des algorithmes comme
std :: inférieur code>
travailler avec un trié strong> std :: vecteur code>. En fin de compte, vos cas d'utilisation réelle sont ce qui détermine globalement quel conteneur est le mieux adapté aux performances-wise-wise - bien que
std :: vecteur code> s'approche d'un ajustement unique pour la performance (ceci est dû à Tous les les optimisations internes em> de stockage contiguë). p>
Pour le cas général de tout critère em>, vous ne pouvez pas faire mieux que itération de chaque élément. Chaque conteneur a critères spécifiques em> qu'il peut faire mieux avec, par exemple. p> std::unordered_set<std::string> strings = /* something */;
auto hashed = strings.hash_function()("Any collision will do"); // O(1)
strings.erase(strings.begin(hashed), strings.end(hashed)); // O(distance(first, last))
Techniquement, non. Bien sûr, vous pouvez utiliser des algorithmes ou des fonctions, mais ils vont itération sur le conteneur dans une boucle. Vous pouvez utiliser une boucle tandis que pour une boucle ;-)
Si vous avez besoin de vérifier tous les éléments, il n'ya aucun moyen de le faire sans itération de l'ensemble d'une manière ou d'une autre. Vous pouvez utiliser Fonctions d'algorithme standard pour le faire, qui cache l'itération de votre part et sont Très optimisé, mais ils doivent encore iTerrer.