Déclarations complexes
Règle d'or : les opérateurs [] et () ont priorité sur l'opérateur *.
Exemples
int *t[]; Tableau de pointeurs sur entier.
int *t(); Fonction retournant un pointeur sur entier.
int *t(int *s[]); Fonction t prenant comme argument un tableau s de pointeurs sur entier et retournant un pointeur sur entier.
int (*t)[5]; Pointeur sur tableau de 5 entiers.
void (*f)(); Pointeur sur fonction retournant void.
Exercices
char (*(*a())[])();
char (*(*b[3])())[5];
double *(*(*c[4])(int))[2];
Solutions
char (*(*a())[])();
Fonction retournant un pointeur sur un tableau de pointeurs sur des fonctions retournant le type char.
char (*(*b[3])())[5];
Tableau de 3 pointeurs sur des fonctions retournant un pointeur sur un tableau de 5 char.
double *(*(*c[4])(int))[2];
Tableau de 4 pointeurs sur des fonctions ayant un argument de type int et retournant un pointeur sur un tableau de 2 pointeurs sur le type double.
/* Version 1 : tableaux */
void copie(char *s, char *t);
{ int i = 0;
while ((s[i] = t[i]) != '\0') } i++;
Recopie d'une chaîne
/* Version 2 : pointeurs */
void copie(char *s, char *t);
{ while ((*s = *t) != '\0') s++;t++;
}
Affectation!
Recopie d'une chaîne
/* Version 3 : pointeurs */
void copie(char *s, char *t);
{ while (*s++ = *t++);
}
Algorithme glouton
Location d'une voiture de façon à satisfaire le maximum de clients.
Soit E l'ensemble des clients. Pour chaque client c, on note d(c) le début de la location et f(c) la fin.
Problème. Trouver un sous- ensemble F de E, de cardinal maximal, tel que, pour c1, c2 ∈ F,
d(c1) ≤ d(c2) ⇒ f(c1) ≤ d(c2) c1 c2 c3 c4 c5 c6
d 2 5 3 7 1 6
f 8 7 4 8 5 7
c1 c2 c3 c4 c5 c6
d 2 5 3 7 1 6
f 8 7 4 8 5 7
Algorithme glouton (suite)
(2) Initialiser : F = ∅
(3) Pour i = 1 à n, ajouter ei à F si c3 c5 c2 c6 c1 c4
(1) Classer les éléments suivant f(c)
d(ei) ≥ max { f(x) | x ∈ F } F = { c3, c2, c4 }
e1 e2 e3 e4 e5 e6
Démonstration
Soit {x1, ..., xp} la solution obtenue par l'algorithme glouton.
Soit {y1, ..., yq} une solution optimale, avec q ≥ p et f(y1) ≤ f(y2) ≤ ... ≤ f(yq). Montrons que p
= q.
Si x1 = y1, ..., xk-1 = yk-1 et xk ≠ yk, on a par construction f(xk) ≤ f(yk).
Donc la solution {x1, ..., xk, yk+1, ..., yq} est aussi optimale. Par récurrence, {x1, ..., xp, yp+1, ..., yq} est optimale est donc p = q.
Evaluation de polynômes
Schéma de Horner
p(x) = x4 + 2x3 - x2 + 3x + 1
p(x) = x(x(x(x + 2) - 1) + 3) + 1
v := p[degre];
for i:= degre - 1 downto 0 do v := x * v + p[i];
Complexité : n - 1 multiplications et n additions
Multiplication de polynômes
p = (1 + X + 3X2 - 4X3) q = (1 + 2X - 5X2- 3X3) r = (1 + X)(1 + 2X)
t = (3 - 4X)(-5 -3X)
s = [(1 + X) + (3 - 4X)][(1 + 2X) + (-5 -3X)] = (4 - 3X)(-4 -X)
Principe :
si p = p1 + p2Xn et q = q1 + q2Xn alors pq = r + (s - r - t)Xn + tX2n avec r = p1q1, t = p2q2 et
s = (p1 + p2)(q1 + q2)
Multiplication de polynômes
Thm Deux polynômes de degré n peuvent être multipliés en O(n1,58) multiplications.
Preuve Diviser pour régner donne un = 3un/2 + 1 u(1) = 1
d'où u(2n) = 3n et u(n) ≈ nlog 3 En fait, il existe un bien meilleur algorithme en O(n log n)
Sous-mot commun
Un mot est une suite finie de symboles (ou lettres) pris dans un ensemble fini (l' alphabet). Si u = a1 ... an est un mot, où a1, ..., an sont des lettres, n est la longueur de u.
Un sous-mot de u est un mot de la forme ai
1
... ai
k.
Exemple : abaa est un sous mot de babcabba.
Problème : Etant donné deux mots, trouver un sous-mot commun de longueur maximale.
Etude du génome
Soit x = c1 ... ck un sous-mot maximal de a1 ... ai et b1 ... bj.
(1) Si ai = bj, alors ck = ai = bj et c1
... ck-1 est un sous mot maximal de a1 ... ai-1 et b1 ... bj-1.
(2) Si ai ≠ bj et si ck ≠ ai, alors x est un sous mot maximal de a1... ai-1 et b1 ... bj.
(3) Si ai ≠ bj et si ck ≠ bj, alors x est un sous mot maximal de a1 ... ai et b1 ... bj-1.
Soit L(i, j) la longueur de x. On a L(i, j) =
{
1 + L(i-1, j-1) si ai = bjmax(L(i, j-1), L(i-1, j)) sinon
0 0 0 0 0 0 0 a
b c b d a b
b d c a b a
0 1 2 2 3 4 4 0 1 2 2 2 3 3 0 1 1 2 2 2 2 0 1 1 2 2 3 3 0 1 2 2 3 3 4 0 0 0 0 1 1 1 0 1 1 1 1 2 2
Sous-mot commun