IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Recherche d'un string dans un vector<string>


Sujet :

C++

  1. #1
    Membre confirm�
    Profil pro
    �tudiant
    Inscrit en
    Juin 2009
    Messages
    83
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 83
    Par d�faut Recherche d'un string dans un vector<string>
    Bonjour � tous !

    Je bloque sur une partie de mon code.

    Je m'explique : J'ai un fichier CSV que je copie dans un vector<string> via le code suivant :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void extractionCSV (ifstream& fichComp,vector<string>& vecCSV)
    {
    	string ligneCourante("");
     
    	if(fichComp)
    	{
    		fichComp.seekg(0,ios::beg);//on se place au début du fichier
    		while (getline(fichComp,ligneCourante))
    		{
    				vecCSV.push_back(ligneCourante);
    		}
    	}
    }
    Ensuite, l'id�e est de rechercher un string nom contenue dans un �l�ment de mon vecCSV.

    Par exemple, si
    nom="toto",
    et que
    vecCSV[0] = "tot1"
    vecCSV[1] = "tot2"
    vecCSV[2] = "le toto est � l'eau"
    vecCSV[3] = "tot6"
    etc...


    Alors, je veux pouvoir r�cup�rer vecCSV[2].

    Je n'ai pas r�ussi � y parvenir, j'ai essay� avec std::find, mais il ne me renvoie rien (il me semble que find fait simplement une comparaison de type if(nom == vecCSV[i])).

    J'ai le bout de code suivant, qui ne marche donc pas :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    string rechercheLigneComp(string nom, std::vector<std::string> vecCSV)
    {
    	std::vector< std::string >::iterator it = vecCSV.begin();
    	for( ; ; )
    	{
    	   it = std::find(it, vecCSV.end(), nom);
    	   if ( it == vecCSV.end() )
    		  return "";
    	   else
    		  return vecCSV[std::distance( vecCSV.begin(), it++ )];
    	}
    }
    Si quelqu'un avait des pistes pour m'aiguiller, je suis preneur !

    Je pr�cise par ailleurs que je dois effectuer la recherche de "nom" plusieurs centaines de fois. J'ai test� de rechercher "nom" directement dans le CSV (code ci-dessous), �a fonctionne bien mais la recherche est bien trop longue, c'est pourquoi je tente cette 2nde m�thode.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    string rechercheLigneComp(string nom, ifstream& fichComp)
    {
    	string ligneCourante(""), ligneSortie("");
     
    	if(fichComp)
    	{
    		fichComp.seekg(0,ios::beg);//on se place au début du fichier
    		while (getline(fichComp,ligneCourante))
    		{
    			if(ligneCourante.find(nom) != std::string::npos)
    			{
    				ligneSortie=ligneCourante;
    				break;
    			}
    		}
    	}
    	return ligneSortie;
    }

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Salut

    Utilise find_if
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <iostream>
    #include <vector>
    #include <algorithm>
     
    int main() {
      std::vector<std::string> vecCSV {{
        "tot1"
          , "tot2"
          , "le toto est a l'eau"
          , "tot6"
      }};
     
      std::string key = "toto";
      auto elem = std::find_if(begin(vecCSV), end(vecCSV), [&key](std::string const& elem) { return elem.find(key) != std::string::npos; });
      if (elem != end(vecCSV)) {
        std::cout << "Found \"" << (*elem) << "\" at pos " << std::distance(begin(vecCSV),elem) << "\n";
      }
      return 0;
    }

  3. #3
    Membre confirm�
    Profil pro
    �tudiant
    Inscrit en
    Juin 2009
    Messages
    83
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 83
    Par d�faut
    Nickel, c'est exactement ce que je voulais !

    Cela dit, cela ne r�gle pas mon probl�me initial : le temps d'ex�cution du programme. Il reste tr�s long � ex�cuter...

    Pour information, mon fichier CSV fait environ 17000 lignes (donc mon vector vecCSV a 17000 �l�ments), et je dois le parcourir � peu pr�s 800 fois.

    Je m'y prend peut-�tre pas de la mani�re optimale pour effectuer ces recherches, y-a-t-il une m�thode plus optimis�e ?

  4. #4
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    Si l'ordre des �l�ments n'est pas contraint d'�tre celui du fichier, tu peux pr�f�rer un set.
    Tu peux aussi trier le vector, puis utiliser std::binary_search

  5. #5
    Membre Expert
    Homme Profil pro
    �tudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par d�faut
    Hello,

    Si ce que tu recherches est bien d�limit� (UN mot par exemple), il est possible de stocker ton texte dans une (unordered)map.

    La cr�ation de cette map sera plus longue qu'une simple cr�ation de vecteur, mais la recherche devrait �tre plus rapide.

    Cr�ation de la map
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    typedef std::vector<int> line_t;
    typedef std::unordered_map<std::string, line_t> map_t;
     
    void insert(map_t & map, std::string const& word, int line) {
    	using std::begin;
    	using std::end;
     
    	auto it = std::find(begin(map), end(map), word);
    	if(it == end(map)) { // nouveau mot
    		it = map.insert(std::make_pair(word, line_t())).first;
    	}
    	it->second.push_back(line);
    }
     
    std::unordered_map<std::string, std::vector<int>> words;
    //vecCSV[0] = "tot1" devient
    insert(words, "tot1", 0);
    //vecCSV[2] = "le toto est à l'eau" devient
    insert(words, "le", 2);
    insert(words, "toto", 2);
    insert(words, "est", 2);
    insert(words, "à", 2);
    insert(words, "l'eau", 2);
    // etc...
    Et recherche
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // recherche de toto
    line_t const& search(map_t const& map, std::string const& word) {
    	using std::begin;
    	using std::end;
    	auto it = std::find(begin(map), end(map), word);
    	if(it == end(map)) {
    		return line_t(); // pas de problème de durée de vie vu qu'on retourne une ref constante ?
    	}
    	return it->second;
    }
     
    auto results = search(words, "toto");
    for(int i: results) {
    	std::cout << "'toto' à la ligne: " << i << '\n';
    }

  6. #6
    Membre confirm�
    Profil pro
    �tudiant
    Inscrit en
    Juin 2009
    Messages
    83
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 83
    Par d�faut
    Merci pour toutes ces pistes !

    Si ce que tu recherches est bien d�limit� (UN mot par exemple), il est possible de stocker ton texte dans une (unordered)map
    H�las, non, ce n'est pas le cas, la cha�ne que je recherche peut contenir des espaces, des tirets, etc.


    Si l'ordre des �l�ments n'est pas contraint d'�tre celui du fichier, tu peux pr�f�rer un set.
    Tu peux aussi trier le vector, puis utiliser std::binary_search
    le truc avec binary_search, c'est qu'il te renvoie simplement un bool�en qui t'indique si la cha�ne est pr�sente dans mon vecteur (ou la sous-chaine dans mon cas, en adaptant la fonction Compare), mais pas � quel index. Je ne pourrais donc pas r�cup�rer la chaine vecCSV[index] qui contient ma sous-chaine.

    De plus, pour effectuer le tri, je ne sais pas trop comment m'y prendre, sachant que ma sous-chaine n'est pas en 1�re place de la chaine dans le vecteur.

    Je repr�cise, �a sera sans doute plus clair.

    1 - J'ai un fichier CSV d'entr�e, de 17 000 lignes environ, au format suivant :
    101A,"TOTAL-X 204M","392","FR","22.60","33","406","398","","0","2015-02-17","commentaire eventuel"

    2 - J'ai des string que je r�cup�re en parcourant un fichier *.txt (avec d'autres infos �galement). Ces strings correspondent en fait au 2�me champ du CSV (TOTAL-X 204M dans mon exemple).

    3 - Je voudrais donc r�cup�rer la ligne compl�te du CSV qui correspond au string "courant".

    4 - Je fais ensuite un traitement par la suite sur ces donn�es.


    Le point bloquant est donc la partie 3, o� je n'arrive pas � r�cup�rer rapidement la ligne du CSV.

  7. #7
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    Alors tu devrais faire un map du N� champ vers la ligne enti�re.
    Ca n'est pas difficile de chercher ce champ, avec std::getline(stream, string, delimiter).

    Mieux encore, tu pourrais avoir une classe repr�sentant cette ligne

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Citation Envoy� par leternel Voir le message
    Alors tu devrais faire un map du N� champ vers la ligne enti�re. Ca n'est pas difficile de chercher ce champ, avec std::getline(stream, string, delimiter)Mieux encore, tu pourrais avoir une classe repr�sentant cette ligne
    Oui mais attention, on voit que dans le format de l'op, il y a des quotes, or si le 2�me champs contient une virgule dans le champ entre quotes, je supppose que l'op est cens� bien l'interpr�ter ? Si oui, alors il va falloir faire plus malin qu'un simple getline
    Citation Envoy� par leternel Voir le message
    Mieux encore, tu pourrais avoir une classe repr�sentant cette ligne
    Heu, est-ce que �a vaut vraiment la peine ? C'est juste un tableau de cha�nes, un std::array fait amplement l'affaire pour ce qu'on conna�t du besoin actuel. Une classe n'aurait du sens que s'il y a vraiment une intelligence de traitement derri�re.

  9. #9
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    En effet, mais c'est une question � se poser.

  10. #10
    Membre �clair�
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Par d�faut
    Mon conseil: mesure bien o� tu perds ton temps. J'ai pas l'impression que ce soit vraiment �norme comme recherche. V�rifie bien que tes tests sont r�alis�s en release et que tu ne fais pas de copies inutiles (dans ton post d'origine, tu passes le vecteur de string en copie de ta fonction recherche par exemple). Apr�s avoir identifi� d'o� provient ton bottleneck, tu pourras ensuite envisager des solutions.

  11. #11
    Membre Expert
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par d�faut
    Pour le tri et la recherche:

    std::sort
    std::lower_bounds

  12. #12
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Tes cha�nes elles-m�mes dans le tableau sont-elles longues ou courtes ?

    Pourquoi veux-tu faire 800 recherches ? Connais-tu d�s le d�but la liste de toutes les recherches � effectuer (rechercher 800 strings dans 1 string peut �tre fait de mani�re plus intelligente qu'en recommen�ant 800 fois une recherche d'une string, comme par exemple les algos Aho�Corasick ou Rabin�Karp).

    Tu mets combien de temps pour l'instant ? Il faudrait que tu en mettes combien ?
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  13. #13
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par d�faut
    Je plussoie la r�ponse de JolyLoic.

    La recherche na�ve a un complexit� P * M * N, avec P = 17000, M = moy_len(ligne) et N = 800 * moy_len(mot)

    La complexit� g�om�trique est in�vitable mais M et N peuvent �tre r�duits:
    - pour M: je verrais, simple et en une passe, la cr�ation d'un vecteur de paires (int = ligneDansLeTabInitial, std::string deuxiemeChampDeLaLigne) -> M + P * (M/4) * N (� peu pr�s)
    - pour M * N: l'algorithme de Aho-Corasick est le plus prometteur et le mieux document�. La complexit� finale est M+N+O o� O est le nombre de correspondances

    Au total �a ferait:
    M + P * (M/4 + N + O)

    Je mets un lien vers un article qui m'a paru bien:
    https://www.informit.com/guides/cont...net&seqNum=769

  14. #14
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    Si tu as la liste des 800 avant celles des 17000, tu peux proc�der dans l'autre sens.

    constituer un set des 800 lignes.
    Pour chaque 17000 entr�es
        extraire le second champ.
        si cette valeur est dans le set des 800
            stocker/utiliser cette ligne.
    Note que cette approche fonctionne aussi bien en lisant les entr�e directement du fichier ou dans un vecteur

    La complexit� est celle du set plus celle des recherches, c'est � dire: (K log K) + N * (extraction + log K), avec K = 800 et N = 17000.
    Sachant que l'extraction est de l'ordre de 1 comparaison de cha�nes (=un parcours de chaine bien fait), ca donne donc environ N log K.

    Ce qui est franchement mieux que le N * K requis pour matcher chaque 800 lignes avec chaque 17000 entr�es.

    C'est la m�me id�e sous-jacente que la map: utiliser le tri � la construction pour r�duire le temps de recherche.

    Par comparaison, la map<2e champ, ligne>, co�terait N log N + K log N, ce qui revient � N log N.
    C'est moins bon, mais tu disposes pour la suite de toutes les lignes du fichier, tri�es par ce deuxi�me champ.

  15. #15
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par d�faut
    Citation Envoy� par leternel Voir le message

        si cette valeur est dans le set des 800
            stocker/utiliser cette ligne.
    Oui mais d'apr�s ce que j'ai compris, il ne s'agit pas seulement de savoir si un des 800 mots appara�t dans cette ligne mais de r�pertorier les couples: mot / ligne, c'est-�-dire d'obtenir une hash-map:
    { toto : [1,8,425,10021] , etc. } // les entiers sont les num�ros de ligne, of course

    j'imagine une fonction:

    void feedMatches( const AhoCorasikTree& act, std::unordered_map<std::string, std::vector<int>>& matches, const std::string& src, unsigned index);

    o�:
    • act est la forme "compil�e" des 800 mots � matcher
    • matches une map qui permet de retrouver les lignes associ�es � chaque mot
    • src le champ � regarder et index son rang dans le vecteur de lignes extrait du fichier

  16. #16
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Chill guys ! On peut essayer des trucs plus simples avant de vouloir bourriner avec des algos pouss�s.

    Du coup histoire de se remettre dans le d�bat, j'ai fait le test. J'ai compar� le parcours multiple du vector avec la construction d'une unordered_map puis son parcours. Le r�sultat est sans appel : pour un CSV de 20000 lignes et 800 cl�s � rechercher le parcours du vecteur est de l'ordre de 1000ms, la construction de la hash map de l'ordre de 25ms et son parcours de 0ms. Bien s�r, ce qui compte c'est la diff�rence, pas les performances brutes qui d�pendent de la machine et de l'optimisation choisie. En debug ou en optimis�, les perfs restent � peu pr�s les m�mes.

    Voici le code:

    Code python : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/env python
     
    upper=20000
    nb_to_search=800
    step=upper/nb_to_search
    with open("file1.csv","w") as f1:
      with open("file2.txt","w") as f2:
        for i in range(0,upper):
          f1.write('%dA,"TOTAL-X %dM","%d","FR","%f","%d","%d","%d","","0","2015-02-17","commentaire eventuel"\n' % (i,i+100,i+33,i/2.3,i+20,i/55,i/254))
          if i%step == 0:
            f2.write('TOTAL-X %dM\n' % (i+100))

    Code cpp : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <vector>
    #include <chrono>
    #include <algorithm>
    #include <unordered_map>
     
    int main() {
      using namespace std;
      using namespace std::chrono;
     
      ifstream data_if("file1.csv");
      ifstream key_if("file2.txt");
     
      if(data_if && key_if) {
        vector<string> data;
        string line;
        while(getline(data_if,line))
          data.emplace_back(line);
     
        vector<string> keys;
        while(getline(key_if,line))
          keys.emplace_back(line);
     
     
        {
          int nb_found = 0;
          auto t0 = high_resolution_clock::now();
          for(auto const& key : keys) {
            auto item = find_if(begin(data),end(data),[&key](string const& value) { return value.find(key) != string::npos; });
            if (item != end(data))
              ++nb_found;
          }
          auto t1 = high_resolution_clock::now();
          std::cout << "Found " << nb_found << " items in " << duration_cast<milliseconds>(t1-t0).count() << "ms" << std::endl;
        }
     
        {
          unordered_map<string,vector<size_t>> dictionary;
          auto t0 = high_resolution_clock::now();
          for(size_t index=0; index < data.size(); ++index) {
            string const& dataline = data[index];
            istringstream linestream(dataline);
            string f1, f2;
            getline(linestream,f1,',');
            getline(linestream,f2,',');
            // Remove quotes
            if (f2[0] == '"' && f2[f2.size()-1] == '"')
              f2 = f2.substr(1,f2.size()-2);
     
            dictionary[f2].emplace_back(index);
          }
     
          auto t1 = high_resolution_clock::now();
          std::cout << "Dictionary built in " << duration_cast<milliseconds>(t1-t0).count() << "ms" << std::endl;
     
          int nb_found = 0;
          auto t2 = high_resolution_clock::now();
          for(auto const& key : keys) {
            if (dictionary[key].size())
              ++nb_found;
          }
          auto t3 = high_resolution_clock::now();
          std::cout << "Found " << nb_found << " items in " << duration_cast<milliseconds>(t3-t2).count() << "ms" << std::endl;
        }
      }
     
      return 0;
    }

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    Found 800 items in 1049ms
    Dictionary built in 24ms
    Found 800 items in 0ms
    Si �a n'est pas encore assez rapide, alors peut-�tre faudra-t-il explorer d'autres algos, mais le gain est d�j� �norme.

  17. #17
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    C'est rassurant.
    En g�n�ral, il vaut toujours mieux chercher dans une collection tri�e, tu passes de Nlog N. (c'est � dire 10 au lieu de 1000, et 20 au lieu de 1 million)
    C'est le cas des std::map et autres std::set.

  18. #18
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par d�faut
    for (auto const& key : keys) {
    if (dictionary[key].size())
    ++nb_found;
    }
    Le gain est �norme mais l� �a ne r�pond pas � la question pos�e: ton programme ne fonctionne que si le texte recherch� correspond � l'int�gralit� du champ 2 de la ligne csv.

    Mettons que j'aie besoin des champs de totaux, des champs de 2015, et des champs des mois de f�vrier ("total" "2015" "02"), pcq je veux calculer mon chiffre d'affaires depuis la cr�ation de l'entreprise, en 2015, et pendant les mois de f�vrier.
    Il faut donc qu'il y ait 3 matches pour "total-02-2015". C'est � �a que sert l'algo-tr�s-compliqu�.
    Sinon on est r�duit � faire 3*17000 passes, et comme la fonction de hachage ne peut pas �tre appliqu�e puisqu'il s'agit d'une sous-cha�ne, unordered_map ne sert � rien...

    @leternel: unordered_map, comme son nom l'indique, n'est pas tri�e... normalement c'est du temps constant

    EDIT::
    2 - J'ai des string que je r�cup�re en parcourant un fichier *.txt (avec d'autres infos �galement). Ces strings correspondent en fait au 2�me champ du CSV (TOTAL-X 204M dans mon exemple).

  19. #19
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Citation Envoy� par stendhal666 Voir le message
    Le gain est �norme mais l� �a ne r�pond pas � la question pos�e: ton programme ne fonctionne que si le texte recherch� correspond � l'int�gralit� du champ 2 de la ligne csv.
    Oui bien �videmment, il me semble que l'op faisait du matching de pattern pour trouver la ligne sans faire l'effort d'exploiter son formatage, alors que l'�galit� peut �tre utilis�e. Si ce n'est pas le cas, en effet, c'est foutu.

Discussions similaires

  1. [D�butant] Recherche de 2 caract�res dans une chaine de string
    Par Tornade8912 dans le forum VB.NET
    R�ponses: 5
    Dernier message: 15/03/2015, 18h27
  2. Mettre le contenu d'une variable String dans un tableau de String
    Par patriot dans le forum Collection et Stream
    R�ponses: 14
    Dernier message: 31/05/2011, 15h25
  3. R�ponses: 2
    Dernier message: 18/09/2010, 22h33
  4. inserer une string dans une liste de string
    Par la_reine dans le forum D�buter avec Java
    R�ponses: 5
    Dernier message: 14/05/2008, 08h07
  5. tableaux de String dans un vector
    Par aymanouch dans le forum Langage
    R�ponses: 2
    Dernier message: 08/04/2007, 12h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo