Beruflich Dokumente
Kultur Dokumente
2012-2013
Introduction
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
2/1
But de ce cours
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
3/1
Rgles dor
Ne pas hsiter poser des questions. Mme en amphi !
Se rappeler que si vous avez une question bte, au moins 1/4 de la
promo se pose la mme.
Le ridicule ne tue pas. Sinon ne je serais plus devant vous.
Ne savouer ni perdu ni vaincu. Venez demander des prcisions, mme
en mode entretien particulier.
Ne pas hsiter venir me voir dans mon bureau pour me parler de
quelque problme que ce soit.
Ne pas hsiter dire Mais Msieur, vous ne vous tes pas tromp sur
xxx ?
Ne pas hsiter me faire part de vos facilits / difficults.
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
4/1
Architecture
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
5/1
Cest un message.
criture avec des symboles : code.
Monde numrique : code binaire.
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
6/1
La mmoire
Pourquoi en avoir besoin ?
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
7/1
Le micro-processeur
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
8/1
Programmation
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
9/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
10/1
Un programme cest:
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
11/1
Un langage de programmation
Pourquoi utiliser un langage de programmation ?
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
12/1
Le langage C
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
13/1
Un premier programme en C
aloha.c
#i n c l u d e < s t d i o . h> / Pour a c c d e r p r i n t f . /
i n t main ( )
{
p r i n t f ( " A l o h a c o u s i n s ! \ n" ) ;
return (0) ;
}
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
14/1
Un premier programme en C
aloha.c
#i n c l u d e < s t d i o . h> / Pour a c c d e r p r i n t f . /
i n t main ( )
{
p r i n t f ( " A l o h a c o u s i n s ! \ n" ) ;
return (0) ;
}
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
14/1
Un premier programme en C
aloha.c
#i n c l u d e < s t d i o . h> / Pour a c c d e r p r i n t f . /
i n t main ( )
{
p r i n t f ( " A l o h a c o u s i n s ! \ n" ) ;
return (0) ;
}
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
14/1
Un premier programme en C
aloha.c
#i n c l u d e < s t d i o . h> / Pour a c c d e r p r i n t f . /
i n t main ( )
{
p r i n t f ( " A l o h a c o u s i n s ! \ n" ) ;
return (0) ;
}
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
14/1
Un premier programme en C
aloha.c
#i n c l u d e < s t d i o . h> / Pour a c c d e r p r i n t f . /
i n t main ( )
{
p r i n t f ( " A l o h a c o u s i n s ! \ n" ) ;
return (0) ;
}
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
14/1
Compilation:
Excution:
./a.out ou ./first.x
... en fonction du nom de votre excutable.
Excute votre programme dans le rpertoire courant.
./ devant car le rpertoire courant nest pas dans le PATH.
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
15/1
Le compilateur gcc
Compilateur : programme transformant un source en excutable.
Dispose de nombreuses options dont:
-w :
-g :
-I :
-c :
-L :
-O0
-l :
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
16/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
17/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
18/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
19/1
La mmoire
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
20/1
Ncessit de typage
Mmoire: contient de linformation code en binaire.
Nous avons vu quelques formes de donnes.
lentier 87 (= 64 + 16 + 4 + 2 + 1),
le flottant 4.85 10270 ,
(le caractre W),
une instruction en langage machine,
une adresse mmoire, etc . . .
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
21/1
Le tout cest de ne pas lire dans une variable avant son initialisation !
Sa valeur est ce quil y avait dans la mmoire.
a na aucun sens de lutiliser, cest un oubli, une erreur.
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
22/1
i n t main ( )
{
float c ;
i n t i , j = 42 ;
double b ;
b = 0.00345 ;
c = 3.14159 ;
}
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
23/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
24/1
Composition dexpressions
Arithmtique: entre entiers et/ou flottants.
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
25/1
Instructions du langage
Une instruction est quelque chose qui fait une action, sans valoir
quelque chose.
Opposition une expression qui vaut une valeur.
Plusieurs (nombreuses) formes dinstructions.
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
26/1
Laffectation
Dnote par le signe = ( ne pas confondre avec ==).
Donne une valeur une variable.
Attention matheux !
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
27/1
Laffectation
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
28/1
;
;
;
;
;
;
;
//
//
//
//
//
//
//
//
//
//
i
i
i
i
i
i
i
i
i
i
=
=
=
=
=
=
=
=
=
=
i
i
i
i
i
i
i
i
i
i
/
%
|
&
^
1
1
3
3
3
3
3
3
3
3
;
;
;
;
;
;
;
;
;
;
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
29/1
Excution conditionnelle
Besoin deffectuer un traitement . . . ou pas . . . ou un autre.
Notion de condition (expression boolenne).
Condition toujours entre parenthses !
if (expression) { instruction(s) ; }:
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
30/1
x = 90
"x est ngatif hors ]-5;-3] ou nul."
x =0
"x est nul."
"x est ngatif hors ]-5;-3] ou nul."
x = 4
"x est ngatif entre ]-5;-3] ou nul."
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
31/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
32/1
short
unsigned short
int
unsigned int
long
unsigned long
long long
unsigned long long
Taille
(bits)
16
16
32
32
32 ou 64
32 ou 64
64
64
Valeur
Min
Max
-32768
32767
0
65535
231
231 1
0
232 1
dpend de larchitecture
dpend de larchitecture
263
263 1
0
264 1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
33/1
Base 2 :
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
34/1
Dbordement dentiers
Arithmtique modulo la taille des mots machine.
Pour les exemples suivants, taille = 4 bits.
Perte de plein de bonnes proprits mathmatiques /
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
35/1
Les rels
Couramment appels flottants (floating point numbers).
Toujours signs.
2 tailles 2 prcisions.
float
double
Taille
(bits)
24 + 8
53 + 11
Valeur
Min
1.1 1038
2.2 10308
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
Max
3.4 1038
1.8 10308
Prcision
106
1015
IN101
36/1
Notion de prcision:
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
37/1
()
f l 1 = 48431.1231
f l 2 = 48431.1239
f l 3 = 48431.1250
;
;
;
: %f
f l 2 : %f
fl3
== f l 2 ? %d \ n " , (
== f l 3 ? %d \ n " , (
== f l 3 ? %d \ n " , (
0.0001 ;
+ 0 . 0 0 0 1 : %f \ n " ,
: %f \ n " , f l 1 , f l 2 ,
f l 1 == f l 2 ) ) ;
f l 2 == f l 3 ) ) ;
f l 1 == f l 3 ) ) ;
fl1 )
fl3 )
> ./thiskillsme
fl1: 48431.125000 fl2: 48431.125000
fl1 == fl2 ? 1
fl2 == fl3 ? 1
fl1 == fl3 ? 1
fl1 + 0.0001: 48431.125000
fl3: 48431.125000
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
38/1
// Tout p e t i t
epsilon . . .
( " f l 1 : %f
f l 2 : %f
f l 3 : %f
f l 4 : %f \ n " , f l 1 , f l 2 ,
( " f l 3 = f l 4 ? %d \ n " , ( f l 3 == f l 4 ) ) ;
( " f l 3 ~ f l 4 ? %d \ n " , ( f a b s ( f l 3 f l 4 ) < EPSILON ) )
(0) ;
fl3 ,
fl4 )
> ./thiskillsmeagain
fl1: 0.100000 fl2: 0.200000
fl3 = fl4 ? 0
fl3 ~ fl4 ? 1
fl3: 0.300000
fl4: 0.300000
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
39/1
Les boolens
0 false
Tout sauf 0 true
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
40/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
41/1
\n : Retour la ligne.
\\ : Le caractre \.
\ : Le caractre .
\" : Le caractre ".
\t : La tabulation.
\x : Le caractre dont le code en hexadcimal suit.
\ : Le caractre dont le code en octal suit.
. . . et quelques autres que lon passe sous silence.
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
42/1
Plus de constructions
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
43/1
Faire un traitement T ,
Puis si une condition C est vrifie sarrter,
Sinon recommencer le traitement T .
Notion de rptition.
2
IN101
44/1
enumerate.c
#i n c l u d e < s t d i o . h>
i n t main ( )
{
int i ;
f o r ( i = 0 ; i < 1 0 ; i ++) {
p r i n t f ( "%d " , i ) ;
}
p r i n t f ( " \n" ) ;
return (0) ;
}
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
45/1
i = 0 ; j = 0 ;
f o r ( / / ; i < 1 0 ; / / ) {
j += i ;
i++ ;
}
i = 0 ; j = 0 ;
f o r ( / / ; / / ; / / ) {
j += i ;
i f ( i == 9 ) b r e a k ;
i++ ;
}
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
46/1
Ex: Un+1 = {
Un
2
Si Un est pair
3 Un + 1 Sinon
syracuse.c
i n t main ( )
{
i n t x = 134560 ;
w h i l e ( x != 1 ) {
i f ( x % 2 == 0 )
x = x / 2 ;
else x = 3 x +
}
return (0) ;
}
// R p t e r t a n t que x e s t
// S i x e s t p a i r .
// On l e d i v i s e p a r 2 .
1 ;
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
d i f f r e n t de 1 .
IN101
47/1
init ;
while ( t e s t ) {
instruction (s) ;
postlude ;
}
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
for ( ; test ; ) {
instruction (s) ;
}
IN101
48/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
49/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
50/1
p r i n t f ( " A u t r e c a s \n" ) ;
IN101
51/1
{
printf
printf
printf
printf
( " x : 0\ n" ) ; b r e a k
( " x : 1\ n" ) ; b r e a k
( " x : 4\ n" ) ; b r e a k
( " A u t r e c a s \n" ) ;
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
;
;
;
break ;
IN101
52/1
Quelques utilitaires de C
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
53/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
54/1
un
un
un
un
un
un
un
un
un
un
un
int
long int en dcimal
unsigned int en dcimal
int en hexadcimal
float
double
double en notation scientifique
double avec 7 chiffres aprs la virgule
int en dcimal sur 7 digits (padding frontal avec des 0)
int en dcimal sur 7 digits (padding frontal avec des )
char (comme caractre ASCII, pas comme entier)
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
55/1
#i n c l u d e < s t d i o . h>
i n t main
{
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
return
}
()
( "%d\n" , 4 2 ) ;
( "%l d \n" , 4 2 ) ;
( "%u\n" , 4 2 ) ;
( "%x \n" , 4 2 ) ;
( "%f \n" , 4 2 . 0 ) ;
( "%e \n" , 4 2 . 0 ) ;
( " %.7 f \n" , 4 2 . 0 ) ;
( "%07d\n" , 4 2 ) ;
( "% 7d\n" , 4 2 ) ;
( "%c \n" , 4 2 ) ;
(0) ;
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
42
42
42
2a
42.000000
4.200000e+01
42.0000000
0000042
42
*
IN101
56/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
57/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
58/1
i = 52 et non 430 !
Possibilit de macros paramtres: #define TWICE(x)((x) (x))
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
59/1
Alias de types
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
60/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
61/1
Soit A et B 2 ensembles.
Fonction f dfinie sur A valeur dans B : correspondance qui x A
associe au plus (fonction partielle) 1 lment de B.
A: domaine.
B: codomaine.
Autrement dit:
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
62/1
// C o r p s : r e t o u r n e b i e n un i n t .
f l o a t square_minus ( f l o a t x , f l o a t y )
{
float t = (x y) ;
/ V a r i a b l e l o c a l e . /
return ( t t ) ;
}
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
63/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
64/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
65/1
i n t const_fun ( )
{
return (42) ;
}
void j u s t _ p r i n t ( in t i )
{
p r i n t f ( " J i m p r i m e %d e t %d\n" , i , c o n s t _ f u n ( ) ) ;
return ;
}
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
66/1
/ V a r i a b l e g l o b a l e . /
2 ;
/ V a r i a b l e l o c a l e l a f o n c t i o n f . /
+ 5 ;
;
/ V a r i a b l e l o c a l e au b l o c i n t e r n e f . /
/ F i n du b l o c : j n e s t p l u s a c c e s s i b l e . /
3 + glob ) ;
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
67/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
68/1
/ D c l a r a t i o n d une v a r i a b l e ( g l o b a l e ) e n t i r e . /
extern i n t errno ;
/ D c l a r a t i o n de l a f o n c t i o n a r c t a n g e n t e ( de y / x ) . /
f l o a t atan2 ( f l o a t y , f l o a t x ) ;
IN101
69/1
int main () ;
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
70/1
La rcursivit
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
71/1
Si n = 0
Sinon
Traitement T sur P:
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
72/1
La rcursivit (2)
Une fonction qui sappelle elle-mme est dite rcursive.
Ex: recherche dun fichier sur un disque.
boolen existe_fichier (nom, rpertoire)
{
liste fs = noms_de_fichier (rpertoire) ;
si (name est dans fs) retourner (vrai) ;
sinon {
liste srs = sous_rpertoires (rpertoire) ;
pour chaque r dans srs {
si (existe_fichier (nom, r)) retourner (vrai) ;
// Sinon, implicitement continuer le pour-chaque.
}
}
retourner (faux) ;
}
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
73/1
...?
...?
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
74/1
Exemple: factorielle
1
2
3
4
5
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
75/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
76/1
4 * (3 * (2 * (1 * 1)))
4 * fact (3)
3 * (2 * (1 * 1))
3 * fact (2)
2 * (1 * 1)
2 * fact (1)
1*1
1 * fact (0)
1
1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
77/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
78/1
Spcification rcursive:
{
x n = x x n1
x0 = 1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
79/1
power (a, 4)
a * power (a, 3)
a * power (a, 2)
a * power (a, 1)
a * power (a, 0)
1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
80/1
a* a * a* a
a * power (a, 3)
a*a*a
a * power (a, 2)
a*a
a * power (a, 1)
a * power (a, 0)
1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
81/1
x 2n = x n x n
2n+1
= x x 2n
x
x = x.
d o u b l e power_sm ( d o u b l e x , u n s i g n e d i n t n )
{
d o u b l e tmp ;
i f ( n == 1 ) r e t u r n ( x ) ;
i f ( e % 2 == 0 ) {
tmp = power_sm ( x , n / 2 ) ;
r e t u r n ( tmp tmp ) ;
}
r e t u r n ( x power_sm ( x , n 1 ) ) ;
}
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
82/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
83/1
2 2
a * ((a * a 2 ) )
2 2
((a * a 2 ) )
power (a, 6) ^ 2
(a * a 2 )
power (a, 3) ^ 2
a*a2
power (a, 2) ^ 2
a2
power (a, 1) ^ 2
a
a
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
84/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
85/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
86/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
87/1
IN101
88/1
1
fib(1) ;
Algorithmique et programmation
IN101
89/1
1
fib(2) ;
0
fib(0) ;
1
fib(1) ;
Algorithmique et programmation
IN101
90/1
2
fib(3) ;
1
fib(1) ;
1
fib(2) ;
0
fib(0) ;
1
fib(1) ;
Algorithmique et programmation
IN101
91/1
2
fib(3) ;
1
fib(1) ;
1
fib(2) ;
0
fib(0) ;
1
fib(1) ;
0
fib(0) ;
1
fib(1) ;
Algorithmique et programmation
IN101
92/1
fib(4) ;
fib(2) ;
2
fib(3) ;
1
fib(1) ;
1
fib(2) ;
0
fib(0) ;
1
fib(1) ;
0
fib(0) ;
1
fib(1) ;
Algorithmique et programmation
IN101
93/1
Formes de rcursivit
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
94/1
IN101
95/1
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
96/1
Le problme de larrt
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
97/1
n+1
Si m=0
Ack(m
1
,
1)
Si
m > 0 et n = 0
Ack(m, n) =
IN101
98/1
Appel(s) de fonction(s)
Algorithmique et programmation
Franois Pessaux , francois.pessaux@ensta-paristech.fr, ENSTA
IN101
99/1
Algorithmique et programmation
IN101
100/1
Protocole dappel
Algorithmique et programmation
IN101
101/1
Ct appelant:
var locale 2
var locale 1
@ retour
arg n
...
arg 2
arg
Appelant
Croissance de la pile
Appel
var locale m
...
Ct appel:
Algorithmique et programmation
IN101
102/1
#d e f i n e X0 ( 3 . 0 ) // Germe : q u e l c o n q u e > 0
2
3
4
Pile
5
6
7
8
9
10
11
2.0
res
???
nb_iters
15
main
12
13
14
15
16
17
i n t main ( ) {
int nb_iters = 15 ;
double res, v = 2.0 ;
res = squr (v , nb_iters ) ;
p r i n t f ( " s q r t (% f ) = %f \n" , v , r e s ) ;
return (0) ;
}
IN101
103/1
#d e f i n e X0 ( 3 . 0 ) // Germe : q u e l c o n q u e > 0
2
3
4
Pile
5
6
7
8
ligne 14
15
squr
max_iter
10
2.0
11
2.0
12
res
???
nb_iters
15
main
a
v
13
14
15
16
17
i n t main ( ) {
i n t n b _ i t e r s = 15 ;
double res , v = 2 . 0 ;
r e s = squr (v, nb_iters) ;
p r i n t f ( " s q r t (% f ) = %f \n" , v , r e s ) ;
return (0) ;
}
IN101
104/1
#d e f i n e X0 ( 3 . 0 ) // Germe : q u e l c o n q u e > 0
2
3
4
Pile
xn
3.0
???
ligne 14
15
squr
max_iter
10
2.0
11
2.0
12
res
???
nb_iters
15
main
a
v
13
14
15
16
17
i n t main ( ) {
i n t n b _ i t e r s = 15 ;
double res , v = 2 . 0 ;
res = squr (v , nb_iters ) ;
p r i n t f ( " s q r t (% f ) = %f \n" , v , r e s ) ;
return (0) ;
}
IN101
105/1
#d e f i n e X0 ( 3 . 0 ) // Germe : q u e l c o n q u e > 0
2
3
4
Pile
xn
1.414998
ligne 14
15
squr
max_iter
10
2.0
11
2.0
12
res
???
nb_iters
15
main
a
v
13
14
15
16
17
i n t main ( ) {
i n t n b _ i t e r s = 15 ;
double res , v = 2 . 0 ;
res = squr (v , nb_iters ) ;
p r i n t f ( " s q r t (% f ) = %f \n" , v , r e s ) ;
return (0) ;
}
IN101
106/1
#d e f i n e X0 ( 3 . 0 ) // Germe : q u e l c o n q u e > 0
2
3
4
Pile
xn
1.414214
15
ligne 14
15
squr
max_iter
10
2.0
11
2.0
12
res
???
nb_iters
15
main
a
v
13
14
15
16
17
i n t main ( ) {
i n t n b _ i t e r s = 15 ;
double res , v = 2 . 0 ;
res = squr (v , nb_iters ) ;
p r i n t f ( " s q r t (% f ) = %f \n" , v , r e s ) ;
return (0) ;
}
IN101
107/1
#d e f i n e X0 ( 3 . 0 ) // Germe : q u e l c o n q u e > 0
2
3
4
Pile
5
6
7
8
ligne 14
15
squr
max_iter
10
2.0
11
2.0
12
res
???
nb_iters
15
main
a
v
13
14
15
16
17
i n t main ( ) {
i n t n b _ i t e r s = 15 ;
double res , v = 2 . 0 ;
res = squr (v , nb_iters ) ;
p r i n t f ( " s q r t (% f ) = %f \n" , v , r e s ) ;
return (0) ;
}
IN101
108/1
#d e f i n e X0 ( 3 . 0 ) // Germe : q u e l c o n q u e > 0
2
3
4
Pile
5
6
7
8
9
10
11
2.0
res
1.414214
nb_iters
15
main
12
13
14
15
16
17
i n t main ( ) {
i n t n b _ i t e r s = 15 ;
double res , v = 2 . 0 ;
res = s q u r ( v , n b _ i t e r s ) ;
p r i n t f ( " s q r t (% f ) = %f \n" , v , r e s ) ;
return (0) ;
}
IN101
109/1
#d e f i n e X0 ( 3 . 0 ) // Germe : q u e l c o n q u e > 0
2
3
4
Pile
5
6
7
arg[2]
1.414214
arg[1]
2.0
printf
ligne 15
9
10
res
1.414214
nb_iters
15
11
12
main
13
14
15
16
17
i n t main ( ) {
i n t n b _ i t e r s = 15 ;
double res , v = 2 . 0 ;
res = squr (v , nb_iters ) ;
printf ("sqrt (%f) = %f\n", v, res) ;
return (0) ;
}
IN101
110/1
Algorithmique et programmation
IN101
111/1
Pile
2
3
1
2
3
4
fact main
ligne 10
n
9
10
11
fact
ligne 4
7
8
fact
ligne 4
n
5
6
fact
ligne 4
fact
ligne 4
12
i n t main ( )
{
unsigned i n t i = 5 ;
p r i n t f ( " F a c t (%d )=%d\n" , i , f a c t ( i ) ) ;
return (0) ;
}
Algorithmique et programmation
IN101
112/1
Pile
2
3
4
5
1
2
3
4
fact main
ligne 10
n
9
10
11
fact
ligne 4
7
8
fact
ligne 4
n
fact
ligne 4
unsigned i n t f a c t ( unsigned i n t n )
{
i f ( n == 0 ) r e t u r n ( 1 ) ;
e l s e r e t u r n ( n * fact (n - 1) ) ;
}
12
i n t main ( )
{
unsigned i n t i = 5 ;
p r i n t f ( " F a c t (%d )=%d\n" , i , f a c t ( i ) ) ;
return (0) ;
}
Algorithmique et programmation
IN101
113/1
Les tableaux
Algorithmique et programmation
IN101
114/1
transparence
R R R R G G G G B B B B 32 bits
rouge
vert
bleu
Algorithmique et programmation
IN101
115/1
Dessine-moi un tableau. . .
Tableau =
Algorithmique et programmation
IN101
116/1
Homogne.
Dense.
accs direct par indexation entire.
Algorithmique et programmation
IN101
117/1
Tableaux et mmoire
Deux sortes de tableaux:
Pile
Tas
sta
sta[2]
sta[1]
sta[0]
int i ;
/ B l a b l a . . . i 4 /
/ Dynamique . /
i n t dyn [ ] = a l l o u e r i c a s e s
/ S t a t i q u e . /
int sta [3] ;
dyn
i
Algorithmique et programmation
IN101
118/1
int t [5] ;
i ++) b l a b l a ( t a b [ i ] ) ;
Algorithmique et programmation
IN101
119/1
Initialisation de tableaux
Lorsquon dclare un tableau, il nest pas initialis.
Il contient ce quil y avait dans la mmoire.
Comme pour les autres variables, il faut linitialiser:
donner une valeur chaque case.
Initialisation case par case:
float t [3]
t [ 0 ] = 1.0
t [ 1 ] = 1.5
t [ 2 ] = 2.0
;
;
;
;
IN101
120/1
Parcours de tableaux
Un tableau tant une zone contigue indexe, il est naturel dutiliser
une boucle pour le parcourir.
Boucle sur les indices de 0 taille du tableau 1.
i n t t [ SIZE ] ;
int i = 0 ;
w h i l e ( i < SIZE ; i ++) {
do_something ( t [ i ] ) ;
i++ ;
}
Exemple: initialisation
i n t t [ SIZE ] ;
int i ;
f o r ( i = 0 ; i < SIZE ;
i ++) t [ i ] = i i
; / t [ i ] = i 2 . /
IN101
121/1
i ++)
return (0) ;
}
Algorithmique et programmation
IN101
122/1
Algorithmique et programmation
IN101
123/1
X ; x++) {
< Y ; y++)
" , c [x ][ y ]) ;
;
}
Algorithmique et programmation
IN101
124/1
Algorithmique et programmation
IN101
125/1
Tas
4 2
argv[2]
argv[1]
argv[0]
g e e
b a r
Algorithmique et programmation
IN101
126/1
Algorithmique et programmation
IN101
127/1
ll , f ) ;
Algorithmique et programmation
IN101
128/1
Algorithmique et programmation
IN101
129/1
Algorithmique et programmation
IN101
130/1
Algorithmique et programmation
IN101
131/1
Algorithmique et programmation
IN101
132/1
Typage (typechecking)
Analyses lexicale et syntaxique insuffisantes pour garantir quun
programme a un sens.
Pareil en Franais: Lilo est Stitch dessiner M
Besoin danalyse smantique : sur le sens des phrases.
Typage: vite de mlanger torchons et serviettes.
Force manipuler les objets de manire cohrente.
Avec les constructions qui leur sont ddies:
"Foo" + "Bar"
3+5
printf + 15
cos (3.14159)
cos (3.14159, 1.41421)
Algorithmique et programmation
IN101
133/1
LC0:
.ascii "%*d\12\0"
.text
.globl _main
_main:
LFB3:
pushq
%rbp
LCFI0:
LCFI1:
LCFI2:
movq
subq
movl
movq
movl
movl
movl
%rsp, %rbp
$32, %rsp
%edi, -20(%rbp)
%rsi, -32(%rbp)
$123, -4(%rbp)
$10, -8(%rbp)
-4(%rbp), %edx
...
Algorithmique et programmation
IN101
134/1
Assemblage
Transformation fichier par fichier.
Instructions machine encodage binaire.
fichiers objet (.o).
Laisse des trous pour les variables / fonctions des autres fichiers.
0x0000000100000efb
0x0000000100000f02
0x0000000100000f09
0x0000000100000f0c
0x0000000100000f0f
...
<main+15>:
<main+22>:
<main+29>:
<main+32>:
<main+35>:
movl
movl
mov
mov
lea
$0x7b,-0x4(%rbp)
$0xa,-0x8(%rbp)
-0x4(%rbp),%edx
-0x8(%rbp),%esi
0x1e(%rip),%rdi
0x100000eec
0x100000ef4
0x100000efc
0x100000f04
...
Algorithmique et programmation
IN101
135/1
Algorithmique et programmation
IN101
136/1
Chargement / Excution
Algorithmique et programmation
IN101
137/1
Algorithmique et programmation
IN101
138/1
Organisation de la mmoire
Algorithmique et programmation
IN101
139/1
Algorithmique et programmation
IN101
140/1
Adresse mmoire
0 1 2 3 4 5 ...
42
1 octet
1 int (= 4 octets)
son adresse
Algorithmique et programmation
IN101
141/1
char c = A
Adresse c = 21
21
A
26
0 0 0 0 2 1
Pointeur sur c
contient la valeur 21
Adresse du pointeur =
26
IN101
142/1
Dclaration de pointeurs en C:
i n t a ;
s h o r t b ;
s h o r t c ;
// a e s t un p o i n t e u r v e r s un / d e s i n t .
// b e s t un p o i n t e u r v e r s un / d e s s h o r t ( i n t ) .
// c e s t un p o i n t e u r v e r s un / d e s s h o r t .
Mmoire
0
...
0 0 0 0 4 2
0 0 0 0 0 7
Un int valant 42
Pointeur sur int: int*
28
4 6 5
38
0 0 0 0 3 8
0 0 0 0 2 8
Algorithmique et programmation
IN101
143/1
//
//
//
//
//
//
a e s t un i n t .
b e s t un p o i n t e u r v e r s un i n t .
b c o n t i e n t l a d r e s s e de a > P o i n t e u r v e r s a .
On s t o c k e 5 d a n s b . > Dans a .
On s t o c k e d a n s a 1 + l a v a l e u r c o n t e n u e
l a d r e s s e b . > a = a + 1 .
& et * ont des rles symtriques: *(&a) est la mme chose que a.
ATTENTION: avoir un pointeur sous la main ne signifie pas avoir le droit
de manipuler la mmoire ladresse contenue par ce pointeur !
Algorithmique et programmation
IN101
144/1
Algorithmique et programmation
IN101
145/1
Algorithmique et programmation
IN101
146/1
???
e
d
c
b
a
???
???
???
???
i n t main ( )
{
i n t a , b , c ,
a = 3 ;
b =
c = &b ; d =
c = 4 ;
d = ( c ) + 3
e = &c ;
e = d ;
e = &a ;
...
}
d , e ;
5 ;
&a ;
;
Algorithmique et programmation
IN101
147/1
Pile
0x1224
0x1220
0x121c
0x1218
0x1214
0x1210
0x120c
0x1208
0x1204
0x1200
???
e
d
c
b
a
???
5
3
???
i n t main ( )
{
i n t a , b , c , d , e ;
a = 3 ; b = 5 ;
c = &b ; d = &a ;
c = 4 ;
d = ( c ) + 3 ;
e = &c ;
e = d ;
e = &a ;
...
}
Algorithmique et programmation
IN101
148/1
???
e
d
c
b
a
0x1200
0x1204
5
3
i n t main ( )
{
i n t a , b , c , d , e ;
a = 3 ;
b = 5 ;
c = &b ; d = &a ;
c = 4 ;
d = ( c ) + 3 ;
e = &c ;
e = d ;
e = &a ;
...
}
Algorithmique et programmation
IN101
149/1
???
e
d
c
b
a
0x1200
0x1204
4
3
i n t main ( )
{
i n t a , b , c ,
a = 3 ;
b =
c = &b ; d =
c = 4 ;
d = ( c ) + 3
e = &c ;
e = d ;
e = &a ;
...
}
d , e ;
5 ;
&a ;
;
Algorithmique et programmation
IN101
150/1
???
e
d
c
b
a
0x1200
0x1204
4
7
i n t main ( )
{
int a , b ,
a = 3 ;
c = &b ;
c = 4 ;
d = ( c )
e = &c ;
e = d
e = &a ;
...
}
c , d , e ;
b = 5 ;
d = &a ;
+ 3 ;
;
IN101
151/1
Pile
0x1224
0x1220
0x121c
0x1218
0x1214
0x1210
0x120c
0x1208
0x1204
0x1200
e
d
c
b
a
0x1208
0x1200
0x1204
4
7
i n t main ( )
{
i n t a , b , c ,
a = 3 ;
b =
c = &b ; d =
c = 4 ;
d = ( c ) + 3
e = &c ;
e = d ;
e = &a ;
...
}
d , e ;
5 ;
&a ;
;
e pointe vers c.
Algorithmique et programmation
IN101
152/1
e
d
c
b
a
0x1208
0x1200
0x1204
7
7
i n t main ( )
{
int a , b ,
a = 3 ;
c = &b ;
c = 4 ;
d = ( c )
e = &c ;
e = d ;
e = &a ;
...
}
c , d , e ;
b = 5 ;
d = &a ;
+ 3 ;
IN101
153/1
e
d
c
b
a
0x1208
0x1200
0x1200
7
7
i n t main ( )
{
i n t a , b , c ,
a = 3 ;
b =
c = &b ; d =
c = 4 ;
d = ( c ) + 3
e = &c ;
e = d ;
e = &a ;
...
}
d , e ;
5 ;
&a ;
;
Algorithmique et programmation
IN101
154/1
Algorithmique et programmation
IN101
155/1
int v = 42 ;
char s [10] ;
Dans la pile (variable locale) ou dans le tas/section-data (variable
globale).
Algorithmique et programmation
IN101
156/1
Algorithmique et programmation
IN101
157/1
Allocation dynamique
Algorithmique et programmation
IN101
158/1
Algorithmique et programmation
IN101
159/1
#i n c l u d e < s t d i o . h> // p r i n t f
#i n c l u d e < s t d l i b . h> // m a l l o c , f r e e
i n t main ( )
{
float t ;
int n ;
t = malloc (5 s i z e o f ( f l o a t ) ) ;
i f ( t == NULL ) e x i t ( 1 ) ;
t [ 2 ] = 3.14159 ;
p r i n t f ( "%f \ n " , t [ 2 ] ) ;
free ( t ) ;
return (0) ;
}
Pile
Tas
?
?
n
t
???
???
Algorithmique et programmation
IN101
160/1
Pile
Tas
t[0] t[1] t[2] t[3] t[4]
?
n
t
???
IN101
161/1
Pile
Tas
t[0] t[1] t[2] t[3] t[4]
?
n
t
???
Algorithmique et programmation
IN101
162/1
#i n c l u d e < s t d i o . h> // p r i n t f
#i n c l u d e < s t d l i b . h> // m a l l o c , f r e e
i n t main ( )
{
float t ;
int n ;
t = malloc (5 s i z e o f ( f l o a t ) ) ;
i f ( t == NULL ) e x i t ( 1 ) ;
t [ 2 ] = 3.14159 ;
p r i n t f ( "%f \ n " , t [ 2 ] ) ;
free ( t ) ;
return (0) ;
}
Pile
Tas
t[0] t[1] t[2] t[3] t[4]
?
n
t
? 3.14 ?
???
Algorithmique et programmation
IN101
163/1
Pile
Tas
?
n
t
? 3.14 ?
???
IN101
164/1
Pas pas (5 2 )
#i n c l u d e < s t d i o . h> // p r i n t f
#i n c l u d e < s t d l i b . h> // m a l l o c , f r e e
i n t main ( )
{
float t ;
int n ;
t = malloc (5 s i z e o f ( f l o a t ) ) ;
i f ( t == NULL ) e x i t ( 1 ) ;
t [ 5 ] = 3.14159 ;
p r i n t f ( "%f \ n " , t [ 2 ] ) ;
free ( t ) ;
return (0) ;
}
Pile
Tas
t[0] t[1] t[2] t[3] t[4]
?
n
t
???
IN101
165/1
Libration de mmoire
Fonction free: void* void
Algorithmique et programmation
IN101
166/1
Impossible de dsallouer.
Fuites mmoire et dgradation de performances avec le temps.
Algorithmique et programmation
IN101
167/1
char t[5][3]
0
char t[15]
2
0
1
Mmoire
0
12
13
14
10
11
2
t[3][1]
t[(1 * 5) + 3] = t[8]
Algorithmique et programmation
IN101
168/1
Tas
't' 'r' 'o' 'i' 's' '\0'
[4
1]
[3
1]
b[
ta
[2
1]
b[
b[
ta
[1
ta
1]
1]
b[
b[
ta
ta
[2
0]
[1
b[
0]
ta
0]
b[
ta
ta
tab
b[
[0
[0
'U' 'n''\0'
Algorithmique et programmation
IN101
169/1
s i z e o f ( i n t ) ) ;
n ; i ++)
(m s i z e o f ( i n t ) ) ;
n;
i ++)
IN101
170/1
Algorithmique et programmation
IN101
171/1
Algorithmique et programmation
IN101
172/1
void g ( in t v )
{
v++ ;
}
void f ()
{
int x = 5 ;
g (x) ;
}
Fct g
5 6
@retour
Fct f
Algorithmique et programmation
IN101
173/1
v o i d g ( i n t v )
{
( v )++ ;
}
void f ()
{
int x = 5 ;
g ( &x ) ;
}
*x cest l
Fct g
@x
@retour
Fct f
6 5
Algorithmique et programmation
IN101
174/1
IN101
175/1
Algorithmique et programmation
IN101
176/1
Le besoin
Vus jusqu prsent:
nom,
prnom,
date de naissance,
sexe,
status (vacataire, contractuel ou fonctionnaire),
etc. ?
Algorithmique et programmation
IN101
177/1
Algorithmique et programmation
IN101
178/1
Algorithmique et programmation
IN101
179/1
Algorithmique et programmation
IN101
180/1
Algorithmique et programmation
IN101
181/1
nom
prenom
sexe
j_naiss
m_naiss
a_naiss
4 chars
4 chars
Mmoire
Algorithmique et programmation
IN101
182/1
soit
soit
soit
soit
une
une
une
une
constante,
variable,
opration (+ - * /) entre formules,
fonction (cos, tan) prenant une formule en argument.
Algorithmique et programmation
IN101
183/1
Algorithmique et programmation
IN101
184/1
Algorithmique et programmation
IN101
185/1
Mmoire
oper_t
expr_t
expr_t
binexpr_t
fun_t
expr_t
funexpr_t
double
double
IN101
186/1
Algorithmique et programmation
IN101
187/1
{
s t r u c t expr_t e
...
switch ( e . kind )
c a s e E_cst : . . .
c a s e E_bin : . . .
c a s e E_fun : . . . .
}
...
;
;
;
{
break ;
break ;
break ;
}
;
Algorithmique et programmation
IN101
188/1
IN101
189/1
Algorithmique et programmation
IN101
190/1
Algorithmique et programmation
IN101
191/1
Bonnes pratiques
Algorithmique et programmation
IN101
192/1
Le besoin
a doit marcher.
Le code doit tre comprhensible et maintenable.
Algorithmique et programmation
IN101
193/1
La documentation
Un programme nest pas write-only.
Programmes actuels:
Algorithmique et programmation
IN101
194/1
Algorithmique et programmation
IN101
195/1
the
inside a
\ param cu C o m p i l a t i o n u n i t t o p r o c e s s .
\ param dg U n i t s d e p e n d e n c y g r a p h .
\ r e t u r n : The l i s t o f names , f i r s t one i n h e a d o f t h e l i s t .
\ warning Because o f w e l l f o r m a t i o n p r o p e r t i e s , t h i s p r o c e s s s h o u l d n e v e r
f i n d a c y c l i c graph .
\ n o t e E x p o r t e d : No . /
s t r u c t n l i s t c o m p u t e _ r e o r d e r i n g ( s t r u c t c o m p u n i t cu , s t r u c t depg dg )
{
...
i f ( queue_elem == NULL ) {
/ I f t h e r e r e m a i n s n o d e s i n t h e [ o u t _ d e g r e e ] t a b l e , t h i s means t h a t t h e r e
e x i s t s n o d e s one c o u l d n o t c l a s s i f y b e c a u s e . . . /
...
}
}
Algorithmique et programmation
IN101
196/1
i f ( blz ) {
i++ ;
}
else {
i ;
}
Ne pas faire des lignes trs longues (> 80 c): retour-chariot existe !
Encadrer les blocs (mme de 1 instruction) par des { }.
...
i f ( b l a ) { i ++ ; }
i ;
...
Algorithmique et programmation
IN101
197/1
switch ( bla ) {
case 0 :
i++ ;
/ Yes I r e a l l y want t o c h a i n c a s e s
0 and 1 ! /
case 1 :
i++ ;
break ;
Algorithmique et programmation
IN101
198/1
Entiers vs flottants.
Signs vs non signs.
Tailles diffrentes.
IN101
199/1
Algorithmique et programmation
IN101
200/1
Complexit
Algorithmique et programmation
IN101
201/1
Motivation
Se rappeler du premier cours, programmer :
noncer une manire deffectuer un calcul.
Il existe toujours plusieurs manires deffectuer un calcul.
Exemple, la multiplication:
i n t heavy_mult ( i n t a , i n t b )
{
int res = 0 ;
f o r ( i n t i = 0 ; i < b ; i ++)
res = res + a ;
return ( res ) ;
}
i n t mult ( i n t a , i n t b )
{
return (a b) ;
}
Algorithmique et programmation
IN101
202/1
Algorithmique et programmation
IN101
203/1
Taille de lentre: n.
La boucle va tourner n fois.
La fonction va faire n additions . . . + n pour lincrmentation de la
boucle, + n tests.
En gnral, on ne sintresse quaux oprations calculant le rsultat.
Bref, la complexit est linaire en la taille de lentre.
Algorithmique et programmation
IN101
204/1
Un peu de rflexion:
0 1
+ +
n=5 4
2
+
3
3
+
2
4 n=5
+ +
1 0
n+n+n+n+n+n
n+1
ni=0 i =
n(n+1)
2
= 2 * (1 + 2 + ... + 5)
= n (n / 1)
1 addition +
1 multiplication +
1 division.
Et mme pas de tests ou autres incrmentations autour !
Calcul en temps constant.
Algorithmique et programmation
IN101
205/1
Notations de complexit
Avec k N
Et x0 N , x x0 ( comportement asymptotique).
Algorithmique et programmation
IN101
206/1
Exemple:
(g ): ensemble des fonctions f telles que k1 g (x) f (x) k2 g (x)
x 2 + x + 1 = (n2 )
Algorithmique et programmation
IN101
207/1
Exemple: O
O(g ) : ensemble des fonctions f telles que 0 f (x) k g (x)
Algorithmique et programmation
IN101
208/1
Classement de complexits
log(n)
n
n n n log(n) n2 n3 2n exp(n) n! nn 22
Dfinitions : complexit
Quelques exemples:
Algorithmique et programmation
IN101
209/1
IN101
210/1
Fibonnaci
Algorithmique et programmation
IN101
211/1
Calcul direct
Racine 1: = 21 (1 + 5)
Racine 2: = 21 (1 5)
Fibn = 1 (n n )
0.62
.
5
Algorithmique et programmation
IN101
212/1
unsigned i n t f i b ( unsigned i n t n )
{
i f ( n < 2) return ( n ) ;
e l s e return ( f i b ( n 1) + f i b ( n 2) ) ;
}
Fibn =
complexit = (Fibn ) = (n ) : exponentielle.
n
Algorithmique et programmation
IN101
213/1
IN101
214/1
IN101
215/1
5).
n1
1 1
)
= (
1 0
Fib
( n1 )
Fibn2
Fib
( 1)
Fib0
IN101
216/1
fibo1
fibo2
fibo3
fibo4
(n )
(n)
(n)
(log (n))
40
31s
0s
0s
0s
225
228
231
Calcul irralisable
18s Segmentation fault
4s 25s
195s
0s
0s
0s
Algorithmique et programmation
IN101
217/1
Thorie de la complexit
Algorithmique et programmation
IN101
218/1
Dfinitions
Problme: Question comportant un ou plusieurs paramtres.
Quel est le plus court chemin entre deux sommets donns dun graphe
?
Instance: Donne du problme sur une valeur de ses paramtres.
G = (S , A), x , y G : quel est le plus court chemin entre x et y dans G
?
Algorithmique et programmation
IN101
219/1
Classes de complexit
Les deux classes de problmes dont on parle le plus sont:
On a P NP.
?
IN101
220/1
Algorithmique et programmation
IN101
221/1
Pour une distance D, existe-t-il un chemin plus court que D qui passe
exactement une fois par chaque ville et revienne au point de dpart ?
Pour n villes, n! parcours possibles:
Algorithmique et programmation
IN101
222/1
Dans P: tris, pgcd, factorielle, etc. . . des choses que lon a vues.
Dans NP:
Algorithmique et programmation
IN101
223/1
Les tris
Algorithmique et programmation
IN101
224/1
Trier la tableau.
Puis le parcourir en comparant 2 voisins.
complexit en (n log (n)).
Algorithmique et programmation
IN101
225/1
Le tri
Algorithmique et programmation
IN101
226/1
Complexit variable
Problme du tri: complexit dpendante de la taille du tableau et de
lorganisation des valeurs et des valeurs.
Complexit dans le pire cas:
Temps de calcul dans le pire cas pour les entres de taille n fixe.
T (n) =
max
T (e)
Complexit moyenne:
Temps de calcul moyen sur toutes les entres de taille n fixe
Tm (n) =
Pn (e) T (e)
Algorithmique et programmation
IN101
227/1
7
3
10
5 10 3
5 10 1
10
10
5 10 7
10
7 10
Algorithmique et programmation
IN101
228/1
Complexit:
Algorithmique et programmation
IN101
229/1
10 5
5 10 3 11 7
5
3 10 11 7
3 10 11 7
3 10 7 11
5 10 7 11
5 10 7 11
7 10 11
7 10 11
7 10 11
7 10 11
7 10 11
Algorithmique et programmation
IN101
230/1
n
2
Algorithmique et programmation
IN101
231/1
Algorithmique et programmation
IN101
232/1
On choisit un pivot.
On met les lments plus petits que le pivot gauche, ceux plus
grands droite et le pivot au milieu.
Il reste alors trier les 2 sous-tableaux de gauche et de droite. . .
. . . en faisant du tri rapide.
Algorithmique et programmation
IN101
233/1
<
>V
>
<V
V
>)
Rechercher le
premier lment
pivot en partant de
la droite (9).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(V
Rechercher le
premier lment >
pivot en partant de
la gauche (8).
j
final
Algorithmique et programmation
IN101
234/1
Cas le pire
En moyenne
(n2 )
(n2 )
(n2 )
(n log (n))
(n log (n))
(n log (n))
Algorithmique et programmation
IN101
235/1
Algorithmique et programmation
IN101
236/1
Algorithmique et programmation
IN101
237/1
x,y
z,t
e1 e 2
1,2
<
>
2,1
e2 e 3
1,2
2,3
<
1,2,3
e1 e 3
1,2
> 3,2
e1 e 3
<
1,2 1,3,2
3,2
1,3
Ordre de croissance
2,1
1,3
<
2,1,3
>
3,1,2 1,2
3,2
3,1
2,1
> 3,1
e2 e 3
<
2,1 2,3,1
3,1
2,3
>
3,2,1 2,1
3,1
3,2
IN101
238/1
Algorithmique et programmation
IN101
239/1
Algorithmique et programmation
IN101
240/1
Recherche en table
Algorithmique et programmation
IN101
241/1
Oprations souhaites:
Insertion.
Recherche.
Suppression.
Algorithmique et programmation
IN101
242/1
Paires clef-valeur
Algorithmique et programmation
IN101
243/1
Plusieurs solutions
Algorithmique et programmation
IN101
244/1
Ladressage direct
Les rsultats sportifs: 3me du classement 3me case.
0
1
info 1
info 2
m1
info 4
Algorithmique et programmation
IN101
245/1
(clef3 ,info 3)
(clef1 ,info 1)
(clef2 ,info 2)
n1
(clef 0 ,info 0)
IN101
246/1
Algorithmique et programmation
IN101
247/1
(clef2 ,info 2)
(clef3 ,info 3)
(clef7 ,info 7)
n1
Algorithmique et programmation
IN101
248/1
Algorithmique et programmation
IN101
249/1
k1
info 6
info 27
IN101
250/1
k1
info 6
info 27
Algorithmique et programmation
IN101
251/1
spatiale : (k + m)
recherche : ( ),
insertion : (1),
suppression : ( ).
Ncessit dune une bonne fonction de hachage (non biaise sur les
entres).
Ncessit de connatre m lavance pour choisir k m.
Algorithmique et programmation
IN101
252/1
Recherche de motifs
Algorithmique et programmation
IN101
253/1
31
31
31
31
31
31
31
31
31
31
31
13:56:46
14:03:40
14:03:40
14:03:50
14:03:50
14:03:50
14:03:50
14:03:50
14:03:50
14:03:50
14:03:51
IN101
254/1
Algorithmique et programmation
IN101
255/1
Algorithmique et programmation
IN101
256/1
Plus formellement
Algorithmique et programmation
IN101
257/1
Un algorithme naf
void ngrep
{
int s , j
int n =
int m =
( c h a r T , c h a r M)
;
s t r l e n (T) ;
s t r l e n (M) ;
// L o n g u e u r du t e x t e .
// L o n g u e u r du m o t i f .
/ On f a i t t o u s l e s d c a l a g e s s . /
f o r ( s = 0 ; s < n m + 1 ; s++) {
j = 0 ;
/ Tant que l e s c a r a c t r e s du m o t i f e t du t e x t e c o l l e n t on
c o n t i n u e ( s a n s d p a s s e r l a t a i l l e du m o t i f ) . /
w h i l e ( ( j < m) && (M[ j ] == T [ s+j ] ) ) j++ ;
i f ( j == m) p r i n t f ( "%d\n" , s ) ;
}
}
IN101
258/1
Algorithme de Rabin-Karp
Algorithmique et programmation
IN101
259/1
Alphabet = {A, T , G , C }
d = 4.
On pose A = 0, T = 1, G = 2 et C = 3.
(T )
(A)
(G )
(C )
(A)
(G )
(A)
t0 = 1 d 2 + 0 d + 2 = 18
t1 = 0 d 2 + 2 d + 3 = 11
t2 = 2 d 2 + 3 d + 0 = 44
t3 = 3 d 2 + 0 d + 2 = 50
t4 = 0 d 2 + 2 d + 0 = 8
t5 = 2 d 2 + 0 d + 2 = 34
t6 = 2 d 2 + 2 d + 0 = 8
Algorithmique et programmation
IN101
260/1
Calculer h = d m1 .
Calculer p.
Calculer t0 et mmoriser t t0 .
Pour s allant de 0 n m 1 faire
Algorithmique et programmation
IN101
261/1
c h a r M)
(T)
(M)
;
;
p o u r t o u t e . /
/ C a l c u l de p . /
long int p = 0 ;
f o r ( i = 0 ; i < m; i ++) p = ( p d ) + v a l o f
(M[ i ] )
/ C a l c u l de t_0 e t > d a n s t . /
long int t = 0 ;
f o r ( i = 0 ; i < m; i ++) t = ( t d ) + v a l o f
(T [ i ] )
/ I t r a t i o n de [ 0 nm 1 ] . /
f o r ( s = 0 ; s < n m; s++) {
i f ( p == t ) p r i n t f ( " Found o c c u r r e n c e %l d \ n " , s ) ;
t = ( t ( v a l o f (T [ s ] ) h ) ) d + v a l o f (T [ s + m] )
}
i f ( p == t ) p r i n t f ( " Found o c c u r r e n c e a t %l d \ n " , s ) ;
Algorithmique et programmation
IN101
262/1
Calcul de h en (m).
Calcul de p et t0 en (m).
n m calculs des ts en (1) (n m)
Algorithmique et programmation
IN101
263/1
Mot de 10 lettres,
Alphabet alphanumrique maj/min ( 74 lettres),
7410 = 4923990397355877376
Algorithmique et programmation
IN101
264/1
Algorithmique et programmation
IN101
265/1
Automates finis
Algorithmique et programmation
IN101
266/1
Un exemple de besoin
Systme de contrle dune cluse:
Amont F
Aval F
bateau sorti
entre
aval
Vidange
vide
Amont F
Aval O
entre
amont
Vidange
porte amont
close
bateau entr
Amont F
Aval F
Remplissage
Amont F
Aval F
bateau
entr
plein
Amont O
Aval F
plein
porte aval
close
Remplissage
bateau
sorti
Algorithmique et programmation
IN101
267/1
Quelques questions
vide
Amont F
Aval F
bateau sorti
entre
aval
Vidange
vide
Amont F
Aval O
entre
amont
Vidange
porte amont
close
bateau entr
Amont F
Aval F
Remplissage
Amont F
Aval F
bateau
entr
plein
Amont O
Aval F
plein
porte aval
close
Remplissage
bateau
sorti
IN101
268/1
Dfinition formelle
Automate fini: machine pouvant se trouver dans un nombre fini
dtats.
Reconnait des mots: suites de caractres reprsents par les tiquettes
sur transitions (flches).
Un automate fini dterministe est la donn de:
a
un alphabet fini,{a, b}
2
a
Algorithmique et programmation
IN101
269/1
Fonctionnement
(q , c).
Algorithmique et programmation
IN101
270/1
Exemple de fonctionnement:
Que reconnait . . . ?
a
1
2
a
Algorithmique et programmation
IN101
271/1
Exemple de fonctionnement:
Que reconnait . . . ?
a
1
ab : un a suivi dun b,
(abb): a ou bb,
a : un nombre quelconque de a, y compris 0,
a+ : un nombre strictement positif de a ( aa ).
IN101
272/1
Exemple de fonctionnement:
Reconnatre exactement . . .
Reconnaissance de digicode.
Code: 0203
09
0
19
q0
1, 39
qf
0
1, 49
IN101
273/1
construction de lautomate
Algorithmique et programmation
IN101
274/1
Pour chaque tat, brancher les transitions sur les autres caractres.
Algorithmique et programmation
IN101
275/1
M 4 a = ababa
aba bba
a
Transition vers 3
IN101
276/1
Algorithmique et programmation
IN101
277/1
Algorithmique et programmation
IN101
278/1
Algorithmique et programmation
IN101
279/1
a
b
Algorithmique et programmation
IN101
280/1
a
b
Etc.
Algorithmique et programmation
IN101
281/1
Algorithmique et programmation
IN101
282/1
IN101
283/1
Domaines dapplication
Nombreuses applications.
Sapplique tout ce qui a un nombre fini dtats.
Algorithmique et programmation
IN101
284/1
Automates non-dterministes
Algorithmique et programmation
IN101
285/1
Non-dterminisme
Algorithmique et programmation
IN101
286/1
Parcours non-dterministe
Reconnatre: ab(ab)+
Lautomate non-dterministe est simple:
Algorithmique et programmation
IN101
287/1
Dterminisation: N D (1)
tat initial: reste le mme.
Chaque tat de D est un ensemble des tats de N.
Ltat initial d0 de D : tat initial de N + tats de D accessibles,
directt ou indirectt par -transitions.
Algorithmique et programmation
IN101
288/1
Dterminisation: N D (2)
Pour chaque lment s de sur
lequel lun au moins des
lments de d0 a une transition,
construire une transition sur s
partant de d0 vers un nouvel
tat constitu de lensemble des
tats destination des transitions
sur s au dpart de lun des
lments de d0 .
Complter cet tat en y
ajoutant les tats de N
accessibles par des -transitions
issues de lun de ses lments.
Processus rcursif pour chacun des tats crs.
tats finaux de D: tats qui contiennent un tat final de N.
Algorithmique et programmation
IN101
289/1
Simplification
Deux tats dont toutes les transitions sont identiques peuvent tre
fusionns.
Un tat duquel aucune suite de symboles ne permet datteindre un tat
final peut tre supprim.
Un tat final pour lequel toute suite de symbole ramne sur lui-mme
peut tre boucl sur lui-mme.
Algorithmique et programmation
IN101
290/1
Automate
a
MN
N
M
MN
M
Algorithmique et programmation
IN101
291/1
Piles
Algorithmique et programmation
IN101
292/1
elem4
elem4
2)
elem3
elem4
elem3
elem2
elem1
elem3
elem2
elem1
elem2
elem1
Algorithmique et programmation
IN101
293/1
elem4
elem4
elem3
elem3
elem3
elem2
elem2
elem2
elem1
elem1
elem1
Empiler
Dpiler
Algorithmique et programmation
IN101
294/1
Algorithmique et programmation
IN101
295/1
???
sp
data[MAX_SIZE 1]
???
data[2]
???
data[1]
???
data[0]
sp
Algorithmique et programmation
IN101
296/1
???
data[MAX_SIZE 1]
push 42:
sp
???
data[2]
???
data[1]
42
data[0]
sp
Algorithmique et programmation
IN101
297/1
???
data[MAX_SIZE 1]
push 5:
sp
???
data[2]
data[1]
42
data[0]
sp
Algorithmique et programmation
IN101
298/1
pop:
???
data[MAX_SIZE 1]
sp
???
data[2]
?5?
data[1]
42
data[0]
sp
Algorithmique et programmation
IN101
299/1
???
data[MAX_SIZE 1]
push 34:
sp
???
data[2]
34
data[1]
42
data[0]
sp
Algorithmique et programmation
IN101
300/1
sp
56
data[MAX_SIZE 1]
64
5
data[2]
data[1]
42
data[0]
MAX_SIZE
sp
push !!!
sp = MAX _SIZE .
erreur.
sp
sp = 0.
erreur.
0
pop !!!
Algorithmique et programmation
IN101
301/1
Pile: implmentation en C
i n t pop ( s t a c k P)
{
i f (P>s p == 0 ) {
/ P i l e v i d e . /
error () ;
}
P>sp ;
r e t u r n (P>d a t a [ P>s p ] ) ;
}
v o i d push ( s t a c k P , i n t v a l ) {
i f (P>s p == MAX_SIZE) {
/ P i l e p l e i n e . /
error () ;
}
P>d a t a [ P>s p ] = v a l ;
P>s p++ ;
}
Algorithmique et programmation
IN101
302/1
/* Taille de la pile. */
/ P o i n t e u r de p i l e . /
/ Mmoire de p i l e . /
IN101
303/1
Algorithmique et programmation
IN101
304/1
Files
Algorithmique et programmation
IN101
305/1
e3 e2 e1 e0
sortie
temps
Algorithmique et programmation
IN101
306/1
e3 e2 e1 e0
e4 e3 e2 e1 e0
e4 e3 e2 e1
take
e0
e4 e3 e2
take
e1
e4 e3
take
e2
Algorithmique et programmation
IN101
307/1
/ Nombre max d l m e n t s . /
/ Nombre a c t u e l d l m e n t s . /
/ I n d i c e du p r e m i e r l m e n t . /
Algorithmique et programmation
IN101
308/1
max_nb
cur_nb
first
???
???
???
???
data
Taille de la file: 4.
Initialisation: file vide, i.e. aucune donne.
cur_nb, first = 0.
Algorithmique et programmation
IN101
309/1
max_nb
cur_nb
first
???
???
???
first
enqueue 5
data
enqueue 5:
Algorithmique et programmation
IN101
310/1
max_nb
cur_nb
first
data
42
56
???
first
enqueue 42
enqueue 56
Premier indice libre: first + cur _nb . . . tant que / taille max.
Algorithmique et programmation
IN101
311/1
max_nb
cur_nb
first
?5?
42
56
???
first
take
data
take:
IN101
312/1
max_nb
cur_nb
first
?5?
42
56
27
first
enqueue 27
data
enqueue 27
Algorithmique et programmation
IN101
313/1
max_nb
cur_nb
first
42
56
27
first
enqueue 9
data
enqueue 9
Arriv en bout de tableau la file nest pas forcment pleine.
Dpend de sil y a de la place en dbut du tableau.
Algorithmique et programmation
IN101
314/1
max_nb
cur_nb
first
?42?
?56?
?27?
first
data
42
take
56
27
take
take
IN101
315/1
File: implmentation en C
i n t t a k e ( queue F ) {
int res ;
i f ( F>cur_nb == 0 ) {
/ F i l e v i d e . /
error () ;
}
r e s = F>d a t a [ F> f i r s t ] ;
F> f i r s t = ( F> f i r s t + 1 ) %F > max_nb ;
F>cur_nb ;
return ( res ) ;
}
v o i d e n q u e u e ( queue F , i n t v a l ) {
i f ( F>cur_nb == F>max_nb ) {
/ F i l e p l e i n e . /
error () ;
}
F>d a t a [ ( F> f i r s t + F>cur_nb ) %F > max_nb ] = v a l ;
F>cur_nb++ ;
}
Algorithmique et programmation
IN101
316/1
max_nb
cur_nb
first
data
42
56
27
42
56
27
first
realloc
Algorithmique et programmation
IN101
317/1
Ide:
max_nb
cur_nb
first
data
42
56
27
42
56
27
first
malloc
Algorithmique et programmation
IN101
318/1
IN101
319/1
Listes chanes
Algorithmique et programmation
IN101
320/1
Structure de liste
Une liste cest:
struct l i s t {
i n t data ;
// Le c o n t e n u n e s t p a s f o r c m e n t un i n t .
s t r u c t n e x t ; // P o i n t e u r v e r s l l m e n t s u i v a n t ( ou NULL) .
};
IN101
321/1
Organisation mmoire
En mmoire, lments disperss =/ tableau o lments contigus.
Impossible daccder directement au i me lment.
17
val
next
next
L
val
next
42
(NULL)
Algorithmique et programmation
IN101
322/1
Liste [ 1; 5; 6 ]
tte (head) = 1
queue (tail) = [ 5; 6 ]
de type elem.
de type elem list.
Algorithmique et programmation
IN101
323/1
Algorithmique et programmation
IN101
324/1
lst
...
lst
...
Algorithmique et programmation
IN101
325/1
void p r i n t ( struct l i s t l s t )
{
printf (" [ ") ;
w h i l e ( l s t != NULL) {
p r i n t f ( " %d" , l s t >d a t a ) ;
l s t = l s t >n e x t ;
}
printf (" ] ") ;
}
Algorithmique et programmation
IN101
326/1
ntf
ntf
pri
pri
ntf
pri
tmp != NULL
tmp != NULL
ntf
pri
ntf
pri
tmp != NULL
tmp != NULL
urn
ret
tmp == NULL
tmp != NULL
Algorithmique et programmation
IN101
327/1
s t r u c t l i s t append ( s t r u c t l i s t l 1 , s t r u c t l i s t l 2 )
{
s t r u c t l i s t tmp ;
i f ( tmp == NULL) r e t u r n ( l 2 ) ;
tmp = l 1 ;
w h i l e ( tmp>n e x t != NULL) tmp = tmp>n e x t ;
tmp>n e x t = l 2 ;
return ( l1 ) ;
}
l1
l2
l1
parcours...
l2
Algorithmique et programmation
IN101
328/1
Implmentation en C: libration
free_list list void
void f r e e _ l i s t ( struct l i s t l s t )
{
s t r u c t l i s t tmp ;
w h i l e ( l s t != NULL) {
tmp = l s t >n e x t ;
free ( lst ) ;
l s t = tmp ;
}
}
Algorithmique et programmation
IN101
329/1
free_list (l2)
free_list (l1)
vieux pointeur suivi
double libration
Algorithmique et programmation
IN101
330/1
free_list (l3)
l1 > next
l1
Algorithmique et programmation
IN101
331/1
La liste peut tre plus que le pointeur vers son premier lment:
struct l i s t {
i n t nb_elems ;
s t r u c t c e l l head ;
struct c e l l last ;
};
struct c e l l {
i n t data1 ;
i n t data2 ;
struct c e l l next ;
};
IN101
332/1
Les arbres
Algorithmique et programmation
IN101
333/1
Arbre ?
Algorithmique et programmation
IN101
334/1
Vocabulaire (1)
Nud (node):
racine
Racine (root)
Nud interne
Feuille (leaf)
Arc (edge)
Sous-arbre (subtree)
Parent:
Pre (parent)
Fils (child)
Frre (sibling)
noeuds internes
arc
feuilles
sousarbre
pre
Fils
Frres
Algorithmique et programmation
IN101
335/1
Vocabulaire (2)
Algorithmique et programmation
IN101
336/1
[1; 3; 8]
Type inductif:
Liste vide.
lement suivi dune liste.
1
3
8
Algorithmique et programmation
IN101
337/1
Constantes.
Oprateurs binaires entre expressions arithmtiques.
Appel de fonction avec des expressions arithmtiques en arguments.
Variables.
Exemple: cos(y + 3) z 5
valuation,
drivation,
simplification,
compilation. . .
*
cos
+
y
Algorithmique et programmation
IN101
338/1
Exemple: le dictionnaire
Arbre n-aire (26-aire).
Permet la partage de prfixes communs.
Puisque mots prfixes dautres, ncessit de marquer les fins de mots.
Exemple: { allo, bac, bache, barbe, barre, cou, court, courte }.
Algorithmique et programmation
IN101
339/1
bin
|-- alsaunmute
|-- arch
|-- awk
-- zcat
boot
|-- config-2.6.40.6-0.fc15.i686
Racine: /
|-- grub
|
|-- device.map
Noeuds internes:
|
|-- e2fs_stage1_5
Feuilles: fichiers.
|
|-- ufs2_stage1_5
|
|-- vstafs_stage1_5
|
-- xfs_stage1_5
|-- initramfs-2.6.40.6-0.fc15.i686.img
-- vmlinuz-2.6.43.2-6.fc15.i686
cgroup
dev
|-- autofs
rpertoires.
Algorithmique et programmation
IN101
340/1
chi
data
brother
d
hil
ch
ild
ild
ch
brother
brother
brother
s t r u c t node {
i n t data ;
s t r u c t node c h i l d ;
s t r u c t node b r o t h e r ;
};
Algorithmique et programmation
IN101
341/1
Arbres binaires
Un nud a au plus 2 fils:
1 fils droit
1 fils gauche
left
Codage de Huffman.
Calcul de la complexit optimale du tri.
Recherche sur un ensemble ordonn.
Satisfiabilit de formules boolennes (Binary Decision Diagram) . . .
data
right
s t r u c t bnode {
i n t data ;
s t r u c t bnode l e f t ;
s t r u c t bnode r i g h t ;
};
Algorithmique et programmation
IN101
342/1
4*0+1
a
b
d
c
e
h
7
Algorithmique et programmation
IN101
343/1
IN101
344/1
Au dbut.
v o i d p r e f i x ( b_node n ) {
i f ( n != NULL) {
do_something ( n>d a t a ) ;
p r e f i x ( n> l e f t ) ;
p r e f i x ( n> r i g h t ) ;
}
}
Algorithmique et programmation
IN101
345/1
Au milieu.
Si do_something est limpression: correspond lcriture normale
dune expression arithmtique.
4
v o i d i n f i x ( s t r u c t b_node n )
{
i f ( n != NULL) {
i n f i x ( n> l e f t ) ;
do_something ( n>d a t a ) ;
i n f i x ( n> r i g h t ) ;
}
}
+
1
3
3
sqrt
/
7
Algorithmique et programmation
IN101
346/1
la fin.
Si do_something est limpression: correspond lcriture RPN
(polonaise inverse).
7
v o i d p o s t f i x ( s t r u c t b_node n )
{
i f ( n != NULL) {
p o s t f i x ( n> l e f t ) ;
p o s t f i x ( n> r i g h t ) ;
0
do_something ( n> v a l ) ;
}
}
+
3
*
2
sqrt
7
4
/
2
5
3 4 sqrt * 7 2 / + (= 9.5)
Algorithmique et programmation
IN101
347/1
Algorithmique et programmation
IN101
348/1
3
7
+
2
*
4
sqrt
/
6
v o i d l a r g e u r ( s t r u c t b_node n )
{
enqueue ( n ) ;
w h i l e ( ( n = t a k e ( ) ) != NULL) {
do_something ( n>d a t a ) ;
i f ( n> l e f t != NULL)
e n q u e u e ( n> l e f t ) ;
i f ( n> r i g h t != NULL)
e n q u e u e ( n> r i g h t ) ;
}
}
Algorithmique et programmation
IN101
349/1
> 21
21
42
7
1
35
10
64
> 42
22
38
> 21 et < 42
Algorithmique et programmation
IN101
350/1
Recherche en (h)
(h hauteur de larbre).
Insertion en (h).
Suppression en (h).
Algorithmique et programmation
IN101
351/1
21
35 < 42 42
7
1
35
10
22
64
38
23 ?
21
23 > 21
#i n c l u d e <s t d b o o l . h>
bool
{
if
if
if
( n == NULL) r e t u r n ( f a l s e ) ;
( v == n>d a t a ) r e t u r n ( t r u e ) ;
( v < n>d a t a )
r e t u r n ( s e a r c h ( v , n> l e f t ) ) ;
else
r e t u r n ( s e a r c h ( v , n> r i g h t ) ) ;
23 < 42 42
s e a r c h ( i n t v , s t r u c t b_node n )
}
1
10
23 < 35 35
23 > 22 22
64
38
Algorithmique et programmation
IN101
352/1
21
23 < 42 42
7
1
10
23 < 35 35
23 > 22 22
64
38
23
Algorithmique et programmation
IN101
353/1
Algorithmique et programmation
IN101
354/1
42
35
10
22
64
Suppression du nud 8 . . .
38
21
7
1
42
35
10
22
64
38
Algorithmique et programmation
IN101
355/1
42
35
10
22
64
Suppression du nud 10 . . .
38
21
7
1
42
35
10
22
64
38
Algorithmique et programmation
IN101
356/1
42
Suppression du nud 21 . . .
1
35
10
22
64
38
10
7
42
35
10
22
64
38
Algorithmique et programmation
IN101
357/1
AVL trees.
Red-Black trees.
Patricia trees (radix trees).
Splay trees.
Etc. . .
Algorithmique et programmation
IN101
358/1
Les graphes
Algorithmique et programmation
IN101
359/1
Algorithmique et programmation
IN101
360/1
Intersection = sommet.
Routes = arcs entre les sommets.
Routes: peuvent avoir des caractristiques
IN101
361/1
Quelques utilisations
Algorithmique et programmation
IN101
362/1
arc
4
2
cycle
1
sommet
chemin de longueur 3
Algorithmique et programmation
IN101
363/1
arte
4
2
cycle
1
sommet
chane de longueur 3
Algorithmique et programmation
IN101
364/1
t
0
0
2
5
3
Algorithmique et programmation
IN101
365/1
0
0
2
5
Algorithmique et programmation
IN101
366/1
dest (j)
src (i)
4
2
5
1
3
Algorithmique et programmation
IN101
367/1
Existence de chemin(s).
Plus court(s) chemin(s).
Composantes (fortement) connexes ( accessibilit).
Recouvrements ( sous-graphes, arbres).
Tri topologique ( dpendances).
Etc.
Algorithmique et programmation
IN101
368/1
Recouvrement de graphe
Algorithmique et programmation
IN101
369/1
Exemple de recouvrement
1
Pre
Noeud
5
3
0
_
3
2
IN101
370/1
Parcours en largeur
quivalent du parcours par niveaux des arbres :
Algorithmique et programmation
IN101
371/1
IN101
372/1
Algorithmique et programmation
IN101
373/1
Algorithmique et programmation
IN101
374/1
3
5
Algorithmique et programmation
IN101
375/1
13
12
10
11
14
10
11
12
13
12
11
10
11
12
13
14
13
14
13
12
13
14
Algorithmique et programmation
IN101
376/1
IN101
377/1
Mmoriser date f i n .
Algorithmique et programmation
IN101
378/1
4
0
5
3
Algorithmique et programmation
IN101
379/1
5
3
Algorithmique et programmation
IN101
380/1
5
3
Algorithmique et programmation
IN101
381/1
5
3
IN101
382/1
0
3
5
4
Algorithmique et programmation
IN101
383/1
0
3
5
4
Algorithmique et programmation
IN101
384/1
Algorithmique et programmation
IN101
385/1
crpis
cloisons
fentres
pelouse
eau
toit
cuisine
sanitaires
papier/peinture
Algorithmique et programmation
IN101
386/1
murs
beg=13
end=16
crpis
beg=12
end=17
beg=2
end=11 cloisons
fentres
beg=14
pelouse end=15
beg=7
beg=18
end=19
toit
beg=3
end=6
eau end=10
cuisine
beg=8
end=9
beg=4
end=5
sanitaires
papier/peinture
Algorithmique et programmation
IN101
387/1
beg=1
end=20
murs
beg=13
end=16
crpis
beg=12
end=17
beg=2
end=11 cloisons
fentres
toit 19
fentres 17
beg=14
pelouse end=15
beg=7
beg=18
end=19
toit
beg=3
end=6
beg=4
end=5
cuisine
sanitaires
sanitaires
papier/peinture
crpis 16
pelouse 15
cloisons 11
eau 10
eau end=10
beg=8
end=9
fondations 21
murs 20
temps
beg=0
end=21 fondations
cuisine
5
9
6
papier/peinture
Algorithmique et programmation
IN101
388/1
Algorithmique et programmation
IN101
389/1
1
Mik,,j = (Mik
,l Ml ,j )
l=1
1
Mik
,l
Algorithmique et programmation
IN101
390/1
Existence de chemins
Dans un graphe n sommets, si un chemin existe entre i et j il est au
plus de longueur n.
On pose M + = M + M 2 + M 3 + ... + M n .
IN101
391/1
0
1
Mi,j = 0 si Mi+,j = 0.
M i ,j = 1 sinon.
Complexit en (n4 ) M
Algorithmique et programmation
IN101
392/1
n ; k++) {
< n ; i ++) {
j < n ; j ++) {
N [ i ] [ j ] | | (N [ i ] [ k ] && N [ k ] [ j ] ) ;
Algorithmique et programmation
IN101
393/1
Algorithmique et programmation
IN101
394/1
Jusqu prsent. . .
Algorithmique et programmation
IN101
395/1
Algorithmique et programmation
IN101
396/1
Bibliothque
Algorithmique et programmation
IN101
397/1
Exemples
Algorithmique et programmation
IN101
398/1
Utilisation
Du code binaire.
Des fichiers dentte (.hs) : lApplication Programming Interface.
(. . . Souvent) une documentation.
Lecture de la documentation:
Paradigme dutilisation.
Organisation de la bibliothque ( chapitres).
Quand cest bien fait, comme les enttes plus des explications. . .
Algorithmique et programmation
IN101
399/1
Algorithmique et programmation
IN101
400/1
GSL: documentation
Algorithmique et programmation
IN101
401/1
Algorithmique et programmation
IN101
402/1
1
1
1
1
1
1
1
1
1
1
1
root
root
root
root
root
root
root
root
root
root
root
admin
admin
admin
admin
admin
admin
admin
admin
admin
admin
admin
2781
519
4533
6655
6852
4460
4533
7560
4606
4918
4845
14
14
14
14
14
14
14
14
14
14
14
sep
sep
sep
sep
sep
sep
sep
sep
sep
sep
sep
22:04
22:04
22:04
22:04
22:04
22:04
22:04
22:04
22:04
22:04
22:04
gsl_spline.h
gsl_statistics.h
gsl_statistics_char.h
gsl_statistics_double.h
gsl_statistics_float.h
gsl_statistics_int.h
gsl_statistics_long.h
gsl_statistics_long_double.h
gsl_statistics_short.h
gsl_statistics_uchar.h
gsl_statistics_uint.h
...
#ifdef __cplusplus
# define __BEGIN_DECLS extern "C" {
# define __END_DECLS }
#else
# define __BEGIN_DECLS /* empty */
# define __END_DECLS /* empty */
#endif
__BEGIN_DECLS
double gsl_stats_char_mean (const char data[], const size_t stride, const size_t n);
double gsl_stats_char_variance (const char data[], const size_t stride, const size_t n);
double gsl_stats_char_sd (const char data[], const size_t stride, const size_t n);
...
Algorithmique et programmation
IN101
403/1
GSL: code
-rwxr-xr-x
-rw-r--r-lrwxr-xr-x
-rwxr-xr-x
-rwxr-xr-x
-rw-r--r-...
1
1
1
1
1
1
root
root
root
root
root
root
admin
admin
admin
admin
admin
admin
2169752
3380304
14
925
236088
342232
14
14
14
14
14
14
sep
sep
sep
sep
sep
sep
22:04
22:04
22:04
22:04
22:04
22:04
/opt/local/lib/libgsl.0.dylib
/opt/local/lib/libgsl.a
/opt/local/lib/libgsl.dylib -> libgsl.0.dylib
/opt/local/lib/libgsl.la
/opt/local/lib/libgslcblas.0.dylib
/opt/local/lib/libgslcblas.a
IN101
404/1
Algorithmique et programmation
IN101
405/1
dinterrompre lexcution,
poser des points darrt spcifiques / conditionnels,
surveiller les valeurs des variables,
trouver la ligne de code o a plante,
Etc.
Algorithmique et programmation
IN101
406/1
gdb: lancement
Algorithmique et programmation
IN101
407/1
Algorithmique et programmation
IN101
408/1
Algorithmique et programmation
IN101
409/1
Algorithmique et programmation
IN101
410/1
Algorithmique et programmation
IN101
411/1
Construire un excutable
crits la main,
gnrs automatiquement (lexer, parsers, automates, etc.).
Algorithmique et programmation
IN101
412/1
Un Makefile
Fichier de description de build: Makefile.
Dfinit:
Des cibles,
fabriquer partir de pr-requis,
en appliquant des commandes.
IN101
413/1
Algorithmique et programmation
IN101
414/1
IN101
415/1
Algorithmique et programmation
IN101
416/1
Algorithmique et programmation
IN101
417/1
IN101
418/1
Algorithmique et programmation
IN101
419/1
Algorithmique et programmation
IN101
420/1
IN101
421/1
IN101
422/1