Recherche binaire

Fermé
lyla12 Messages postés 3 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 14 décembre 2018 - Modifié le 13 déc. 2018 à 07:41
lyla12 Messages postés 3 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 14 décembre 2018 - 14 déc. 2018 à 00:58
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
13 déc. 2018 à 07:49
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 jeudi 13 décembre 2018 Statut Membre Dernière intervention 14 décembre 2018
Modifié le 13 déc. 2018 à 22:29
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
13 déc. 2018 à 22:49
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 jeudi 13 décembre 2018 Statut Membre Dernière intervention 14 décembre 2018
14 déc. 2018 à 00:58
Merci beaucoup :)
0