Recherche binaire

lyla12 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
lyla12 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -
bonjour,
j'ai ce bout code qui parcourt une liste de mots (beaucoup beaucoup de mot) et j'aimerai diminuer le temps d'exécution (trouver un mot plus rapidement dans la liste). pouvez vous m'aider à faire une recherche binaire, svp?
mercii

 public static long nbrMots(String mot) {
  long compt = 0;
  for(ArrayList<String>words : mots){

   for(int i=0; i<words.size();i++) {

     if (mot.equalsIgnoreCase(to.get(i))) {
      ++compt;
      i = to.size();
     }
    }
   }

 return compt;
}

1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

Il manque des éléments pour bien comprendre ce que tu fais, par exemple les types de
mots
et
to
et un exemple de leurs valeurs parce que j'avoue que le
i = to.size();
me laisse perplexe...

Remarque : une recherche dichotomique suppose que les données soient triées, mais pour l'instant j'ai du mal à comprendre ta structure de données pour l'améliorer.
0
lyla12 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
j'ai une liste de plusieurs mots qui est l'ArrayList<String>words, en ce qui concerne le to.size() excusez moi je me suis trompée. c'est words.size(). donc mon code est le suivant:

public static long nbrMots(String mot) {
  long compt = 0;
  for(ArrayList<String>words : mots){

   for(int i=0; i<words.size();i++) {

     if (mot.equalsIgnoreCase(words.get(i))) {
      ++compt;
      i = words.size();
     }
    }
   }

 return compt;
}
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Si tu as une seule liste de mots, tu ne devrais avoir qu'une seule boucle for, ce qui réduira considérablement la durée de ton programme.

Remarque : tu ne pourras pas avoir un nombre d'éléments en long, la taille d'une Collection est toujours un int.

private static List<String> words = ...

public static int nbrMots(String mot) {
    int compt = 0;
    for (String word : words)
        if (mot.equalsIgnoreCase(word))
            compt++;
    return compt;
}

Quant à optimiser ton calcul, tu peux faire une Map comme ceci :

private static List<String> words = ...
private static Map<String, Integer> nbWordsByLowerCaseWord = words.parallelStream()
    .collect(Collectors.toMap(w -> w.toLowerCase(), w -> 1, (n1, n2) -> n1 + n2));

public static int nbrMots(String mot) {
    return nbWordsByLowerCaseWord.get(mot.toLowerCase());
}
0
lyla12 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
Merci beaucoup :)
0