J'ai une liste de chaînes de semences, environ 100 chaînes prédéfinies. Toutes les chaînes ne contiennent que des caractères ASCII.
std::list<std::wstring> seeds{ L"google", L"yahoo", L"stackoverflow"};
Mon application reçoit constamment un grand nombre de chaînes de caractères qui peuvent contenir n'importe quels caractères. Je dois vérifier chaque ligne reçue et décider si elle contient une des graines ou non. La comparaison doit être insensible à la casse.
J'ai besoin de l'algorithme le plus rapide possible pour tester la chaîne reçue.
Actuellement, mon application utilise cet algo :
std::wstring testedStr;
for (auto & seed : seeds)
{
if (boost::icontains(testedStr, seed))
{
return true;
}
}
return false;
Cela fonctionne bien, mais je ne suis pas sûr que ce soit le moyen le plus efficace.
Comment est-il possible d'implémenter l'algorithme afin d'obtenir de meilleures performances ?
Il s'agit d'une application Windows. L'application reçoit des données valides std::wstring
ficelles.
Mise à jour
Pour cette tâche, j'ai mis en œuvre l'algo Aho-Corasick. Si quelqu'un pouvait revoir mon code, ce serait formidable - je n'ai pas une grande expérience de ces algorithmes. Lien vers l'implémentation : gist.github.com