**a.** Nombre de positions testées : n - m + 1 = 11 - 4 + 1 = **8 positions** (indices 0 à 7)
**b.** Le motif `"abra"` est trouvé aux positions :
- **Position 0** : `abra`cadabra
- **Position 7** : abracad`abra`
### Question 2
L'algorithme de Boyer-Moore est plus efficace car :
1.**Comparaison de droite à gauche** : En cas d'échec sur un caractère qui n'existe pas dans le motif, on peut sauter tout le motif d'un coup.
2.**Sauts importants** : Plus le motif est long, plus les sauts potentiels sont grands. Par exemple, avec un motif de 10 caractères et un caractère non présent dans le motif, on peut avancer de 10 positions.
3.**Cas favorable** : Si l'alphabet est grand et le motif long, Boyer-Moore peut avoir une complexité sous-linéaire O(n/m) dans le meilleur cas.
**Exemple** : Rechercher `"ALGORITHME"` dans un texte. Si on tombe sur un `"Z"` (absent du motif), on saute directement de 10 caractères.
- À chaque position, on compare les 3 premiers 'a' avec succès, puis échec sur 'b'
- Soit 4 comparaisons par position
**Total : 7 × 4 = 28 comparaisons**
**b.** Ce cas est défavorable car :
- Le motif partage un long préfixe avec le texte (`"aaa"`)
- À chaque tentative, on effectue presque toutes les comparaisons avant l'échec
- On ne décale que d'une position à chaque fois
- C'est le pire cas : beaucoup de comparaisons pour peu d'avancement
Ce type de motif (caractères répétés suivis d'un caractère différent) maximise le nombre de comparaisons.
### Exercice 4 : Table des dernières occurrences
Pour le motif `"EXEMPLE"` (indices 0 à 6) :
| Caractère | Dernière position |
|-----------|-------------------|
| E | 6 |
| X | 1 |
| M | 3 |
| P | 4 |
| L | 5 |
**Note** : Le caractère 'E' apparaît aux positions 0 et 6. On garde la dernière occurrence (6).
**Construction en Python** :
```python
def table_occurrences(motif):
table = {}
for i in range(len(motif)):
table[motif[i]] = i
return table
>>> table_occurrences("EXEMPLE")
{'E': 6, 'X': 1, 'M': 3, 'P': 4, 'L': 5}
```
**Utilisation** : Si on rencontre un caractère 'X' lors d'un échec, on sait que la dernière occurrence de 'X' dans le motif est à la position 1. On peut donc calculer le décalage optimal.
---
Auteur : Florian Mathieu
Licence CC BY NC
<arel="license"href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><imgalt="Licence Creative Commons"style="border-width:0"src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"/></a><br/>Ce cours est mis à disposition selon les termes de la <arel="license"href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.