Supposons que l'on nous donne une collection de chaînes, S 1 , … , S n . Je voudrais savoir si l'une de ces chaînes est une sous-chaîne d'une autre chaîne de la collection. En d'autres termes, j'aimerais un algorithme pour la tâche suivante:
Entrée:
Sortie: telle que S i est une sous-chaîne de S j et i ≠ j , ou None si aucune telle i , j n'existe
Existe-t-il un algorithme efficace pour cela?
Si nous remplaçons «sous-chaîne» par «préfixe», il existe un algorithme efficace (triez les chaînes, puis effectuez un balayage linéaire pour comparer les chaînes adjacentes; le tri garantira que les sous-chaînes sont adjacentes). Mais il semble plus difficile de tester si une chaîne est une sous-chaîne d'une autre chaîne. Un algorithme naïf consiste à parcourir toutes les paires , mais cela nécessite des tests de sous-chaîne Θ ( n 2 ) . Existe-t-il un algorithme plus efficace?
Je suppose que nous pourrions appeler cela "test de sous-chaîne toutes paires", ou quelque chose comme ça.
Mon but ultime est d'élaguer la collection afin qu'aucune chaîne ne soit une sous-chaîne d'une autre, en supprimant chacune qui est une sous-chaîne de quelque chose d'autre dans la collection.
Réponses:
Vous pouvez créer un arbre de suffixes en temps linéaire et vérifier s'il y a un nœud interne qui correspond à une chaîne complète (temps constant par nœud).
Plus en détail, supposons que l'on nous donne des chaînes .s1,…,sn∈Σ∗
Construisez un arbre de suffixes (généralisé) de avec n marqueurs de terminal distincts par paire $ 1 , … , $ n ∉ Σ .s1$1,s2$2,…,sn$n n $1,…,$n∉Σ
En utilisant l'algorithme d'Ukkonen , cela peut être fait en temps linéaire; linéaire dans la somme de toutes les longueurs de chaîne.
Cela prend du temps linéaire dans la taille de l'arbre, qui lui-même est linéaire dans la taille d'entrée.
Cela prend à nouveau du temps linéaire.
Les marqueurs terminaux distincts ne sont pas vraiment nécessaires; une seule utilisée pour terminer toutes les chaînes est tout à fait suffisante tant que vous autorisez plusieurs étiquettes par feuille.
la source