]> AND Private Git Repository - cours-mesi.git/blob - complexite.tex
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
initialisation
[cours-mesi.git] / complexite.tex
1 \section{Complexité}
2
3 \subsection{Quelques définitions}
4
5 Soit $\mathcal{F}$ l'ensemble des fonctions de
6 $\N$ dans $\R^*_+$. 
7 \begin{Def}[fonctions asymptotiquement dominées]
8 Soit $f \in \mathcal{F}$. L'ensemble $\mathcal{O}(f)$ 
9 des fonctions \emph{asymptotiquement dominées par} $f$ est défini par
10 $$
11 \mathcal{O}(f) = 
12 \large\{ g \in \mathcal{F} \textrm{ t. q. }
13 \exists n_0 \in \N, 
14 \exists c \in \R_+,
15 \forall n \geq n_0,
16 g(n) \leq c f(n)
17 \large\}.
18 $$
19 Ainsi, à partir d'un rang $n_0$, $g(n)$ est majorée par $c f(n)$.
20 \end{Def}
21
22 \begin{Prop}
23 Soit $f$ et $g$ deux fonctions de $\mathcal{F}$. Si 
24 $\lim_{n \rightarrow + \infty} \frac{f(n)}{g(n)} = l $
25 alors on a 
26 $\mathcal{O}(f) =  
27 \mathcal{O}(g)$
28 \end{Prop}
29
30
31 On confond dans ce qui suit la fonction $n \mapsto f(n)$ avec $f(n)$.
32
33 \begin{Exo}
34 Que dire de:
35 \begin{enumerate}
36 \item  $2^{n+1}$  et $\mathcal{O}(2^{n})$?
37 \item  $({n+1})!$  et $\mathcal{O}(n!)$?
38 \end{enumerate}
39 \end{Exo}
40
41 \begin{Prop}
42 Soit deux réels $\epsilon$ et $c$ vérifiant $0 < \epsilon <  1 < c$. Alors on a 
43
44 $
45 \mathcal{O}(1) \subset 
46 \mathcal{O}(\ln(n)) \subset 
47 \mathcal{O}(n^{\epsilon}) \subset 
48 \mathcal{O}(n) \subset 
49 \mathcal{O}(n \ln(n)) \subset 
50 \mathcal{O}(n^c) \subset 
51 \mathcal{O}(c^n) \subset 
52 \mathcal{O}(n!)
53 $
54 \end{Prop}
55
56 \begin{Def}[fonctions dominant asymptotiquement]
57 Soit $f \in \mathcal{F}$. L'ensemble $\Omega(f)$ 
58 des fonctions \emph{dominant asymptotiquement} $f$ est défini par
59 $$
60 \Omega(f) = 
61 \large\{ g \in \mathcal{F} \textrm{ t. q. }
62 \exists n_0 \in \N, 
63 \exists c \in \R_+,
64 \forall n \geq n_0,
65 g(n) \geq c f(n)
66 \large\}.
67 $$
68 Ainsi, à partir d'un rang $n_0$, $g(n)$ majore $c f(n)$.
69 \end{Def}
70
71
72 \begin{Prop}
73 Soit $f$ et $g$ deux fonctions de $\mathcal{F}$. Si 
74 $\lim_{n \rightarrow + \infty} \frac{f(n)}{g(n)} = l $
75 alors on a 
76 $\Omega(f) =  
77 \Omega(g)$
78 \end{Prop}
79
80 \begin{Prop}
81 Soit deux réels $\epsilon$ et $c$ vérifiant $0 < \epsilon <  1 < c$. Alors on a 
82
83 $
84 \Omega(1) \supset 
85 \Omega(\ln(n)) \supset 
86 \Omega(n^{\epsilon}) \supset 
87 \Omega(n) \supset 
88 \Omega(n \ln(n)) \supset 
89 \Omega(n^c) \supset 
90 \Omega(c^n) \supset 
91 \Omega(n!)
92 $
93 \end{Prop}
94
95 \begin{Def}[fonctions asymptotiquement équivalentes]
96 Soit $f \in \mathcal{F}$. L'ensemble $\Theta(f)$ 
97 des fonctions \emph{asymptotiquement équivalentes} à  $f$ est défini par
98 $$
99 \Theta(f) = 
100 \large\{ g \in \mathcal{F} \textrm{ t. q. }
101 \exists n_0 \in \N, 
102 \exists c, c' \in \R_+,
103 \forall n \geq n_0,
104 c f(n) \leq g(n) \leq c' f(n)
105 \large\}.
106 $$
107 \end{Def}
108
109
110 \begin{Prop}
111 Soit $f$ et $g$ deux fonctions de $\mathcal{F}$. Si 
112 $\lim_{n \rightarrow + \infty} \frac{f(n)}{g(n)} = l $
113 alors on a 
114 $f \in \Theta(g)$ et   
115 $g \in \Theta(f)$.
116 \end{Prop}
117
118 \begin{Prop}
119 Soit $f$, $f_1$,  et $g$ des fonctions de $\mathcal{F}$. Si 
120 $f \in \Theta(g)$ et si $\lim_{n \rightarrow + \infty} \frac{f_1(n)}{g(n)} = 0 $
121 alors on a 
122 $f  + f_1 \in \Theta(g)$.
123 \end{Prop}
124
125
126 \subsection{Mesurer la complexité}
127 Soit $\mathcal{A}(n)$ un algorithme résolvant un problème sur des données 
128 de taille $n$, $n \in \N$. On suppose que l'exécution de $\mathcal{A}$ 
129 coûte $T(n)$ étapes informatiques élémentaires ou unités de temps. 
130
131 \begin{Def}[Pire des cas]
132 L'algorithme $\mathcal{A}(n)$ a une \emph{complexité du pire des cas}
133 dans $\mathcal{O}(f(n))$ si $T(n) \in \mathcal{O}(f(n))$.   
134 On dit que $\mathcal{A}$ est en $\mathcal{O}(f(n))$.
135 \end{Def}
136
137 Attention, la majoration proposée doit être la plus fine possible.
138 De plus, celle-ci doit être valide au delà d'une valeur $n$ supérieure 
139 à un seuil $n_0$. 
140  
141
142 \begin{Def}[Meilleur des cas]
143 L'algorithme $\mathcal{A}(n)$ a une \emph{complexité du meilleur des cas}
144 dans $\Omega(f(n))$ si $T(n) \in \Omega(f(n))$.   
145 On dit que $\mathcal{A}$ est en $\Omega(f(n))$.
146 \end{Def}
147
148 \begin{Def}[ordre de grandeur d'un temps d'exécution]
149 L'algorithme $\mathcal{A}(n)$ a une \emph{complexité} en
150 $\Theta(f(n))$ si $T(n) \in \Theta(f(n))$.   
151 On dit que $\mathcal{A}$ est en $\Theta(f(n))$.
152 \end{Def}
153
154 On note que si $T(n) \in \Theta(f(n))$, alors 
155 $T(n) \in \mathcal{O}(f(n))$ et $T(n) \in \Omega(f(n))$.
156 Lorsque 
157 $T(n) \in \Theta(n)$, on dit que l'algorithme est \emph{linéaire en $n$} 
158 et lorsque 
159 $T(n) \in \Theta(n^2)$, on dit que l'algorithme est \emph{quadratique en $n$}.
160
161 \subsection{Exemples d'étude de complexité}
162
163 \subsubsection{Un premier algo}
164 Soit $p$ une fonction polynôme de degré $n$ définie par 
165 $
166 p(x) = \sum_{i=0}^n a_i x^i
167 $.
168 On considère tout d'abord l'algorithme suivant: 
169
170
171
172
173
174 \begin{algorithm}[H]
175  \LinesNumbered 
176  \SetAlgoLined
177  \KwData{$n$: degré, $(a_i)_{0 \le i \le n}$: coefficients, $t$: 
178    réel en lequel on évalue}
179  \KwResult{$\textit{val}$: réel tel que $\textit{val}= p(t)$}
180  \nllabel{laff1} $a' = a$ \; 
181  \For{$i=n-1$ \KwTo $0$}{\nllabel{laford} 
182    \nllabel{lafori} $a' = a_i + t \times a'$ \;
183  \nllabel{laforf}}
184  \nllabel{laff2} $\textit{val} = a'$ \;
185  \caption{Évaluation du polynôme $p$ en $t$}
186 \end{algorithm}
187
188 On calcule les coûts d'exécution des lignes de l'algorithme comme suit:
189 \begin{itemize} 
190 % \item $\alpha$ désigne le temps d'accès mémoire en lecture écriture;
191 % \item $\beta$ désigne le temps d'exécution d'une opération arithmétique ($+$,$-$,$\times$, $/$);
192 % \item $\gamma$ désigne le temps d'exécution d'un test.
193 \item les lignes \ref{laff1} et \ref{laff2} cumulées coûtent une constante 
194 de temps $A$ indépendante de $n$;
195 \item la ligne \ref{lafori} nécessite un temps d'exécution 
196   $B$ indépendant de $n$; 
197 \item la boucle for (ligne \ref{laford}) nécessite donc un temps $nB$.
198 \end{itemize}
199
200 Donc $T(n)= A + nB$ et donc $\lim_{n \rightarrow + \infty} \frac{T(n)}{n} = B$.
201 Ainsi cet algorithme a une complexité linéaire en $n$.
202
203
204 \subsubsection{Un second algo}
205
206 On considère l'algorithme suivant:
207
208 \begin{algorithm}[H]
209   \LinesNumbered 
210   \SetAlgoLined
211   \KwData{$n$: entier naturel, $(x_i)_{0 \le i \le n}$: abscisses réelles,
212     $(y_i)_{0 \le i \le n}$: ordonnées réelles.}
213  \KwResult{$d$: vecteur de $n+1$ réels}
214  \nllabel{laford2}\For{$i=0$ \KwTo $n$}{
215    \nllabel{lafori2} $d_i' = y_i$ \; 
216    \nllabel{laforf2}}
217  \nllabel{laford2b}\For{$i=1$ \KwTo $n$}{
218    \nllabel{laford2bb}\For{$j=n$ \KwTo $i$}{
219      \nllabel{lafori2bb} $d_j = (d_j - d_{j-1})/(x_j - x_{j-1})$ \;
220      \nllabel{laforf2b}}
221    \nllabel{lafori2b} }
222  \caption{Polynôme  d'approximation d'une fonction}
223 \end{algorithm}
224
225
226 On calcule les coûts d'exécution des lignes de l'algo comme suit:
227 \begin{itemize} 
228 \item la boucle for (lignes \ref{laford2}-\ref{laforf2})
229   nécessite un temps $(n+1)A$.
230 \item la seconde boucle for (lignes \ref{laford2b}-\ref{lafori2b})
231   nécessite un temps
232 $\sum_{i=1}^n B(n-i+1)$ soit encore 
233 $B\sum_{i=1}^n (n-i+1)=B\sum_{i=1}^n i= B\frac{n.(n+1)}{2}$
234 \end{itemize}
235 Ainsi $T(n) = (n+1)A + B\frac{n.(n+1)}{2}$ et donc l'algorithme proposé est 
236 quadratique en $n$.
237
238
239 \begin{Exo}
240 Dans un cadre industriel, on est amené à effectuer un contrôle $(P)$ sur 
241 les données. La durée de cette phase est limitée. 
242 Il existe deux méthodes $A_1(n)$ et $A_2(n)$ de traitement de $(P)$.
243 On a établi que le temps d'exécution $T_1(n)$ de $A_1(n)$ est en 
244 $\Theta(n^3)$ et que le temps d'exécution $T_2(n)$ de $A_2(n)$ est en 
245 $\Theta(n^2)$.
246 \begin{enumerate}
247 \item Lors d'une évaluation pratique des deux méthodes, on a 
248   obtenu les mesures suivantes 
249 $$\begin{array}{|l|l|l|}
250 \hline
251 n & T_1(n) & T_2(n) \\
252 \hline
253 200 & 10400 & 6800 \\
254 \hline
255 \end{array}.$$
256
257 \begin{enumerate}
258 \item En déduire quel sera le temps nécessaire au traitement de données 
259   de taille $n'=10^4$.
260 \item Même question avec $n'=200\lambda$ où $\lambda$ réel de $[1, +\infty[$.
261 \item Déterminer la taille maximale des données que peuvent traiter 
262   $A_1$ et $A_2$ si le temps disponible est $t=10^5$.
263 \end{enumerate}
264 \item En fait, une étude statistique approfondie des deux algorithmes a permis 
265 d'établir que pour $n$ grand, on obtient: $T_1(n) \approx 0,001n^3$ et $T_2(n) \approx 0,19n^2$.
266 \begin{enumerate}
267 \item Quel est à priori l'algorithme le plus performant au vu de 
268   l'étude effectuée ?
269 \item Montrer qu'il existe un seuil $n_0$ en dessous duquel l'algorithme réputé 
270 le meilleur est en fait le moins performant. Déterminer cette valeur.
271 \item Pourquoi un algorithme performant sur des données de grandes tailles 
272 peut-il être lent pour des données de petite taille?
273 \end{enumerate}
274 \end{enumerate}
275 \end{Exo}
276
277 \subsection{Classes de complexité de problèmes}
278
279 \subsubsection{La classe \emph{P}}
280 Les problèmes de cette classe sont ceux qui admettent une solution 
281 algorithmique  \emph{déterministe} et en temps \emph{polynomial}:
282 lorsque la taille du problème est $n$, le 
283 nombre d'étapes de l'algorithme qui le résout reste plus petit 
284 qu'une certaine puissance de $n$ et ne contient pas d'indéterminisme.
285 La complexité de l'algorithme est alors en $\Theta(n^k)$ pour un certain $k$.
286
287
288
289 \subsubsection{La classe  \emph{NP}}
290 Les problèmes de cette classe sont ceux qui admettent 
291 une solution algorithmique \emph{non déterministe} en temps \emph{polynomial}.
292 De façon équivalente, c'est la classe des problèmes pour lesquels 
293 si une solution est proposée, on peut vérifier sa validité à l'aide d'un 
294 un algorithme en temps polynomial. 
295 On a $\emph{P} \subset \emph{NP}$.
296
297 \subsubsection{La classe \emph{NP-complet}} 
298 Les problèmes de cette classe sont ceux de la classe $\emph{NP}$ 
299 tels que tous les problèmes de la classe NP peuvent se réduire à celui-ci. 
300 Cela signifie que le problème est au moins aussi difficile
301 que tous les autres problèmes de la classe NP.
302
303 Le problème du voyageur de commerce (qui consiste à
304 trouver le chemin le plus court reliant une série de villes),
305 le problème du sac à dos (étant donné un sous-ensemble $S$
306 de l’ensemble des entiers naturels et $m$
307 un nombre positif, peut-on trouver
308 une partie $A$ de $S$ 
309 telle que la somme de ses éléments soit égale à l’entier $m$)
310 sont des exemples de problèmes NP-complets.