Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
| tc_info:2023-td-texte-corr [2023/11/29 12:51] – [Exercice 5] edauce | tc_info:2023-td-texte-corr [2023/12/01 09:49] (Version actuelle) – [Exercice 4 : Expressions régulières] edauce | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ==== Exercice 1 : Chercher un mot ==== | ||
| + | Soit une chaîne de caractères '' | ||
| + | - Donner l' | ||
| + | - Donner de même l' | ||
| + | - On suppose qu'on peut tester si un caractère '' | ||
| + | <note tip> | ||
| + | on note '' | ||
| + | |||
| + | < | ||
| + | Algo : recherche_simple | ||
| + | Données : d, t : chaînes de caractères | ||
| + | n = len (d) | ||
| + | m = len (t) | ||
| + | i <-- 0 | ||
| + | tant que i < n - m: | ||
| + | j <-- 0 | ||
| + | tant que j < m et d[i+j] = t[j] : | ||
| + | j += 1 | ||
| + | si j == m : | ||
| + | | ||
| + | sinon : | ||
| + | i <-- i + 1 | ||
| + | </ | ||
| + | |||
| + | Le deuxième est plus ou moins pareil | ||
| + | < | ||
| + | Algo : recherche_multiple | ||
| + | Données : d, t : chaînes de caractères | ||
| + | n = len (d) | ||
| + | m = len (t) | ||
| + | l = [] | ||
| + | i <-- 0 | ||
| + | tant que i < n - m: | ||
| + | j <-- 0 | ||
| + | tant que j < m et d[i+j] = t[j] : | ||
| + | j += 1 | ||
| + | si j == m : | ||
| + | | ||
| + | i <-- i + 1 | ||
| + | retourner l | ||
| + | </ | ||
| + | |||
| + | |||
| + | Cette approche a un inconvénient : après une comparaison infructueuse, | ||
| + | |||
| + | ** Algorithme de Boyer-Moore ** | ||
| + | |||
| + | L' | ||
| + | |||
| + | * On suppose qu'on peut tester si un caractère '' | ||
| + | * Le but est de calculer un décalage permettant de ne pas inspecter les positions où il n'y a aucune chance de trouver le motif '' | ||
| + | * On commence par chercher la position '' | ||
| + | * Soit '' | ||
| + | * Si '' | ||
| + | * Sinon on note '' | ||
| + | * si '' | ||
| + | * Sinon le décalage est égal à '' | ||
| + | |||
| + | |||
| + | **Exemple: | ||
| + | RECHERCHE DE CHAINES CODEES EN MACHINE | ||
| + | CHINE | ||
| + | CHINE | ||
| + | CHINE | ||
| + | CHINE | ||
| + | CHINE | ||
| + | CHINE | ||
| + | CHINE | ||
| + | CHINE | ||
| + | CHINE | ||
| + | RECHERCHE DE CHAINES CODEES EN MACHINE | ||
| + | |||
| + | |||
| + | Voici le code : | ||
| + | < | ||
| + | Algo : recherche améliorée | ||
| + | Données : d, t : chaînes de caractères | ||
| + | n = len (d) | ||
| + | m = len (t) | ||
| + | i <-- m - 1 | ||
| + | tant que i < n : | ||
| + | # PRE-TRAITEMENT | ||
| + | c = d[i] | ||
| + | si c appartient à t: | ||
| + | k <-- dernière_occurrence(c, | ||
| + | si k == m-1: | ||
| + | | ||
| + | | ||
| + | | ||
| + | sinon: | ||
| + | | ||
| + | # TRAITEMENT | ||
| + | j <-- 0 | ||
| + | tant que j < m : | ||
| + | si t[m - j - 1] = d[i - j] | ||
| + | j += 1 | ||
| + | sinon | ||
| + | break | ||
| + | si j = m: | ||
| + | retourner i - m + 1 | ||
| + | # DECALAGE | ||
| + | i <-- i + decalage | ||
| + | retourner -1 | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Exercice 2 : Compter les mots ==== | ||
| + | 1. Écrire un algorithme qui compte le nombre de mots dans un texte. | ||
| + | |||
| + | Remarque : On considère comme caractère d' | ||
| + | |||
| + | 2. Dessiner l' | ||
| + | |||
| + | <note tip> | ||
| + | |||
| + | Algorithme à expliquer avec un petit automate fini à deux états | ||
| + | |||
| + | {{: | ||
| + | <code python> | ||
| + | def compte_mots(d): | ||
| + | state = 0 | ||
| + | cpt = 0 | ||
| + | for i in range(len(d)): | ||
| + | if state == 0 and is_alpha(d[i]): | ||
| + | state = 1 | ||
| + | cpt += 1 | ||
| + | if state == 1 and is_sep(d[i]): | ||
| + | state = 0 | ||
| + | return cpt | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Exercice 3 : Palindrome ==== | ||
| + | 1. Écrire un algorithme récursif permettant de savoir si un tableau de caractères est un palindrome (un palindrome se lit "à l' | ||
| + | |||
| + | Remarque : on ne considère ni la ponctuation, | ||
| + | |||
| + | Quelle est sa complexité? | ||
| + | |||
| + | <note tip> | ||
| + | **C' | ||
| + | </ | ||
| + | |||
| + | 2. Pouvez-vous définir un automate fini capable de reconnaître les palindromes? | ||
| + | |||
| + | <note tip> | ||
| + | L' | ||
| + | si on limite la taille max des palindromes mais pas dans le cas général. Par ailleurs, le nb d' | ||
| + | |||
| + | La solution consisterait à utiliser un automate à pile (non vu en cours). On a alors deux états principaux : un état correspondant à l' | ||
| + | </ | ||
| + | ==== Exercice 4 : Expressions régulières ==== | ||
| + | |||
| + | * Les langages réguliers sont des types de langages formels qui peuvent être reconnus par un automate fini. | ||
| + | * Le langage des expressions régulières est un langage régulier qui permet de décrire des motifs (c'est à dire des classes de mots) dans une chaîne de caractère. | ||
| + | |||
| + | ** 1. Donnez l' | ||
| + | |||
| + | <note tip> | ||
| + | Réponse : '' | ||
| + | * le chiffre commence par +, - ou rien du tout | ||
| + | * il n’y a pas de 0 au début de la partie entière | ||
| + | * il n’y a pas de caractère entre, seulement des chiffres au milieu. | ||
| + | |||
| + | Automate qui reconnaît les nombres entiers: | ||
| + | {{: | ||
| + | </ | ||
| + | |||
| + | ** 2. Donnez l' | ||
| + | |||
| + | <note tip> | ||
| + | Réponse : '' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | </ | ||
| + | |||
| + | ** 3. Donnez l' | ||
| + | |||
| + | <note tip> | ||
| + | Réponse : '' | ||
| + | |||
| + | {{: | ||
| + | </ | ||
| + | |||
| + | ** 4. Donnez une expression régulière pour reconnaître les URL commençant par {{https:// | ||
| + | |||
| + | Correction : | ||
| + | < | ||
| + | https:// | ||
| + | </ | ||
| + | |||
| + | ** 5. Écrivez une expression régulière pour reconnaître la date et l' | ||
| + | Correction : | ||
| + | < | ||
| + | \d\d\d\d-(0[1-9]|1[12])-(0[1-9]|[12][0-9]|3[0-1]) \((0[0-9]|1[0-9]|2[0-3]): | ||
| + | </ | ||
| + | |||
| + | ==== Exercice 5 ==== | ||
| + | |||
| + | 1. **Ecrire l' | ||
| + | <code python> | ||
| + | def reconnait(s): | ||
| + | final = False | ||
| + | for c in s: | ||
| + | if final: | ||
| + | final = False | ||
| + | break | ||
| + | if (c not in ' | ||
| + | break | ||
| + | if c==' | ||
| + | final = True | ||
| + | return final | ||
| + | </ | ||
| + | |||
| + | 2. **Dessiner son automate fini** | ||
| + | |||
| + | {{: | ||
| + | |||
| + | 3. **Soit '' | ||
| + | |||
| + | <code python> | ||
| + | G = { 0 : {' | ||
| + | |||
| + | def reconnait_auto(s, | ||
| + | state = 0 | ||
| + | for c in s: | ||
| + | if c in G[state]: | ||
| + | state = G[state][c] | ||
| + | else: | ||
| + | return False | ||
| + | if state == 1: | ||
| + | return True | ||
| + | else: | ||
| + | return False | ||
| + | | ||
| + | </ | ||
| + | |||
| + | 4. **Quelle est sa complexité? | ||
| + | |||
| + | Longueur de la chaîne | ||
| + | |||
| + | |||
| + | ==== Exercice 6 ==== | ||
| + | 1. **Même exercice avec l' | ||
| + | |||
| + | <code python> | ||
| + | def reconnait_nd(s): | ||
| + | transit_a = False | ||
| + | final_b = False | ||
| + | for c in s: | ||
| + | if (c not in ' | ||
| + | break | ||
| + | if c==' | ||
| + | if transit_a: | ||
| + | transit_a = False | ||
| + | final_b = True | ||
| + | else: | ||
| + | final_b = False | ||
| + | if c == ' | ||
| + | final_b = False | ||
| + | transit_a = True | ||
| + | return final_b | ||
| + | </ | ||
| + | |||
| + | 2. **Dessiner son automate fini** | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Voir le graphe '' | ||
| + | G = { 0 : {' | ||
| + | |||
| + | 3. **Soit '' | ||
| + | |||
| + | <code python> | ||
| + | def reconnait_auto_nd(s, | ||
| + | states = set((0,)) | ||
| + | for c in s: | ||
| + | previous_states = states | ||
| + | states = set() | ||
| + | for state in previous_states: | ||
| + | if c in G[state]: | ||
| + | next_states = G[state][c] | ||
| + | for state in next_states: | ||
| + | states.add(state) | ||
| + | print(c, states) | ||
| + | if len(states) == 0 : | ||
| + | return False | ||
| + | if 2 in states: | ||
| + | return True | ||
| + | else: | ||
| + | return False | ||
| + | </ | ||
| + | |||
| + | 4. **Complexité** | ||
| + | |||
| + | <note tip> | ||
| + | $O(n \times l)$ avec $n$ le nb d' | ||
| + | |||
| + | </ | ||