Recherche binaire

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

  1. Modérateur
    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.
    1. 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;
      }
    2. Modérateur
      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());
      }
    3. Merci beaucoup :)