🔍 Suffix Arrays : Manipulation Efficace des Chaînes de Caractères

Les Suffix Arrays sont des structures de données puissantes pour manipuler des chaînes de caractères. Ils permettent des recherches rapides de motifs et résolvent efficacement des problèmes liés aux sous-chaînes.

📚 Qu'est-ce qu'un Suffix Array ?

Un Suffix Array est un tableau contenant tous les suffixes d'une chaîne de caractères, triés par ordre lexicographique. Chaque suffixe est représenté par son index de début dans la chaîne.

Illustration d'un Suffix Array

Exemple :

Pour la chaîne "banana", les suffixes sont :

  • "banana"
  • "anana"
  • "nana"
  • "ana"
  • "na"
  • "a"

Triés par ordre lexicographique, le Suffix Array contient leurs indices : [5, 3, 1, 0, 4, 2].

🔗 Longest Common Prefix (LCP) Array

Le LCP Array est une structure complémentaire au Suffix Array. Il stocke la longueur du préfixe commun le plus long entre chaque paire de suffixes adjacents dans le Suffix Array.

🛠️ Applications des Suffix Arrays

Les Suffix Arrays sont utilisés dans divers problèmes de traitement de chaînes de caractères :

  • 🔍 Recherche de Sous-chaînes : Trouver efficacement si un motif est présent dans une chaîne.
  • 📊 Nombre de Sous-chaînes Uniques : Compter toutes les sous-chaînes uniques d'une chaîne.
  • 🧩 Longest Common Substring (LCS) : Trouver la plus longue sous-chaîne commune entre deux chaînes.
  • ♻️ Longest Repeated Substring : Trouver la plus longue sous-chaîne qui se répète dans une chaîne.

💻 Implémentation en Python

def build_suffix_array(s):
    suffixes = [(s[i:], i) for i in range(len(s))]
    suffixes.sort()
    suffix_array = [suffix[1] for suffix in suffixes]
    return suffix_array

def build_lcp_array(s, suffix_array):
    n = len(s)
    rank = [0] * n
    lcp = [0] * n
    for i, suffix in enumerate(suffix_array):
        rank[suffix] = i
    h = 0
    for i in range(n):
        if rank[i] > 0:
            j = suffix_array[rank[i] - 1]
            while i + h < n and j + h < n and s[i + h] == s[j + h]:
                h += 1
            lcp[rank[i]] = h
            if h > 0:
                h -= 1
    return lcp

# Exemple d'utilisation
s = "banana"
suffix_array = build_suffix_array(s)
lcp_array = build_lcp_array(s, suffix_array)
print("Suffix Array:", suffix_array)
print("LCP Array:", lcp_array)

Explication du Code :

  • build_suffix_array : Construit le Suffix Array en triant les suffixes de la chaîne.
  • build_lcp_array : Construit le LCP Array en calculant les préfixes communs les plus longs entre suffixes adjacents.

🎉 Conclusion

Les Suffix Arrays sont des structures de données essentielles pour résoudre des problèmes complexes de manipulation de chaînes de caractères. En les combinant avec le LCP Array, ils permettent d'effectuer des recherches rapides et d'optimiser des calculs sur des sous-chaînes.

💪 Exercices

Testez vos connaissances avec ces exercices :

# Exercices :

# 1. Implémentez un algorithme efficace pour construire un Suffix Array en O(n log n).

# 2. Écrivez une fonction pour rechercher un motif dans une chaîne en utilisant le Suffix Array.

# 3. Utilisez le Suffix Array et le LCP Array pour trouver la plus longue sous-chaîne répétée dans une chaîne donnée.

# 4. Modifiez l'implémentation pour prendre en charge plusieurs chaînes et trouver la plus longue sous-chaîne commune.

# 5. Comparez les performances du Suffix Array avec celles d'un Suffix Tree pour des opérations similaires.