• Aucun résultat trouvé

3I-IN9 - Structures de Donn´ees

N/A
N/A
Protected

Academic year: 2022

Partager "3I-IN9 - Structures de Donn´ees"

Copied!
37
0
0

Texte intégral

(1)

3I-IN9 - Structures de Donn´ees

Romain Negrel [email protected]

ESIEE Paris

(2)

2

Tableaux

3

Liste chaˆın´ ee

4

Liste doublement chain´ ee

5

Liste chain´ ee de Tableau

6

Pile

7

File

8

File de Priorit´ e

(3)

sizeof()

op´ erateur donnant la taille en octets de son op´ erande

# inlude < s t d i o . h >

# inlude < s t d l i b . h >

s t r u c t m y _ s t r u c t { int a ;

s i z e _ t b ;};

int m a i n () { int a ; s i z e _ t s ;

s t r u c t m y _ s t r u c t ms ; p r i n t f (" s i z e o f ( a )=% lu \ n ",

s i z e o f( a ));

p r i n t f (" s i z e o f ( s )=% lu \ n ", s i z e o f( s ));

p r i n t f (" s i z e o f ( ms )=% lu \ n ", s i z e o f( ms ));

p r i n t f (" s i z e o f ( int )=% lu \ n ", s i z e o f(int));

p r i n t f (" s i z e o f ( s i z e _ t )=% lu \ n ", s i z e o f( s i z e _ t ));

p r i n t f (" s i z e o f ( s t r u c t my . . . ) = % lu \ n ", s i z e o f(s t r u c t m y _ s t r u c t ));

r e t u r n E X I T _ S U C C E S S ; }

R´esultats :

sizeof(a)=4 sizeof(s)=8 sizeof(ms)=16 sizeof(int)=4 sizeof(size t)=8

sizeof(struct my struct)=16

(4)

op´ erateur donnant la taille en octets de son op´ erande

# inlude < s t d i o . h >

# inlude < s t d l i b . h >

s t r u c t m y _ s t r u c t { int a ;

s i z e _ t b ;};

int m a i n () { int a ; s i z e _ t s ;

s t r u c t m y _ s t r u c t ms ; p r i n t f (" s i z e o f ( a )=% lu \ n ",

s i z e o f( a ));

p r i n t f (" s i z e o f ( s )=% lu \ n ", s i z e o f( s ));

p r i n t f (" s i z e o f ( ms )=% lu \ n ", s i z e o f( ms ));

p r i n t f (" s i z e o f ( int )=% lu \ n ", s i z e o f(int));

p r i n t f (" s i z e o f ( s i z e _ t )=% lu \ n ", s i z e o f( s i z e _ t ));

p r i n t f (" s i z e o f ( s t r u c t my . . . ) = % lu \ n ", s i z e o f(s t r u c t m y _ s t r u c t ));

r e t u r n E X I T _ S U C C E S S ; }

R´esultats : sizeof(a)=4 sizeof(s)=8 sizeof(ms)=16 sizeof(int)=4 sizeof(size t)=8

sizeof(struct my struct)=16

(5)

sizeof

op´ erateur donnant la taille en octets de son op´ erande

# inlude < s t d i o . h >

# inlude < s t d l i b . h >

int m a i n () { int a ; int * pa ; int tab [ 7 ] ; int * p t a b ; pa = & a ; p t a b = tab

p r i n t f (" s i z e o f ( a )=% lu \ n ", s i z e o f( a ));

p r i n t f (" s i z e o f ( pa )=% lu \ n ", s i z e o f( pa ));

p r i n t f (" s i z e o f ( tab )=% lu \ n ", s i z e o f( tab ));

p r i n t f (" s i z e o f ( p t a b )=% lu \ n ", s i z e o f( p t a b ));

r e t u r n E X I T _ S U C C E S S ; }

R´esultats :

sizeof(a)=4 sizeof(pa)=8 sizeof(tab)=28 sizeof(ptab)=8

(6)

op´ erateur donnant la taille en octets de son op´ erande

# inlude < s t d i o . h >

# inlude < s t d l i b . h >

int m a i n () { int a ; int * pa ; int tab [ 7 ] ; int * p t a b ; pa = & a ; p t a b = tab

p r i n t f (" s i z e o f ( a )=% lu \ n ", s i z e o f( a ));

p r i n t f (" s i z e o f ( pa )=% lu \ n ", s i z e o f( pa ));

p r i n t f (" s i z e o f ( tab )=% lu \ n ",

p r i n t f (" s i z e o f ( p t a b )=% lu \ n ", s i z e o f( p t a b ));

r e t u r n E X I T _ S U C C E S S ; }

R´esultats : sizeof(a)=4 sizeof(pa)=8 sizeof(tab)=28 sizeof(ptab)=8

(7)

malloc et free

Allocation de m´ emoire dynamique #include<stdlib.h>

malloc

fonction d’allocation de m´ emoire dynamique (allocation dans le segment m´ emoire du TAS)

void * m a l l o c ( s i z e _ t n u m b y t e s );

free

lib´ eration de la m´ emoire allou´ ee dynamiquement

int free ( void * r e g i o n );

(8)

malloc free

Allocation de m´ emoire dynamique #include<stdlib.h>

# inlude < s t d i o . h >

# inlude < s t d l i b . h >

int m a i n (){

int * pv ;

pv = ( int *) m a l l o c ( s i z e o f ( int ) );

if ( pv == N U L L )

r e t u r n E X I T _ F A I L U R E ; ...

f r e e ( pv )

r e t u r n E X I T _ S U C C E S S ;

}

(9)

Tableaux

D´ efinition

S´ equence de n El´ ´ ements

El´ ´ ements index´ es par un entier entre 0 et n − 1

Complexit´ e

Acc` es al´ eatoire :

O(1)

Insertion :

O(n)

Cout m´ emoire :

n × sizeof(´ El´ ement)

Impl´ ementation

java : java.util.ArrayList

C++ : std::vector

(10)

D´ efinition

S´ equence de n El´ ´ ements

El´ ´ ements index´ es par un entier entre 0 et n − 1

Complexit´ e

Acc` es al´ eatoire : O(1) Insertion : O(n)

Cout m´ emoire : n × sizeof(´ El´ ement)

Impl´ ementation

java : java.util.ArrayList

C++ : std::vector

(11)

Tableaux

En C

Cr´ eation :

# inlude < s t d i o . h >

# inlude < s t d l i b . h >

int m a i n (){

s i z e _ t s i z e = 2 0 0 ; // t a i l l e du t a b l e a u

d o u b l e * tab ; // p o i n t e u r sur la p r e m i e r e c a s e du t a b l e a u tab = (d o u b l e *) m a l l o c ( s i z e o f(d o u b l e) * s i z e );

if( tab == N U L L )

r e t u r n E X I T _ F A I L U R E ; ...

f r e e ( tab )

r e t u r n E X I T _ S U C C E S S ; }

(12)

En C

Lecture/´ Ecriture :

v o i d a r r a y S e t (int i , d o u b l e v , d o u b l e * tab , s i z e _ t s i z e ){

if( i < s i z e ) tab [ i ] = v ; }

d o u b l e a r r a y G e t (int i , d o u b l e * tab , s i z e _ t s i z e ){

if( i < s i z e ) r e t u r n tab [ i ];

r e t u r n 0;

}

(13)

Tableaux

En C

Insertion :

v o i d a r r a y P u s h B a c k (d o u b l e v , d o u b l e ** tab , s i z e _ t * s i z e ){

int i ;

// A l l o c a t i o n du n o u v e a u t a b l e a u d o u b l e * t e m p T a b =

(d o u b l e *) m a l l o c (s i z e o f(d o u b l e) * (* s i z e + 1 ) ) ; // R e c o p i e du t a b l e a u

for( i =0 ; i < * s i z e ; i ++) t e m p T a b [ i ] = (* tab )[ i ];

t e m p T a b [* s i z e ] = v ; // i n s e r t i o n f r e e (* tab ); // L i b e r a t i o n de l ’ a n c i e n // m i s e a j o u r des p o i n t e u r s

(* s i z e ) + + ;

* tab = t e m p T a b ; }

(14)

En C

Suppression :

v o i d a r r a y D e l e t e E l e m (int i , d o u b l e ** tab , s i z e _ t * s i z e ){

. . . . }

(15)

Liste chaˆın´ee

D´ efinition

S´ equence de n El´ ´ ements

´ El´ ements index´ es par un entier entre 0 et n − 1

´ El´ ements en-capsul´ es dans un Nœud

Complexit´ e

Acc` es al´ eatoire :

O(n)

Insertion :

O(1)

Cout m´ emoire :

n × (sizeof(´ El´ ement) + sizeof(Noeud))

Impl´ ementation

java : java.util.LinkedList

C++ : N/A

(16)

D´ efinition

S´ equence de n El´ ´ ements

´ El´ ements index´ es par un entier entre 0 et n − 1

´ El´ ements en-capsul´ es dans un Nœud

Complexit´ e

Acc` es al´ eatoire : O(n) Insertion : O(1)

Cout m´ emoire : n × (sizeof(´ El´ ement) + sizeof(Noeud))

Impl´ ementation

java : java.util.LinkedList

(17)

Liste chaˆın´ee

En C

Cr´ eation :

t y p e d e f s t r u c t {d o u b l e d a t a ; n o d e * n e x t ;} n o d e ; int m a i n (){

n o d e * h e a d ; // p o i n t e u r sur la t e t e h e a d = N U L L ; // I n i t i a l i s a t i o n de la t e t e // I n s e r t i o n d ’ un n o e u d en t e t e

n o d e * tmp = ( n o d e *) m a l l o c ( s i z e o f( n o d e ) );

l i n k e d L i s t I n s e r t B e f o r e (& head , tmp );

// I n s e r t i o n d ’ un n o e u d en q u e u e

tmp = ( n o d e *) m a l l o c ( s i z e o f( n o d e ) );

n o d e * q u e u e = l i n k e d L i s t G e t T a i l ( h e a d );

l i n k e d L i s t I n s e r t A f t e r ( queue , tmp );

l i n k e d L i s t F r e e ( h e a d );

r e t u r n E X I T _ S U C C E S S ; }

(18)

En C

Lecture/´ Ecriture :

n o d e * l i n k e d L i s t G e t N o d e (int i , n o d e * h e a d ){

. . . . }

n o d e * l i n k e d L i s t G e t T a i l ( n o d e * h e a d ){

. . . . . }

(19)

Liste chaˆın´ee

En C

Insertion :

v o i d l i n k e d L i s t I n s e r t B e f o r e ( n o d e ** t h i s N o d e , n o d e * n e w N o d e ){

. . . . . }

v o i d l i n k e d L i s t I n s e r t A f t e r ( n o d e * t h i s N o d e , n o d e * n e w N o d e ){

. . . . . }

(20)

Liste doublement chain´ee

D´ efinition

S´ equence de n El´ ´ ements

´ El´ ements index´ es par un entier entre 0 et n − 1

´ El´ ements en-capsul´ es dans un Nœud

Complexit´ e

Acc` es al´ eatoire : Insertion :

O(1)

Cout m´ emoire :

n × (sizeof(´ El´ ement) + sizeof(Noeud))

Impl´ ementation

java : java.util.deque

(21)

Liste doublement chain´ee

D´ efinition

S´ equence de n El´ ´ ements

´ El´ ements index´ es par un entier entre 0 et n − 1

´ El´ ements en-capsul´ es dans un Nœud

Complexit´ e

Acc` es al´ eatoire : O(n) Insertion : O(1)

Cout m´ emoire : n × (sizeof(´ El´ ement) + sizeof(Noeud))

Impl´ ementation

java : java.util.deque

C++ : std:deque

(22)

En C

Cr´ eation :

t y p e d e f s t r u c t {

d o u b l e d a t a ; // p o i n t e u r sur les d o n n e e s n o d e * n e x t ; // p o i n t e u r sur le n o e u d s u i v a n t n o d e * p r e v ; // p o i n t e u r sur le n o e u d p r e c e d a n t } n o d e ;

int m a i n (){

int s i z e = 1; // t a i l l e de la l i s t e c h a i n e e n o d e * h e a d ; // p o i n t e u r sur la t e t e

n o d e * t a i l ; // p o i n t e u r sur la q u e u e // P r e m i e r e e l e m e n t

h e a d = ( n o d e *) m a l l o c ( s i z e o f( n o d e ) );

t a i l = h e a d ; head - > n e x t = N U L L ; head - > p r e v = N U L L ; . . . .

(23)

Liste chain´ee de Tableau

D´ efinition

S´ equence de n El´ ´ ements r´ epartis dans k Tableaux

´ El´ ements index´ es par un entier entre 0 et n − 1 Tableaux d’´ el´ ements en-capsul´ es dans un Nœud

Complexit´ e

Acc` es al´ eatoire :

O(k)

Insertion :

O(n/k )

Cout m´ emoire :

n × sizeof(´ El´ ement) + k × sizeof(Noeud)

Impl´ ementation

java : java.util.deque

C++ : std:deque

(24)

D´ efinition

S´ equence de n El´ ´ ements r´ epartis dans k Tableaux

´ El´ ements index´ es par un entier entre 0 et n − 1 Tableaux d’´ el´ ements en-capsul´ es dans un Nœud

Complexit´ e

Acc` es al´ eatoire : O(k) Insertion : O(n/k)

Cout m´ emoire : n × sizeof(´ El´ ement) + k × sizeof(Noeud)

Impl´ ementation

java : java.util.deque

(25)

Liste chain´ee de Tableau

En C

Cr´ eation :

t y p e d e f s t r u c t {

d o u b l e * d a t a s ; // p o i n t e u r sur un t a b l e a u de d o n n e e s n o d e * n e x t ; // p o i n t e u r sur le n o e u d s u i v a n t

} n o d e ; int m a i n (){

int s i z e = 2 0 0 ; // n o m b r e d ’ e l e m e n t s int n b B l o c k = 10; // n o m b r e de b l o q u e n o d e * h e a d ; // p o i n t e u r sur la t e t e // P r e m i e r e e l e m e n t

h e a d = ( n o d e *) m a l l o c ( s i z e o f( n o d e ) );

head - > d a t a s = (d o u b l e *) m a l l o c ( s i z e o f(d o u b l e) * s i z e / n b B l o c k );

head - > n e x t = N U L L ; . . . .

r e t u r n E X I T _ S U C C E S S ; }

(26)

Pile

D´ efinition

Collection de n El´ ´ ements

Deux op´ erations (FILO) : Ajout et Retrait

Complexit´ e

Ajout : Retrait :

O(1)

Cout m´ emoire :

n × sizeof(´ El´ ement)

Impl´ ementation

java : N/A

C++ : std:stack

(27)

Pile

D´ efinition

Collection de n El´ ´ ements

Deux op´ erations (FILO) : Ajout et Retrait

Complexit´ e

Ajout : O(1) Retrait : O(1)

Cout m´ emoire : n × sizeof(´ El´ ement)

Impl´ ementation

java : N/A

C++ : std:stack

(28)

En C

Cr´ eation :

t y p e d e f s t r u c t {

int * d a t a ; // p o i n t e u r sur un t a b l e a u de d o n n e e s int s i z e ; // t a i l l e m a x i m u m de la p i l e

int top ; // n i v e a u de la p i l e } s t a c k ;

int m a i n (){

s t a c k m y S t a c k ; // I n i t i a l i s a t i o n m y S t a c k . s i z e = 2 0 0 ; m y S t a c k . top = 0;

m y S t a c k . d a t a = (int *) m a l l o c ( s i z e o f(int) * m y S t a c k . s i z e );

. . . .

r e t u r n E X I T _ S U C C E S S ; }

(29)

Pile

En C

Ajout et Retrait :

v o i d s t a c k P u s h ( s t a c k * pStack , int val ){

if( pStack - > top < pStack - > s i z e ){

pStack - > d a t a [ pStack - > top ] = val ; pStack - > top ++;

} }

int s t a c k P o p ( s t a c k * p S t a c k ){

int d a t a = 0;

if( pStack - > top > 0 ){

pStack - > top - -

d a t a = pStack - > d a t a [ pStack - > top ] }

r e t u r n d a t a ; }

(30)

File

D´ efinition

Collection de n El´ ´ ements

Deux op´ erations (FIFO) : Ajout et Retrait

Complexit´ e

Ajout : Retrait :

O(1)

Cout m´ emoire :

n × sizeof(´ El´ ement)

Impl´ ementation

java : N/A

C++ : std:queue

(31)

File

D´ efinition

Collection de n El´ ´ ements

Deux op´ erations (FIFO) : Ajout et Retrait

Complexit´ e

Ajout : O(1) Retrait : O(1)

Cout m´ emoire : n × sizeof(´ El´ ement)

Impl´ ementation

java : N/A

C++ : std:queue

(32)

En C

Cr´ eation :

t y p e d e f s t r u c t {

int * d a t a ; // p o i n t e u r sur un t a b l e a u de d o n n e e s int s i z e ; // t a i l l e m a x i m u m de la f i l e

int i t e m C o u n t ; // c o m p t e u r d ’ e l e m e n t s int f r o n t ; // a v e n t de la f i l e int r e a r ; // a r r i e r e de la f i l e } q u e u e ;

int m a i n (){

q u e u e m y Q u e u e ; // I n i t i a l i s a t i o n m y Q u e u e . s i z e = 2 0 0 ; m y Q u e u e . r e a r = 0;

m y Q u e u e . f r o n t = 0;

m y Q u e u e . i t e m C o u n t = 0;

m y Q u e u e . d a t a = (int *) m a l l o c ( s i z e o f(int) * m y Q u e u e . s i z e );

. . . .

(33)

File

En C

Ajout et Retrait :

v o i d q u e u e P u s h ( q u e u e * pQueue , int val ){

. . . . . }

int q u e u e P o p ( q u e u e * p Q u e u e ){

. . . . . }

(34)

File de Priorit´e

D´ efinition

Collection de n El´ ´ ements ordonn´ ees Utilis´ e pour ordonner des tˆ aches ` a ex´ ecuter Deux op´ erations :

I

Ajout

I

Retrait de l’´ el´ ement le plus grand

Complexit´ e

Ajout : Retrait :

O(1)

Cout m´ emoire :

n × sizeof(´ El´ ement)

Impl´ ementation

java : java.util.PriorityQueue

(35)

File de Priorit´e

D´ efinition

Collection de n El´ ´ ements ordonn´ ees Utilis´ e pour ordonner des tˆ aches ` a ex´ ecuter Deux op´ erations :

I

Ajout

I

Retrait de l’´ el´ ement le plus grand

Complexit´ e

Ajout : O(logn) Retrait : O(1)

Cout m´ emoire : n × sizeof(´ El´ ement)

Impl´ ementation

java : java.util.PriorityQueue

C++ : std:priority queue

(36)

File de Cache

D´ efinition

Collection de n El´ ´ ements unique Utilis´ e par les syst` emes de cache Deux op´ erations :

I

Ajout en queue si nouveau

I

Acc` es al´ eatoire + d´ eplac´ e en tˆ ete

Complexit´ e

Ajout : Acc` es :

O(logn)

Cout m´ emoire :

n × sizeof(´ El´ ement)

Impl´ ementation

java : N/A

(37)

File de Cache

D´ efinition

Collection de n El´ ´ ements unique Utilis´ e par les syst` emes de cache Deux op´ erations :

I

Ajout en queue si nouveau

I

Acc` es al´ eatoire + d´ eplac´ e en tˆ ete

Complexit´ e

Ajout : O(logn) Acc` es : O(logn)

Cout m´ emoire : n × sizeof(´ El´ ement)

Impl´ ementation

java : N/A

C++ : N/A

Références

Documents relatifs

La boucle tant que est utilis ´ee lorsque le nombre d’it ´erations n’est pas connu `a l’avance: elle ex ´ecute le bloc d’instructions tant que la condition reste vraie.

Les valeurs contenues dans la pile sont retenues dans une liste li´ee. L’op´eration push place la valeur en tˆete

// renvoie un arbre de racine e ayant l et r pour fils gauche et droit Element root(BTree bt); // renvoie l’´ el´ ement ` a la racine de l’arbre BTree leftChild(BTree bt); // renvoie

En g´en´eral cependant, en ce qui concerne la programmation pure, l’initialisation d’un pointeur se fait par appel de pointeur : on indique que l’on veut une initialisation

b - Ecrire une fonction carres qui affiche une ligne de carr´ es dont les intensit´ es de couleurs rouges, bleues et vertes sont contenues dans trois tableaux d’entier de mˆ

[r]

Ecrire en Java la gestion d’un tas, repr´esent´e par un tableau : cr´eer, ins´erer, minimum, supprimer (le minimum), modifier une valeur.. Vous programmerez ceci en TP, et

Perdre ses photos de vacances : ¸ca n’a pas de