7
votes

Comment calculer des préfixes uniques les plus courts d'un ensemble de chaînes?

C'est un algorithme assez commun dans ligne de commande analysant forte>. Compte tenu d'un ensemble de noms d'options longs prédéfinis - calculez le préfixe le plus court identifiant une de ces options. Donc, par exemple, pour les options suivantes:

for (String s : strings) {
   for (int i = 1; i < s.length(); s++) {
      if (search(strings,s.substring(0,i)) == 1) {
          result.add(s.substring(0,i);
          break;
      }
   }
}


5 commentaires

Contexte, contexte, contexte! J'irais pour celui qui était mieux dans mon scénario.


L'option 1 semble être la meilleure façon d'y aller. Fast, précis et droit ...


Le contexte est une analyse de ligne de commande - ainsi, elle serait construite une fois et utilisée une fois. Comme il s'agit de la poubelle collectée et la plupart des systèmes d'exploitation limitent les lignes de commande bien moins de 1 Mo d'utilisation de la mémoire n'est pas un problème. La performance doit être équilibrée entre la construction de la structure et la recherche ultérieure, car, en général, ne sera effectuée qu'une seule fois.


Qu'est-ce que vous optimisez-vous? Vitesse, utilisation de la mémoire, maintenabilité?


Vitesse et maintenabilité Je dirais. Les définitions de l'argument de ligne de commande ne sont généralement analysées qu'une seule fois pour la durée de la demande et les arguments réels sont très analysés plus d'une fois.


3 Réponses :


5
votes

La solution "Tree" est un cas particulier (bien, en fait, c'est assez général) d'un Patricia Trie .

Le premier sera généralement plus rapide à la recherche. Les considérations de mémoire ne sont probablement pas pertinentes pour votre contexte, car elles ne sont pas utilisées en permanence et que vous n'effectuez que la "recherche" une fois.


0 commentaires

0
votes

Je ferais l'arbre, a l'air bien.

Vous pouvez accumuler un hachage de chaque sous-chaîne distincte possible. P>

Hashmap<String, String> validSubs = new Hashmap<String, String>();
HashSet<String> usedSubs = new HashSet<String>();

for (String option : options) {
  for(int i = 0; i <= option.length; i++) {
    String sub = option.substring(0, i);
    if(usedSubs.contains(sub)) {
      validSubs.remove(sub);
    } else {
      validSubs.add(sub, option);
      usedSubs.add(sub);
    }
  }
}


0 commentaires