Vous êtes sur la page 1sur 59

Algorithmes et structures de donnes 8me cours

Patrick Reuter
matre de confrences http://www.labri.fr/~preuter

Thorie de la complexit
Classes de Grand-O
O(1) O(log n) O(n) O(n log n) O(na)
O(n2) O(n3)

complexit constante complexit logarithmique complexit linaire complexit quasi-linaire complexit polynomiale
complexit quadratique complexit cubique

O(an)

complexit exponentielle

O(log n) O(n) O(n log n) O(n2) O(n3) O(2n)

Thorie de la complexit
En gnral :

O(f) = {g | c > 0 :  n0 > 0 :  n n0 : g(n) c f(n)}


Soit g une fonction non ngative. g est dans O(f) sil existe deux constantes positives c et n0 telles que g e cf(n) pour tout n > n0.
EXEMPLE : T(n) = 9n2 O(n2) f = n2, g = 9n2

Algorithme A1 en O(n) A2 : Excuter 4 fois lalgorithme A1 Quel est sa complexit ?

Elimination des constantes


Si T(n) O(kf(n)) o k > 0, une constante alors T(n) O(f(n)). Les constantes sont ignores!

Algorithme A1 en O(n) A3 : Excuter 4n2 fois lalgorithme A1 Quel est sa complexit ?

Rgle des produits


Si T1(n) O(f(n)) et T2(n) O(g(n)) alors T1(n)T2(n) = O(f(n) g(n))

Algorithme A1 en O(n) Algorithme A2 en O(n2)

A4: Excution successive de A1 et A2 Quel est sa complexit ?

Rgle des sommes


Si T1(n) O(f(n)) et T2(n) O(g(n)), alors T1(n) + T2(n) O(max(f(n), g(n)))

Transitivit
Si f(n) O(g(n)) et g(n) O(h(n)), alors f(n) O(h(n)). La notation Grand-O est transitive

Algorithme A1 avec T1(n) = log2n Algorithme A2 avec T2(n) = log10n

Quelle algorithme a la meilleure complexit asymptotique ?

La base du logarithme
logan = logbn _____ logba

La base du logarithme
logan = logbn _____ logba < == > logbn = logb a * loga n

La base du logarithme
logan = logbn _____ logba < == > logbn = logb a * loga n = c * loga n

La base du logarithme
logan = logbn _____ logba < == > logbn = logb a * loga n = c * loga n Avec c = logb a (ne dpend pas de n) c peut tre considrer comme une constante

Dclaration de variables
var compteur : integer; var diviseur : single; var c : char; var precision : double; var nom : string; var masculin : boolean; Nombre virgule flottante avec double prcision Chane de caractre Tableau } Nombre entier Nombre virgule flottante

var jours : array[1..12] of byte; diviseur := 1.1; compteur : = 1; Nom := Gerhard; { Affectation

Dclaration de variables
var compteur : integer; var diviseur : single; var c : byte; var precision : double; var nom : string; var masculin : boolean; Nombre virgule flottante avec double prcision Chane de caractre Tableau } Nombre entier Nombre virgule flottante

var jours : array[1..12] of byte; diviseur := 1.1; compteur : = 1; Nom := Gerhard; { Affectation

Dclaration de variables
Types de base prdfinis
Integer, boolean, Real, Single,

Les types numrs


type t_jourdesemaine =(lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche); var jour : t_jourdesemaine;

Type tableau (structure homogne) - 1 dimension

TABLEAU STATIQUE

type t_tableau = array[1..12] of byte; var jours : t_tableau;

2 dimensions
type t_damier = array[1..8] of array[1..8] of t_champ; var damier : t_damier;

Type enregistrement (structure htrogne)


type t_date jour mois an END; = RECORD : : : byte; byte; integer;

var aujourdhui : t_date

RAPPEL MEMOIRE

Types de base prdfinis


char integer

Organisation de la mmoire
var nombre : byte; lettre := 191;
#536.870.911 #536.870.910 ... #1.000 ... #5 lettre #4 #3 #2 #1 #0 191

Organisation de la mmoire
var nombre : integer; nombre := 125;
#536.870.911 #536.870.910 ... #1.000 ... #5 #4 #3 #2 #1 #0

( 4 byte (octets) )

nombre nombre nombre nombre

0 0 0 0 0 0 125 125

RAPPEL MEMOIRE

Type tableau (structure homogne) (statique) 1D 2D n D

Organisation de la mmoire
var jours : array[1..12] of byte;
#536.870.911 #536.870.910 ... jours[12] #2011 ... ... jours[3] jours[2] jours[1] #2002 #2001 #2000 ... #0

{12 octets}

Organisation de la mmoire
Jours[1]:=31; jours[2]:=30;
#536.870.911 #536.870.910 ... jours[12] #2011 31 ... jours[3] jours[2] jours[1] #2002 #2001 #2000 31 28 31 ... #0

Organisation de la mmoire
var jours : array[1..12] of byte;
#536.870.911 #536.870.910 ... jours[12] #2011 31 ... jours[3] jours[2] jours[1] #2002 #2001 #2000 31 28 31 ... #0 Occupe de la place successive dans la mmoire

{12 octets}

Organisation de la mmoire
var jours : array[1..12] of byte;
#536.870.911 #536.870.910 ... jours[12] #2011 31 ... jours[3] jours[2] jours[1] #2002 #2001 #2000 31 28 31 ... #0 jours[index] #(2000+index-1) Occupe de la place successive dans la mmoire

{12 octets}

2D

Organisation de la mmoire
type t_ligne = array[1..3] of byte; type t_tableau2 = array[1..3] of t_ligne; var a : t_tableau2;

#536.870.911 #536.870.910 ... a[3][3] ... a[2][2] a[2][1] a[1][3] a[1][2] a[1][1] #2008 ... #2004 #2003 #2002 #2001 #2000 ... #0 a[i][j] #(2000+(3*(i-1))+ j - 1 ) Occupe de la place successive dans la mmoire

RAPPEL MEMOIRE

Type enregistrement 1D 2D n D

Type enregistrement (structure


htrogne)
Exemple
Dclaration du type
type t_date = RECORD an : mois : jour : END; integer; byte; byte;

Dclaration dune variable


var aujourdhui : t_date;

Affectation
aujourdhui.jour = 17; aujourdhui.mois = 10; aujourdhui.an = 2006;

Type enregistrement (structure


htrogne)
Exemple
Dclaration du type
type t_date = RECORD an mois jour END; : : : integer; byte; byte;

Dclaration dune variable


var aujourdhui : t_date;

Affectation
with aujourdhui do jour := 17; mois := 10; an := 2006; end

type t_date = RECORD an : mois : jour : END; var aujourdhui : t_date; #536.870.911 #536.870.910

integer; byte; byte;

... ...

aujourdhui.jour; aujourdhui.mois; aujourdhui.an; aujourdhui.an; aujourdhui.an; aujourdhui.an

#4005 #4004 #4003 #4002 #4001 #4000

17 10 0 0 7 214 ... Occupe de la place successive dans la mmoire

#0

NOUVEAU :

Adresse dune variable


Stock dans 4 Octets (32 bit), comme a on peut adresser 232 octets = 4 294 967 296 octes = 4 GO Limite bientt atteint

Organisation de la mmoire
var a : byte;
#536.870.911 #536.870.910 ... #1.000 ... #5 #4 #3 #2 #1 #0

( 1 octet (byte) )

Organisation de la mmoire
var a : byte;
#536.870.911 #536.870.910 ... #1.000 ... a #5 #4 #3 #2 #1 #0

Organisation de la mmoire
var a : byte; a := 97;
#536.870.911 #536.870.910 ... #1.000 ... a #5 #4 #3 #2 #1 #0 97

Organisation de la mmoire
var a : byte; a := 97;
#536.870.911 #536.870.910 ... #1.000 ... a #5 #4 #3 #2 #1 #0 97

Comment connatre ladresse de a ? Addr(a)

Organisation de la mmoire
var a : byte; a := 97; p_a := Addr(a);
#536.870.911 #536.870.910 ... #1.000 ... a #5 #4 #3 #2 #1 #0 97

{ Sauvegarder ladresse }

Comment connatre ladresse de a ? Addr(a)

var a : byte; var p_a : ^byte; a := 97; p_a := Addr(a);

{4 octets, lire : pointeur vers a} { Sauvegarder ladresse }

#536.870.911 #536.870.910 p_a #1.003 p_a #1.002 p_a #1.001 p_a #1.000 0 0 0 4 ... a #5 #4 #3 #2 #1 #0 97 p_a pointe vers a

Comment connatre ladresse de a ? Addr(a)

var a : byte; var p_a : pointer to byte; {4 octets, lire : pointeur vers a} a := 97; p_a := Addr(a); { Sauvegarder ladresse } { p_a est 4, p_a^ est 97) p_a^ := 10; { Drfrencement } #536.870.911 { p_a est 4, p_a^ est 10) #536.870.910 p_a #1.003 p_a #1.002 p_a #1.001 p_a #1.000 0 0 0 4 ... #5 p_a^ a #4 #3 #2 #1 #0 10

Comment connatre ladresse de a ? Addr(a)

var a : byte; var p_a : ^byte; a := 97; p_a := Addr(a);

{4 octets, lire : pointeur vers a} { Sauvegarder ladresse }

p_a^ := 10; a := 10;

{ affectation par drfrencement { affectation }

var a : byte; var p_a : ^byte; a := 97; p_a := Addr(a);

{4 octets, lire : pointeur vers a} { Sauvegarder ladresse }

p_a^ := 10; a := 10;

{ affectation par drfrencement { affectation }

Cest quivalent !!

Dfinitions
Dclaration dun pointeur vers un byte
var p_a : ^byte;

Drfrencement dun pointeur :


p_a^

Connatre ladresse dune variable a


Addr(a); @a; {ou bien }

var p_a : ^byte; begin p_a^ := 10; end. ERREUR !!

{4 octets, lire : pointeur vers a} { affectation par drfrencement}

var p_a : ^byte; p_a^ := 10; ERREUR !!

{4 octets, lire : pointeur vers a} { affectation par drfrencement }

#536.870.911 #536.870.910 p_a #1.003 p_a #1.002 p_a #1.001 p_a #1.000 ... #5 #4 #3 #2 #1 #0

var p_a : ^byte;

{4 octets, lire : pointeur vers a}

Et non plus : p_a := 4; { On ne sais pas si cest libre ! } p_a^ := 10; ERREUR !! { affectation par drfrencement #536.870.911 #536.870.910 p_a #1.003 p_a #1.002 p_a #1.001 p_a #1.000 ... #5 #4 #3 #2 #1 #0 }

var p_a : ^byte; ...

Solution {4 octets, lire : pointeur vers a}

#536.870.911 #536.870.910 p_a #1.003 p_a #1.002 p_a #1.001 p_a #1.000 0 0 0 0 ... ... #5 #4 #3 #2 #1 #0

var p_a : ^byte; ... New(p_a);

Solution {4 octets, lire : pointeur vers a}

#536.870.911 #536.870.910 p_a #1.003 p_a #1.002 p_a #1.001 p_a #1.000 0 0 0 0 ... ... #5 #4 #3 #2 #1 #0

p_a^

var p_a : ^byte; ... New(p_a); p_a^ := 10; { affectation par drfrencement } #536.870.911 #536.870.910 p_a pointe vers p_a^ 0 p_a #1.003 0 p_a #1.002 p_a #1.001 0 0 p_a #1.000 ... ... #5 #4 #3 #2 #1 #0

Solution {4 octets, lire : pointeur vers a}

p_a^

10

var p_a : ^byte; ... New(p_a); p_a^ := 10; { affectation par drfrencement ... Dispose(p_a); { Librer la mmoire } #536.870.911 #536.870.910 p_a #1.003 p_a #1.002 p_a #1.001 p_a #1.000 0 0 0 0 ... ... #5 #4 #3 #2 #1 #0

Solution {4 octets, lire : pointeur vers a}

Ebauche da la mmoire plus compacte

var a : byte; var p_a : ^byte;

{4 octets, lire : pointeur vers a} { Sauvegarder ladresse } { Drfrencement }

p_a := Addr(a); p_a^ := 10; #536.870.911 #536.870.910 p_a #1.003 p_a #1.002 p_a #1.001 p_a #1.000

0 0 0 4 ...

p_a pointe vers a

#5 #4 #3 #2 #1 #0

10

Comment connatre ladresse de a ? Addr(a)

var a : byte; var p_a : ^byte; p_a := Addr(a); p_a^ := 10;

{4 octets, lire : pointeur vers a} { Sauvegarder ladresse } { Drfrencement }

p_a

10

Vous aimerez peut-être aussi