0
votes

Extraction efficace des éléments d'un ensemble C ++ non ordonné

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?


2 commentaires

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.


3 Réponses :


0
votes

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.

Pour plus de détails s'il vous plaît vérifier: https://fr.wikipedia.org/wiki/trie

Mise en œuvre: https://www.geeksforgeeks.org/trie-insert- et-recherche / .

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.

J'espère que cela vous aidera.


2 commentaires

Edité, je voulais dire std :: unomment_sed_set , mais il est identique à celui de std :: Set .


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.



2
votes

pour tout critère Ce n'est pas possible, voir Cette réponse pour plus de détails.

Selon vos autres besoins, un Tri std :: vecteur est très probable être le plus efficace pour la partie extraction seule. Utilisez des algorithmes comme std :: inférieur travailler avec un trié std :: vecteur . 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 s'approche d'un ajustement unique pour la performance (ceci est dû à Tous les les optimisations internes de stockage contiguë).

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.


0 commentaires

2
votes

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))


0 commentaires