Title: Algorithmes et structures de donnes 8me cours
1Algorithmes et structures de données8ème cours
- Patrick Reuter
- maître de conférences
- http//www.labri.fr/preuter
2Théorie de la complexité
- Classes de Grand-O
- O(1) complexité constante
- O(log n) complexité logarithmique
- O(n) complexité linéaire
- O(n log n) complexité quasi-linéaire
- O(na) complexité polynomiale
- O(n2) complexité quadratique
- O(n3) complexité cubique
- O(an) complexité exponentielle
O(log n) ? O(n) ? O(n log n) ? O(n2) ? O(n3) ?
O(2n)
3Théorie de la complexité
- En général
- O(f) g ?c gt 0 ? n0 gt 0 ? n n0 g(n)
c f(n) - Soit g une fonction non négative.
- g est dans O(f) sil existe deux constantes
positives c et n0 telles que g ? cf(n) pour tout
n gt n0. - EXEMPLE T(n) 9n2 ? O(n2) f n2, g
9n2 -
4- Algorithme A1 en O(n)
- A2 Exécuter 4 fois lalgorithme A1
- Quel est sa complexité ?
5Elimination des constantes
- Si
- T(n) ? O(kf(n))
- où k gt 0, une constante
- alors
- T(n) ? O(f(n)).
- Les constantes sont ignorées!
6- Algorithme A1 en O(n)
- A3 Exécuter 4n2 fois lalgorithme A1
- Quel est sa complexité ?
7Règle des produits
- Si
- T1(n) ? O(f(n))
- et
- T2(n) ? O(g(n))
- alors
- T1(n)T2(n) O(f(n) g(n))
8- Algorithme A1 en O(n)
- Algorithme A2 en O(n2)
- A4 Exécution successive de A1 et A2
- Quel est sa complexité ?
9Règle 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)))
10Transitivité
- Si
- f(n) ? O(g(n))
- et
- g(n) ? O(h(n)),
- alors
- f(n) ? O(h(n)).
- La notation Grand-O est transitive
11- Algorithme A1 avec T1(n) log2n
- Algorithme A2 avec T2(n) log10n
- Quelle algorithme a la meilleure complexité
asymptotique ?
12La base du logarithme
13La base du logarithme
- logbn
- logan _____
-
- logba
- lt gt
- logbn logb a loga n
14La base du logarithme
- logbn
- logan _____
-
- logba
- lt gt
- logbn logb a loga n c loga n
-
15La base du logarithme
- logbn
- logan _____
-
- logba
- lt gt
- logbn logb a loga n c loga n
- Avec c logb a
-
- (ne dépend pas de n)
-
- ? c peut être considérer
- comme une constante
16(No Transcript)
17Déclaration de variables
- var compteur integer
- var diviseur single
- var c char
- var precision double
- var nom string
- var masculin boolean
- var jours array1..12 of byte
- diviseur 1.1 Affectation
- compteur 1
- Nom Gerhard
Nombre entier
Nombre à virgule flottante
Nombre à virgule flottante avec double précision
Chaîne de caractère
Tableau
18Déclaration de variables
- var compteur integer
- var diviseur single
- var c byte
- var precision double
- var nom string
- var masculin boolean
- var jours array1..12 of byte
- diviseur 1.1 Affectation
- compteur 1
- Nom Gerhard
Nombre entier
Nombre à virgule flottante
Nombre à virgule flottante avec double précision
Chaîne de caractère
Tableau
19Déclaration de variables
- Types de base prédéfinis
- Integer, boolean, Real, Single,
- Les types énumérés
- type t_jourdesemaine (lundi, mardi, mercredi,
jeudi, vendredi, samedi, dimanche) - var jour t_jourdesemaine
- Type tableau (structure homogène) -- TABLEAU
STATIQUE - 1 dimension
-
- type t_tableau array1..12 of byte
- var jours t_tableau
- 2 dimensions
- type t_damier array1..8 of array1..8 of
t_champ
20RAPPEL MEMOIRE
- Types de base prédéfinis
- char
- integer
21Organisation de la mémoire
- var nombre byte
- lettre 191
536.870.911
536.870.910
...
1.000
...
5
lettre 4
191
3
2
1
0
22Organisation de la mémoire
- var nombre integer ( 4 byte (octets) )
- nombre 125
536.870.911
536.870.910
...
1.000
...
5
4
3
0
nombre
0
2
0
0
nombre
1
0
nombre
0
0
nombre
125
125
23RAPPEL MEMOIRE
- Type tableau (structure homogène)
- (statique)
- 1D
- 2D
- n D
24Organisation de la mémoire
- var jours array1..12 of byte 12
octets
536.870.911
536.870.910
...
jours12 2011
...
...
jours3 2002
jours2 2001
jours1 2000
...
0
25Organisation de la mémoire
536.870.911
536.870.910
...
jours12 2011
31
...
jours3 2002
31
jours2 2001
28
jours1 2000
31
...
0
26Organisation de la mémoire
- var jours array1..12 of byte 12
octets
536.870.911
536.870.910
...
jours12 2011
31
...
Occupe de la place successive dans la mémoire
jours3 2002
31
jours2 2001
28
jours1 2000
31
...
0
27Organisation de la mémoire
- var jours array1..12 of byte 12
octets
536.870.911
536.870.910
...
jours12 2011
31
...
Occupe de la place successive dans la mémoire
jours3 2002
31
jours2 2001
28
jours1 2000
31
...
0
? joursindex (2000index-1)
28 29Organisation de la mémoire
- type t_ligne array1..3 of byte
- type t_tableau2 array1..3 of t_ligne
- var a t_tableau2
536.870.911
536.870.910
...
a33 2008
...
...
a22 2004
Occupe de la place successive dans la mémoire
a21 2003
a13 2002
a12 2001
a11 2000
...
0
- aij (2000(3(i-1)) j - 1 )
30RAPPEL MEMOIRE
- Type enregistrement
- 1D
- 2D
- n D
31Type enregistrement (structure hétérogène)
- Exemple
- Déclaration du type
- type t_date RECORD
- an integer
- mois byte
- jour byte
- END
- Déclaration dune variable
- var aujourdhui t_date
- Affectation
- aujourdhui.jour 17
- aujourdhui.mois 10
- aujourdhui.an 2006
32Type enregistrement (structure hétérogène)
- Exemple
- Déclaration du type
- type t_date RECORD
- an integer
- mois byte
- jour byte
- END
- Déclaration dune variable
- var aujourdhui t_date
- Affectation
- with aujourdhui do
- jour 17
- mois 10
33- type t_date RECORD
- an integer
- mois byte
- jour byte
- END
- var aujourdhui t_date
536.870.911
...
536.870.910
...
17
aujourdhui.jour 4005
aujourdhui.mois 4004
10
aujourdhui.an 4003
0
aujourdhui.an 4002
0
Occupe de la place successive dans la mémoire
aujourdhui.an 4001
7
aujourdhui.an 4000
214
...
0
34 35(No Transcript)
36(No Transcript)
37Adresse dune variable
- Stocké dans 4 Octets (32 bit), comme ça on peut
adresser - 232 octets 4 294 967 296 octes
- 4 GO
- Limite bientôt atteint
38Organisation de la mémoire
- var a byte ( 1 octet (byte) )
536.870.911
536.870.910
...
1.000
...
5
4
3
2
1
0
39Organisation de la mémoire
536.870.911
536.870.910
...
1.000
...
5
a 4
3
2
1
0
40Organisation de la mémoire
536.870.911
536.870.910
...
1.000
...
5
a 4
97
3
2
1
0
41Organisation de la mémoire
536.870.911
536.870.910
...
1.000
...
5
a 4
97
3
2
1
0
Comment connaître ladresse de a ? ? Addr(a)
42Organisation de la mémoire
- var a byte
- a 97
- p_a Addr(a) Sauvegarder ladresse
536.870.911
536.870.910
...
1.000
...
5
a 4
97
3
2
1
0
Comment connaître ladresse de a ? ? Addr(a)
43- var a byte
- var p_a byte 4 octets, lire pointeur vers
a - a 97
- p_a Addr(a) Sauvegarder ladresse
536.870.911
536.870.910
p_a pointe vers a
0
p_a 1.003
0
p_a 1.002
0
p_a 1.001
p_a 1.000
4
...
5
a 4
97
3
2
1
0
Comment connaître ladresse de a ? ? Addr(a)
44- 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 Déréférencement
- p_a est 4, p_a est 10)
536.870.911
536.870.910
0
p_a 1.003
0
p_a 1.002
0
p_a 1.001
p_a 1.000
4
...
5
p_a a 4
10
3
2
1
Comment connaître ladresse de a ? ? Addr(a)
0
45- var a byte
- var p_a byte 4 octets, lire pointeur vers
a - a 97
- p_a Addr(a) Sauvegarder ladresse
- p_a 10 affectation par déréférencement
- a 10 affectation
46- var a byte
- var p_a byte 4 octets, lire pointeur vers
a - a 97
- p_a Addr(a) Sauvegarder ladresse
- p_a 10 affectation par déréférencement
- a 10 affectation
Cest équivalent !!
47Définitions
- Déclaration dun pointeur vers un byte
- var p_a byte
- Déréférencement dun pointeur
- p_a
- Connaître ladresse dune variable a
- Addr(a) ou bien
- _at_a
48- var p_a byte 4 octets, lire pointeur vers
a - begin
- p_a 10 affectation par déréférencement
- end.
- ERREUR !!
49- var p_a byte 4 octets, lire pointeur vers
a - p_a 10 affectation par déréférencement
- ERREUR !!
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
50- 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 affectation par déréférencement
- ERREUR !!
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
51- Solution
- var p_a byte 4 octets, lire pointeur vers
a - ...
536.870.911
536.870.910
0
p_a 1.003
0
p_a 1.002
p_a 1.001
0
p_a 1.000
0
...
...
5
4
3
2
1
0
52- Solution
- var p_a byte 4 octets, lire pointeur vers
a - ...
- New(p_a)
536.870.911
536.870.910
0
p_a 1.003
0
p_a 1.002
p_a 1.001
0
p_a 1.000
0
...
...
5
4
3
2
1
0
p_a
53- Solution
- var p_a byte 4 octets, lire pointeur vers
a - ...
- New(p_a)
- p_a 10 affectation par déréférencement
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
10
p_a 0
54- Solution
- var p_a byte 4 octets, lire pointeur vers
a - ...
- New(p_a)
- p_a 10 affectation par déréférencement
- ...
- Dispose(p_a) Libérer la mémoire
536.870.911
536.870.910
0
p_a 1.003
0
p_a 1.002
p_a 1.001
0
p_a 1.000
0
...
...
5
4
3
2
1
0
55Ebauche da la mémoire plus compacte
56- var a byte
- var p_a byte 4 octets, lire pointeur vers
a - p_a Addr(a) Sauvegarder ladresse
- p_a 10 Déréférencement
536.870.911
536.870.910
p_a pointe vers a
0
p_a 1.003
0
p_a 1.002
0
p_a 1.001
p_a 1.000
4
...
5
a 4
10
3
2
1
0
Comment connaître ladresse de a ? ? Addr(a)
57- var a byte
- var p_a byte 4 octets, lire pointeur vers
a - p_a Addr(a) Sauvegarder ladresse
- p_a 10 Déréférencement
p_a
a
10
58(No Transcript)
59(No Transcript)