[Serie 3, exercice 5.a.] Complexite nombre de mots dans une phrase

[Serie 3, exercice 5.a.] Complexite nombre de mots dans une phrase

par Niels Marie Olivier Vadot,
Number of replies: 3

Bonjour a tous,

Pour l'exercice 5.a. dont le but est de trouver le nombre de mots dans une chaine de caracteres, j'ai ecrit l'algorithme suivant:

phrase := "     hello   world !!!   "
counter := 0

POUR chaque lettre:
PENDANT QUE la lettre est un espace:
passer a la lettre suivante

 SI la lettre est la derniere:
sortir de la boucle

 PENDANT QUE la lettre n'est pas un espace:
passer a la lettre suivante

counter = counter + 1

SORTIR counter

Explication (j'utilise le caractere | pour indiquer ou on en est dans les iterations):

"|     hello   world !!!   "
On saute tous les espaces
On n'est pas encore a la fin, donc on continue
" |hello world !!! "
On saute tous les non-espaces
" hello| world !!! "
On a trouve la fin d'un mot, donc on peut incrementer le compteur de mots
etc...
"     hello   world !!!|   "
On saute tous les espaces
On est a la fin, donc on sort sans incrementer la valeur de counter
" hello world !!! |"

La raison pour laquelle j'ai une verification de la derniere lettre est pour les chaines suivantes:

"                  " et "hello             "

Sans la verification, l'algorithme compte un dernier espace comme un mot.
En p.j., mon implementation en c++ pour ceux qui veulent le tester.

Ma question est: comment calculer la complexite de cet algorithme ?

Si on prend n le nombre de caracteres dans la phrase, la boucle POUR compte pour n
Les pires cas pour les PENDANT QUE sont que la phrase soit composee d'espaces ou de lettres uniquement. MAIS ils ont comme effet de diminuer la longueur de la boucle POUR.
En somme, on aura toujours n iterations, qu'elles soient faites dans la boucle POUR ou PENDANT QUE, et les instructions SI et affectation ne feront qu'augmenter le multiple de n, ce qui ne change pas la complexite.

Ais-je alors raison de dire que l'algorithme a une complexite O(n) ?

Merci

In reply to Niels Marie Olivier Vadot

Re: [Serie 3, exercice 5.a.] Complexite nombre de mots dans une phrase

par Parzival Hans Nussbaum,

Ton raisonnement pour la complexité me semble correct. 

Mais ton programme C++ va essayer de lire des caractères avec un index en-dehors  du string. Pour chaque string qui na pas d’espaces comme dernier caractère. Le opérateur « [] » ne fait pas de bound check. Ça veut dire que tu vas soit lire une valeure arbitraire de la mémoire où causer un crash de ton programme - le comportement n’est pas défini!

On peut écrire aussi un algorithme sans utiliser des boucles dans des boucles pour résoudre ce problème. 

In reply to Parzival Hans Nussbaum

Re: [Serie 3, exercice 5.a.] Complexite nombre de mots dans une phrase

par Niels Marie Olivier Vadot,

Merci pour la reponse rapide !

J'ai ajoute une protection dans les boucles WHILE, je pense que c'etait le probleme que tu evoquais. Le nouveau programme est en pj. Pourrais tu le verifier ? :)

J'ai du mal a voir comment on pourrait se passer des boucles pour resoudre le probleme... Il faudrait pourtant au moins une boucle FOR afin d'iterer toutes les lettres ? Je vois bien en revanche comment on pourrait se passer des boucles WHILE.

Merci beaucoup !

In reply to Niels Marie Olivier Vadot

Re: [Serie 3, exercice 5.a.] Complexite nombre de mots dans une phrase

par Parzival Hans Nussbaum,
Oui le problème apparaît d’être résolu avec la protection. Des erreurs pareilles puissent être très difficile à debuger dans des grand project, car leur comportement est non déterminée. C’est pourqui on doit être très prudent quand on travaille avec plusieurs boucles.

Peut-être je me ne suis pas exprimé assez claire ;) Tu as bien sûr besoin d’au moins une boucle pour itérer sur tout les caractères du string. 

En annexe tu trouves une solution alternative qui utilise une seule boucle.

Attachment 463C8E36-0A5A-42A1-AC57-3A5977EE4FA7.jpeg