IN 101 - Cours 7 1 Passage d’argument par adresse Une fonction ne peut retourner qu’une seule valeur au plus. On voudrait parfois plusieurs valeurs résultat. En C, les paramètres sont passés par valeur : 1. Ils sont évalués, 2. ils sont copiés sur la pile avant l’appel. ⇒ Impossible de modifier une variable de l’appelant depuis l’appelé. Pour s’en sortir, dans la fonction appelante on va passer l’adresse des variables dans lesquelles stocker ( retourner ) les résultats. Dans la fonction appelée, l’argument reçu est une adresse, donc le paramètre est un pointeur. #include <s t d i o . h> void f ( i n t ∗v ) { ( ∗v )++ ; } i n t main ( ) { int x = 5 ; f ( &x ) ; p r i n t f ( ”x = %d\n” , x ) ; return ( 0 ) ; } // On a t t e n d 6 comme a f f i c h a g e . Un tableau étant un pointeur sur la 1ère case, il est forcément passé par adresse. 2 Complexité Il existe toujours plusieurs algorithmes pour résoudre un problème. Certains sont plus efficaces que d’autres. La complexité d’un algorithme mesure asymptotiquement son efficacité intrinsèque en fonction de la taille des données à traiter. L’efficacité en terme de mémoire est la complexité spatiale. L’efficacité en terme de temps est la complexité temporelle. 2.1 Complexité temporelle On compte le nombre d’opérations évolue asymptotiquement. de base nécessaires et on regarde comment ce nombre On cherche à encadrer ce nombre lorsque la taille de l’entrée tend vers +∞. 1 2.1.1 Notations O(g) : ensemble des fonctions f telles que 0 ≤ f (x) ≤ k × g(x). — avec k ∈ N∗ — t ∃x0 ∈ N∗ , ∀x ≥ x0 . θ(g) : ensemble des fonctions f telles que k1 × g(x) ≤ f (x) ≤ k2 × g(x) — avec k1 , k2 ∈ N∗ — et ∃x0 ∈ N∗ , ∀x ≥ x0 . Une fonction f a une complexité en O(g) si f ∈ O(g) (respectivement en θ). Par convention au lieu d’écrire f ∈ O(g) on écrit f = O(g). 2.1.2 Exemple x2 + x + 1 = θ(n2 ) 2.1.3 Classement de complexités log(n) √ n n n n log(n) n2 n3 2n exp(n) n! nn 22 Un algorithme avec une complexité polynomiale (nk ) est souvent utilisable. À partir d’une complexité exponentielle (k n ) un algorithme devient rapidement inutilisable. 2.1.4 Théorie de la complexité But : classifier des problèmes en fonction de la complexité du meilleur algorithme pour les résoudre. On ne sait pas toujours prévoir la complexité optimale. Problème : question comportant un ou plusieurs paramètres. Problème de décision : problème dont la solution ∈ {oui, non}. Les deux classes de problèmes dont on parle le plus sont : — Classe P : Ensemble des problèmes de décision résolubles en temps polynomial. — Classe NP : Ensemble des problèmes de décision dont la solution peut être vérifiée en temps polynomial quand la réponse est oui . Un problème est dit NP -complet si c’est un problème dans NP au moins aussi difficile que tout autre problème de NP. Les algorithmes connus pour résoudre des problèmes NP -complets ont une complexité temporelle exponentielle. Ils sont donc inexploitables en pratique. 2