La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Algorithmes et structures de données 9ème cours Patrick Reuter maître de conférences

Présentations similaires


Présentation au sujet: "Algorithmes et structures de données 9ème cours Patrick Reuter maître de conférences"— Transcription de la présentation:

1 Algorithmes et structures de données 9ème cours Patrick Reuter maître de conférences http://www.labri.fr/~preuter

2 La dernière fois : –Règles de complexité –Pointeurs

3 Thé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(n a) complexité polynomiale –O(n 2) complexité quadratique –O(n 3) complexité cubique O(a n) complexité exponentielle O(log n) O(n) O(n log n) O(n 2 ) O(n 3 ) O(2 n )

4 Théorie de la complexité Règles de constantes Règles des sommes Règles des produits Transitivité

5 Pointeurs

6 Dé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 } @a;

7 Organisation de la mémoire var a : byte; ( 1 octet (byte) ) #0 #1 #2 #3 #4 #5... #536.870.910 #536.870.911 #1.000...

8 Organisation de la mémoire var a : byte; #0 #1 #2 #3 a #4 #5... #536.870.910 #536.870.911 #1.000...

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

10 Organisation de la mémoire var a : byte; a := 97; #0 #1 #2 #3 a #4 #5... #536.870.910 #536.870.911 #1.000... 97 Comment connaître ladresse de a ? Addr(a)

11 Organisation de la mémoire var a : byte; a := 97; p_a := Addr(a);{ Sauvegarder ladresse } #0 #1 #2 #3 a #4 #5... #536.870.910 #536.870.911 #1.000... 97 Comment connaître ladresse de a ? Addr(a)

12 var a : byte; var p_a : ^byte; {4 octets, lire : pointeur vers a} a := 97; p_a := Addr(a);{ Sauvegarder ladresse } #0 #1 #2 #3 a #4 #5... #536.870.910 #536.870.911 p_a #1.000 0 97 Comment connaître ladresse de a ? Addr(a) p_a #1.001 p_a #1.002 p_a #1.003 4 0 0 « p_a pointe vers a »

13 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) #0 #1 #2 #3 p_a^a #4 #5... #536.870.910 #536.870.911 p_a #1.000 0 10 Comment connaître ladresse de a ? Addr(a) p_a #1.001 p_a #1.002 p_a #1.003 4 0 0

14 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 }

15 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 !!

16 Dé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 } @a;

17 var p_a : ^byte; {4 octets, lire : pointeur vers a} begin p_a^ := 10;{ affectation par déréférencement} end. ERREUR !!

18 var p_a : ^byte; {4 octets, lire : pointeur vers a} p_a^ := 10;{ affectation par déréférencement } ERREUR !! #0 #1 #2 #3 #4 #5... #536.870.910 #536.870.911 p_a #1.000 p_a #1.001 p_a #1.002 p_a #1.003

19 Solution var p_a : ^byte; {4 octets, lire : pointeur vers a}... #0 #1 #2 #3 #4 #5... #536.870.910 #536.870.911 p_a #1.000 p_a #1.001 p_a #1.002 p_a #1.003... 0 0 0 0

20 Solution var p_a : ^byte; {4 octets, lire : pointeur vers a}... New(p_a); #0 #1 #2 #3 #4 #5... #536.870.910 #536.870.911 p_a #1.000 p_a #1.001 p_a #1.002 p_a #1.003... 0 0 0 0 p_a^

21 Solution var p_a : ^byte; {4 octets, lire : pointeur vers a}... New(p_a); p_a^ := 10;{ affectation par déréférencement } #1 #2 #3 #4 #5... #536.870.910 #536.870.911 p_a #1.000 p_a #1.001 p_a #1.002 p_a #1.003... 0 0 0 0 10p_a^ #0 « p_a pointe vers p_a^ »

22 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 } #0 #1 #2 #3 #4 #5... #536.870.910 #536.870.911 p_a #1.000 p_a #1.001 p_a #1.002 p_a #1.003... 0 0 0 0

23 Aujourdhui Tableaux dynamiques Portée

24 Type : tableau statique (angl. static ARRAY) Déclaration dune variable de type tableau Défintion : var nom_du_tableau : Array[MinDim..MaxDim] of type ; Exemple : var points: array[1..10] of byte; … -structure de données la plus connu -structure homogène, chaque élément est du même type de base -La taille du tableau est fixe

25 Type : tableau statique (angl. static ARRAY) Déclaration dune variable de type tableau statique var points : array[1..10] of byte; Affectation : nom_du_tableau[index] := valeur ; Exemples : points[1] := 130; points[2] := 25; … points[10] := 90; points[11] ----- Erreur !!! points[12] ----- Erreur !!! …

26 Organisation de la mémoire var points : array[1..10] of byte; {10 octets} #0 points[1] #2000... #536.870.910 #536.870.911... points[3] #2002 points[10] #2009... points[2] #2001...

27 Organisation de la mémoire points[1]:=130; points[2]:=25; … #0 points[1] #2000... #536.870.910 #536.870.911... points[3] #2002 points[10] #2009... points[2] #2001 130 25 31 90

28 Organisation de la mémoire var points : array[1..10] of byte; {10 octets} #0... #536.870.910 #536.870.911... Occupe de la place successive dans la mémoire points[1] #2000... points[3] #2002 points[10] #2009 points[2] #2001 130 25 31 90

29 Organisation de la mémoire var points : array[1..10] of byte; {10 octets} #0... #536.870.910 #536.870.911 points[index] #(2000+index-1)... Occupe de la place successive dans la mémoire points[1] #2000... points[3] #2002 points[10] #2009 points[2] #2001 130 25 31 90

30 Organisation de la mémoire var points : array[1..10] of byte; {10 octets}... #536.870.910 #536.870.911... #0 points[index] #(2000+index-1) points[1] #2000... points[3] #2002 points[10] #2009 points[2] #2001 130 25 31 90

31 Type : tableau statique (angl. static ARRAY) -structure de données la plus connu -structure homogène, chaque élément est du même type de base -occupe de la place successive dans la mémoire -« random access » = accès aux différentes éléments se fait au coût égal

32 var points : array[1..10] of byte; {12 octets} var i : byte; i := 0; points = points[1] #2000... #536.870.910 #536.870.911 points[3] #2002 points[10] #2009... points[2] #2001 31 #0 points[index] #(2000+index-1) i #2010 0... 130 25 31 90

33 Un onzième joueur veut se connecter.. points[11] ????

34 Tableaux Que faire si on veut agrandir la taille du tableau ? Solution : Tableaux dynamiques var points : array of byte; {Tableau dynamique} SetLength(points, 10); { Allocation de [0..9]... } SetLength(points, 50); { Allocation de [0..49]... }... SetLength(points, 0); { Désallocation !!! }

35 Tableaux Que faire si on veut agrandir la taille du tableau ? Solution : Tableaux dynamiques var points : array of byte; {Tableau dynamique} SetLength(points, 10); { Allocation de [0..9]... } SetLength(points, 50); { Allocation de [0..49]... }... SetLength(points, 0); { Désallocation !!! } Commence toujours à 0 !!

36 var points : array of byte; {pointeur 4 octets} var i : byte; i := 10; points[0] := 2; { ERREUR !!!! }... #0 10 i #104 points #100 points #101 points #102 points #103 Pointeur : 4 octets

37 var points : array of byte; {pointeur 4 octets} var i : byte; SetLength(points, 10);... #0 jours[index] #(120+index) points[0] #120 points[2] #122 points[9] #129 points[1] #121 10 i #104 points #100 points #101 points #102 points #103 120 0 0 0

38 Un onzième jouer ? Un douzième joueur ? points[10] ? points [11] ? Solution : SetLength(nom_du_tableau_dynamique, taille);

39 var points : array of byte; {pointeur 4 octets} var i : byte; SetLength(points, 10); jours[index] #(120+index)... #0 points[0] #120 points[2] #122 points[9] #129 points[1] #121 10 i #104 points #100 points #101 points #102 points #103 120 0 0 0

40 var points : array of byte; {pointeur 4 octets} var i : byte; SetLength(points, 10); points[0] := 130; points[1] := 25; …... #0 jours[index] #(120+index) points[0] #120 points[2] #122 points[9] #129 points[1] #121 10 i #104 points #100 points #101 points #102 points #103 120 0 0 0 130 25

41 var points : array of byte; {pointeur 4 octets} var i : byte; SetLength(points, 10);... SetLength(points, 12);... #0 points[0] #120 points[2] #122 points[9] #129 points[1] #121 10 i #104 points #100 points #101 points #102 points #103 200 0 0 0 points[0] #200 points[2] #202 points[11] #211 points[1] #201... Réserver la mémoire 130 25

42 var points : array of byte; {pointeur 4 octets} var i : byte; SetLength(points, 10);... SetLength(points, 12);... #0 points[0] #120 points[2] #122 points[9] #129 points[1] #121 10 i #104 points #100 points #101 points #102 points #103 200 0 0 0 points[0] #200 points[2] #202 points[11] #211 points[1] #201... Copier la mémoire 130 25

43 var points : array of byte; {pointeur 4 octets} var i : byte; SetLength(points, 10);... SetLength(points, 12);... #0 points[0] #120 points[2] #122 points[9] #129 points[1] #121 10 i #104 points #100 points #101 points #102 points #103 200 0 0 0 points[0] #200 points[2] #202 points[11] #211 points[1] #201... Libérer la mémoire 130 25

44 SetLength(nom_du_tableau_dynamique, taille); Complexité : O(n) avec n = taille SetLength(points, 12); 1.Chercher un endroit dans la mémoire pour 12 octets consécutives 2.Copier toute la mémoire dans le nouvel endroit … O(n) ! 3.Libérer la place occupé avant Type : tableau dynamiques (angl. dynamic ARRAY)

45 SetLength(nom_du_tableau_dynamique, 0); 1.Libère la place pour la suite du programme Désallocation

46 var points : array of byte; {pointeur 4 octets} var i : byte; SetLength(points, 10);... SetLength(points, 12); SetLength(points, 0);... #0 10 i #104 points #100 points #101 points #102 points #103 200 0 0 0 points[0] #200 points[2] #202 points[11] #211 points[1] #201... Libérer la mémoire 130 25

47 La portée :

48 program portee; var i : byte; function somme(n : byte) : byte; var i : byte; begin result := 0; for i := 1 to n do begin result := result + i; end; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.

49 program portee; var i : byte; function somme(n : byte) : byte; var i : byte; begin result := 0; for i := 1 to n do begin result := result + i; end; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.... #0 i #100

50 program portee; var i : byte; function somme(n : byte) : byte; var i : byte; begin result := 0; for i := 1 to n do begin result := result + i; end; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.... 3 #0 i #100 n #200 i #201 5

51 program portee; var i : byte; function somme(n : byte) : byte; var i : byte; begin result := 0; for i := 1 to n do begin result := result + i; end; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.... 3 #0 i #100 n #200 i #201

52 program portee; var i : byte; function somme(n : byte) : byte; var i : byte; begin result := 0; for i := 1 to n do begin result := result + i; end; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.... 3 #0 i #100 n #200 i #201 1

53 program portee; var i : byte; { Variable globale } function somme(n : byte) : byte; var i : byte; { Variable locale } begin result := 0; for i := 1 to n do begin result := result + i; end; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.

54 program portee; var i : byte; { Variable globale } function somme(n : byte) : byte; var i : byte; { Variable locale } begin result := 0; for i := 1 to n do begin result := result + i; end; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.

55

56 Appel des fonctions Appel par valeur Appel par référence

57 var a : byte; procedure ajouter (parametre : byte) début WriteLn(parametre, parametre); parametre := parametre + 2; WriteLn(parametre, parametre); fin début a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin Appel par valeur

58 var a : byte; procedure ajouter (parametre : byte) début WriteLn(parametre, parametre); parametre := parametre + 2; WriteLn(parametre, parametre); fin début a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin Appel par valeur #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 #220 #221... #222 #223... 4

59 var a : byte; procedure ajouter (parametre : byte) début WriteLn(parametre, parametre); parametre := parametre + 2; WriteLn(parametre, parametre); fin début a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 parametre #220 #221... #222 #223... 4 4 Appel par valeur

60 #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 parametre #220 #221... #222 #223... 6 4 Appel par valeur var a : byte; procedure ajouter (parametre : byte) début WriteLn(parametre, parametre); parametre := parametre + 2; WriteLn(parametre, parametre); fin début a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin

61 #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 #220 #221... #222 #223... 4 Appel par valeur var a : byte; procedure ajouter (parametre : byte) début WriteLn(parametre, parametre); parametre := parametre + 2; WriteLn(parametre, parametre); fin début a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin

62 #0 #200 #201 #202 #536.870.910 #536.870.911 #203 #220 #221... #222 #223... Appel par valeur var a : byte; procedure ajouter (parametre : byte) début WriteLn(parametre, parametre); parametre := parametre + 2; WriteLn(parametre, parametre); fin début a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin 4

63 Appel par référence var a : byte; type t_p_a = ^byte; procedure ajouter (parametre : t_p_a); begin WriteLn('parametre^', parametre^); parametre^ := parametre^ + 2; WriteLn('parametre^', parametre^); end; début a := 4; WriteLn('a', a); ajouter(Addr(a)); WriteLn('a', a); fin

64 var a : byte; type t_p_a = ^byte; procedure ajouter (parametre : t_p_a); begin WriteLn('parametre^', parametre^); parametre^ := parametre^ + 2; WriteLn('parametre^', parametre^); end; début a := 4; WriteLn('a', a); ajouter(Addr(a)); WriteLn('a', a); fin Appel par référence Parametre est un pointeur Appel par référence

65 #0 a #200 #201 #202 #536.870.910 #536.870.911 #203... 4 Appel par référence var a : byte; type t_p_a = ^byte; procedure ajouter (parametre : t_p_a); begin WriteLn('parametre^', parametre^); parametre^ := parametre^ + 2; WriteLn('parametre^', parametre^); end; début a := 4; WriteLn('a', a); ajouter(Addr(a)); WriteLn('a', a); fin

66 var a : byte; type t_p_a = ^byte; procedure ajouter (parametre : t_p_a); begin WriteLn('parametre^', parametre^); parametre^ := parametre^ + 2; WriteLn('parametre^', parametre^); end; début a := 4; WriteLn('a', a); ajouter(Addr(a)); WriteLn('a', a); fin #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 parametre #240 parametre #241... parametre #242 parametre #243... 4 200 0 0 0 Appel par référence

67 #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 parametre #240 parametre #241... parametre #242 parametre #243... 6 200 0 0 0 Appel par référence var a : byte; type t_p_a = ^byte; procedure ajouter (parametre : t_p_a); begin WriteLn('parametre^', parametre^); parametre^ := parametre^ + 2; WriteLn('parametre^', parametre^); end; début a := 4; WriteLn('a', a); ajouter(Addr(a)); WriteLn('a', a); fin

68 #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 #240 #241... #242 #243... 6 Appel par référence var a : byte; type t_p_a = ^byte; procedure ajouter (parametre : t_p_a); begin WriteLn('parametre^', parametre^); parametre^ := parametre^ + 2; WriteLn('parametre^', parametre^); end; début a := 4; WriteLn('a', a); ajouter(Addr(a)); WriteLn('a', a); fin

69 Appel par référence (2) var a : byte; procedure ajouter (var parametre : byte) début WriteLn(parametre, parametre); parametre := parametre + 2; WriteLn(parametre, parametre); fin début a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin Une autre façon dappeler une fonction par référence qui est moins explicite

70

71

72

73


Télécharger ppt "Algorithmes et structures de données 9ème cours Patrick Reuter maître de conférences"

Présentations similaires


Annonces Google