Вы находитесь на странице: 1из 151

Algorithmes en C

Phelma
2011
2
Cest en
commandant
quon devient
commandant
Cest en
tudiant quon
devient
tudiant
Cest en
saignant
quon devient
enseignant
Cest en
geignant
quon devient
ingnieur
Fonctionnement

Cours/TD : 5 sances de
2 heures

TD : 9 sances, 4 sujets

Prparer les TD lavance


sur papier en alo ou en C

Correction rapide en d!ut


de TD

"es ter#iner

$ projet de 4 sances
3
Plan

%nal&se dun pro!l'#e

(cursivit, co#ple)it

(cursivit si#ple * croise

+otion de co#ple)it te#porelle, spatiale


et son i#portance

T&pes a!straits

+otion de t&pe a!strait

"iste i#plantation stati,ue * d&na#i,ue

Pile

-ile, -ile circulaire

%dressae associati. : ta!les de hashae

Principe * /)e#ples

+otion * estion de collisions

%r!res

+otion d0ar!res, /)e#ples

Ter#inoloie

1prations de !ase

Parcours de !ase 2pro.ondeur, lareur,


#eilleur3

%r!res particuliers
4 %r!re 5inaire de (echerche
4 Tas

6raphes

6raphes * /)e#ples : opti#isation *


itinraire, planit, ordonnance#ent,
capacit des tu&au)

Ter#inoloie

(eprsentations
Rappel sur lanalyse
Rappel sur lanalyse

$7 identi.ier les o!jets du pro!l'#es 2varia!les3

27 identi.ier les actions ,ue l0on peut .aire avec ses o!jets 2.onctions3

87 identi.ier les tapes de rsolutions 2!oucles, alorith#e3

47 #ettre en 9uvre 2coder en C ou autre3


6
Exemple 1 : tri dun
tableau par slection
Pour trier un tableau T de n nombres par ordre croissant,
on commence par stocker les nombres dans le tableau
Ensuite, on cherche le plus grand nombre dans tout le tableau.
On change ce plus grand nombre avec le dernier nombre du tableau
(le nime
Puis on recommence en recherchant le plus grand parmi les n!"
premiers nombres du tableau, #ui ne sont pas en ordre croissant $
on cherche le plus grand et on change ce nombre et le n!" ime
du tableau.
Puis on recommence pour les n!%, n!&' (us#u)* ce #ue le tableau
soit tri
+e tableau est tri et on peut l)a,,icher
7
Exemple 1
8
Exemple 1
-include .stdio.h/
-de,ine 0 "1
main(2
int tableau3045
int de(atrie, indiceduma65

78 +ire les nombres87
+ire(tableau,05
,or (de(atrie915 de(atrie.05 de(atrie:: 2
indiceduma69chercherma6(tableau,1,0!"!de(atrie5
echanger(tableau,indiceduma6,0!"!de(atrie
;
<,,icher(tableau,05
;
9
Exemple 2 : bataille
+a bataille se (oue avec un (eu ordinaire de =% cartes, * deu6
(oueurs.
<u dpart, les cartes sont places ,aces caches en % pa#uets de
%> cartes, " pa#uet pour cha#ue (oueur.
?ha#ue (oueur prend la premire carte sur le dessus de son
pa#uet, la retourne, et la pose * c@t, sur la pile de bataille.
Ai les deu6 cartes poses par cha#ue (oueur sont identi#ues, les
deu6 (oueurs prennent une carte #u)ils mettent ,ace cache sur le
dessus de la pile de bataille, puis une seconde, #u)ils posent
,ace visible sur cette pile.
+es (oueurs recommencent tant #ue les cartes visibles sur la pile
de bataille sont gales.
+ors#ue ces % cartes ne sont plus gales, le (oueur #ui a la plus
,orte carte visible remporte les cartes des % piles de bataille.
Bl les met sous son pa#uet de cartes
10
11
Exemple 2
12
Exemple 2

Donnes et leur description utile

Carte

.ace : visi!le ou cache

valeur : %s, 2, ::, $;, ::roi

Couleur : carreau,tr'.le,,<

Pa,uet : contient plusieurs cartes, un


pa,uet par joueur

suite des cartes

=eu : 52 cartes non tries

(eprsenter une Carte


struct carte 2
char ,ace5 78 ?ache ou non 87
int val5
char couleur5 78 tre,le, carreau..87
;
tCpede, struct carte ?<DTE5

Pa,uet :

>l .aut pouvoir lisser dessous et prendre


par dessus:

Pile de !ataille :

>l .aut pouvoir #ettre et prendre par


dessus:
13
Exemple 2

1prations sur ces pa,uets

Prendre :: dessus

Para#'tres :

/ntre : pa,uet,

?aleur de retour :

carte

(@le

#odi.ie un pa,uet en suppri#ant la


carte du dessus

(envoie une carte:

6lisser::sous

Para#'tres

/ntre : carte, pa,uet,

?aleur de retour:

pa,uet

(@le,

%joute la carte sous le pa,uet

(etourne le pa,uet

1prations sur ces piles

Prendre :: dessus

Para#'tres

/ntre : pile,

?aleur de retour :

carte

(@le

/nl've la carte du dessus

renvoie cette carte:

Aettre dessus

Para#'tres

/ntre : carte, pile

?aleur de retour :

pile

(@le

ajoute la carte sur le dessus de la pile

renvoie une pile


14
Exemple 2
-include .stdio.h/
-include Ecartes.hE
main(2
?<DTE ?",?%5
P<FGET H", H%5
PB+E P", P%5
78creation,initialisation du (eu 87
Iistribuer(JH", JH%5
do 2
?"9PrendreIessus(JH"5
Detourner(J?"5
P"9KettreIessus(P",?"5
?%9PrendreIessus(JH%5
Detourner(J?%5
P%9KettreIessus(P%,?%5

Lhile (egal(?",?%991 2
?"9PrendreIessus(JH"5
P"9KettreIessus(P",?"5
?%9PrendreIessus(JH%5
P%9KettreIessus(P%,?%5
?"9PrendreIessus(JH"5
Detourner(J?"5
P"9KettreIessus(P",?"5
?%9PrendreIessus(JH%5
Detourner(J?%5
P%9KettreIessus(P%,?%5
;
i, (egal(?",?%99" 278 H" gagnant 87
Lhile (Pilenonvide(P" 2
?"9PrendreIessus(JP"5
P"9KettreIessous(P",?"5
?%9PrendreIessus(JP%5
P"9KettreIessous(P",?%5
;
; else 278 H% est le gagnant 87;
; Lhile (nonvide(H" JJ nonvide(H%5
;
Complexit
16
Complexit !1"

Co#!ien de te#ps peut prendre #on prora##e B

Ce ter#ine7t7il ,uel ,ue soit le no#!re de donnes traites B

CoDt d0un alorith#e

taille ##oire

te#ps d0e)cution

Co#ple)it : rerouper dans une #esure intuitive ces in.or#ations sur le co#porte#ent
d0un prora##e en .onction du volu#e des donnes traites:

Co#ple)it spatiale : taille ##oire

Co#ple)it te#porelle : d.inir ici les oprations coDteuses

Co#ple)it prati,ue : prora##e

Co#ple)it thori,ue : alorith#e

Co#ple)it

#o&enne

dans le pire des cas

dans le #eilleur des cas


17
Complexit !2"

/)e#ple : un tri
On cherche le ma6imum du tableau
On l)change avec le dernier lment du tableau pas encore tri
On recommence sur les lments non tris
int triselection(int8 tab, int n 2 int i,(, ima65
,or (i915 i.n!"5 i:: 2ima6915
,or ((9"5 (.n!i5 (::
i, (tab3(4/tab3ima64 ima69(5
sLap(Jtab3n!i4,Jtab3ima645
;

+o#!re de co#paraisons en .onction de n : BB

+o#!re dchanes en .onction de n : BB


18
Complexit !#"

/)e#ple :

le te#ps de)cution en .onction


du no#!re de donnes tries

tri par slection en !leu

du tri heapsort en roue


19
Complexit !$"

Aesure utilise

Co#porte#ent as&#ptoti,ue

o2n3, o2n
2
3, o2nlo2n33:::
nE$ 2 4 F $G 82

lo ; $ 2 2 4 5
n $ 2 4 F $G 82
n lo n ; 2 F 24 G4 $G;
n
2
$ 4 $G G4 25G $;24
n
8
$ F G4 5$2 4;9G 82HGF
2
n
2 4 $G 25G G558G 42949GH29G

Cons,uence :

avoir une ide de la co#ple)it prati,ue

alorith#e par.ois i#possi!le utiliser

toujours un pro!l'#e #I#e si les #achines sont de plus en plus rapides, car les
volu#es de donnes traites au#entent
Rcurrence% Rcursi&it
21
Rcursi&it !1"

Dfinition

o!jet in.or#ati,ue autor.rent

/)e#ples

-actorielle : nJ E n ) 2n7$3J

-actorielle 2n3En ) -actorielle2n7$3


int ,ac(int n 2
return(n 8 ,ac(n!"5
;

Pour,uoi nest ce pas correct B

Prora##ation rcursive

(duire le pro!l'#e initial un


pro!l'#e de taille in.rieure

Trouver la .or#ule de rcurrence i:e


le cas nral

Prciser le cas connu

Taille du pro!l'#e :

Para#'tre n dcroissant

Dco#position du cas nral

.ac2n3EnK.ac2n7$3

Cas particulier et arrIt

.ac2$3 E $
22
Rcursi&it !2"
78 recur".c 87
-include .stdio.h/
int ,ac(int n 2 int C5
print,(EEntree dans ,actorielle avec n 9 $MdNnE,n5
i,(n/" C9n8,ac(n!"5
else C9"5
print,(EOin de l)etape Md5 valeur MdNnE,n,C5
return C5
;
main( 2 int a, res5
puts(EEntrer un nombreE5 scan,(EMdE,Ja5
res 9 ,ac(a5
print,(EOactorielle de Md 9 Md NnE,a,res5
;
23
i,(%/" C9%8,ac("5
Rcursi&it !#"
main( 2 r9,ac(P5; %P
r
P
C
&
C
%
C
"
C
"
%
>
%P
%P
int ,ac(int n 2 int C5
i,(n/" C9n8,ac(n!"5
else C9"5
return C5
;
return(C
i, ("/" C9"5
return C5
"
i, (&/" C9&8,ac(%5
return C5
%
i,(P/" C9P8,ac(&5
return C5
>
24
Rcursi&it !$"

Tours de LanoM : trans.ert de + dis,ues


de tailles dcroissantes entre 2 pi,uets %
et 5 en respectant les tailles dcroissantes
et en utilisant un pi,uet inter#diaire

Co#!ien de solutions B
25
Rcursi&it !'"
void hanoi(int n, int dep, int arr, int inter 2
i, (n99" print,( Edeplace " dis#ue de Md vers MdE,dep,arr5
else 2
hanoi(n!",dep,inter,arr5
print,(Etrans,ere " dis#ue de Md vers MdNnE,dep,arr5
hanoi(n!",inter,arr,dep5
;
;
main( 2 int a5
puts(EEntrer le nombre de dis#uesNnE5 scan,(EMdE,Ja5
hanoi(a,",%,&5
;

para#'tre : +

cas trivial : trans.rer $ dis,ue

cas nral : dplacer + dis,ues de


% vers 5

dplacer +7$ dis,ues de % vers C

trans.rer$ dis,ue de % vers 5

dplacer +7$ dis,ues de C vers 5

Para#'tres N +,%,5,C
26
Rcursi&it !("

/st7il possi!le de prora##er LanoM sans rcursivit B

Ouel est le no#!re dappels rcursi.s B


$
#
2
1
1
2
1
1
#
2
1
1
2
1
1
27
Rcursi&it !)"

Ci#plicit de prora##ation

rapide crire

CoDt

##oire : pile

passae des para#'tres

cration varia!les locales

CPP

appel de .onctions

sauvearde de Q ltat prcdent R

Conclusion

Ptilisation !on escient

viter pour les pro!l'#es non rcursi.s


28
Rcursi&it croise !1"

Cous prora##e CP$ appelant CP2

Cous prora##e CP2 appelant CP$

/)e#ple : le !auenaudier

n pions placer sur les n cases


conscutives d0une ta!lette

Ce sont les codes de 6ra&

('les

Sjouer un coupS sini.ie poser ou enlever


un pion

soit sur la pre#i're case

soit sur la case suivant la pre#i're case


occupe

/)e#ple 2 : coups possi!les

poser le pion dans la case $

poser le pion dans la case 4


o
1 2 3 4 5 6 7 8
o o o
1 2 3 4 5 6 7 8
o o o
1 2 3 4 5 6 7 8
o o
o o

/)e#ple $ : coups possi!les

enlever le pion de la case $

enlever le pion de la case 2

/)e#ple 8 : coups possi!les

enlever le pion dans la case $

poser le pion dans la case 2

Co##ent .aire pour placer n points


1 2 3 4 5 6 7 8
o o
o o
o
29
Rcursi&it croise !2"

Co##ent .aire pour placer le point G B


1 2 3 4 5 6 7 8
o o
o o
o

?ider les 4 pre#iers

1n ne sait pas co##ent, #ais tant pis


1 2 3 4 5 6 7 8
o

Poser le Gie#e

1n sait co##ent,
1 2 3 4 5 6 7 8
o o

(e#ettre les 4 pre#iers

1n ne sait pas co##ent, #ais tant pis


1 2 3 4 5 6 7 8
o o
o o
o
o

Conclusion

1n a trans.or# un pro!l'#e de ran n


en 2 pro!l'#es de ran n72

1n sait .aire le cas nE; ou nE$

Donc on sait ,ue le pro!l'#e a une


solution
30
Rcursi&it croise !#"

Pour poser n pions, si n7$ pions sont


poss :

%lorith#e 2 : ?ider les n pre#iers points


CCP ?>D/( 2 ta!,n3
Ci nT$ alors
?>D/( 2ta!, n723
/+"/?/(2ta!, n3
(/AP">( 2ta!,n723
?>D/(2ta!, n7$3
Cinon si nEE$ /+"/?/(2ta!,$3

%lorith#e $ : (e#plir les n pre#iers


points
CCP (/AP">( 2 ta!,n3
Ci nT$ alors
(/AP">( 2ta!, n7$3
?>D/( 2ta!, n723
P1C/( 2ta!,n3
(/AP">( 2ta!, n723
Cinon si nEE$ P1C/(2ta!,$3

vider la ta!lette des n72 pre#iers pions

poser le n
i'#e

re#plir nouveau la ta!lette avec les n72


pre#iers pions,
31
Exos : Rcursi&it

/)o $ : Co#!inaison: Calculer C2n,p3EC2n,p7$3UC2n7$,p7$3 avec C2n,n3EC2;,p3E$

/)o 2 : inverser un ta!leau de no#!re s

/)o 8 : Palindro#e : dter#iner si une chaine de caract're est un palindro#e par la


#thode suivante : un #ot est un palindro#e si sa pre#i're lettre est identi,ue sa
derni're et si la sous chaine 2::n7$ est un palindro#e

/)o 4 : %nara##es : a..icher les anara##es dun #ot par la #thode suivante : on
prend un #ot et on per#ute sa pre#i're lettre avec chacune des autres lettres, &
co#pris elle7#e#e: /nsuite pour chacun des nouveau) #ots o!tenus, on .ait les
per#utations entre la deu)i'#e lettre et toutes les autres lettres, etc<

/)o 5 : les F reines : co##ent placer F reines sur un echi,uier sans ,uelles soient en
prises B 1n essa&e de placer une reine sur la pre#i're line li!re, sans ,uelle soit en
prise: Puis on essa&e de placer n7$ reine sur les n7$ lines suivantes:
Rcursi&it : pour en
sa&oir plus
33
Rcursi&it : le sudo*u
4

5 6 5 6 5 4

9
34
Rcursi&it : le sudo*u

si le sudoVu est plein, retourner 6%6+/

sinon

recherche de la #eilleure case a jouer : i,j

si aucune case possi!le,

alors pas de solution, retourner P/(DP

sinon

tant ,u0il & a des valeurs possi!les pour cette case

Aettre une valeur possi!le dans le sudoVu en i,j

trouver la solution du sudoVu avec une case inconnue de #oins:

Ci on a trouv une solution, retourner 6%6+/

sinon re#ettre la case i,j vide et tester une autre valeur

retourner P/(DP // Ci on arrive ici, aucune solution pour la case i,j


35
Rcursi&it : le sudo*u
int resolution(char tab343IBK%4 2 int i,(,k,l5
char choi63IBK%45

78 Fuelle est la meilleure case a (ouer Q 87
i, ( (k9meilleurRchoi6(tab,Ji,J(99IBK%:" return S<S0E5
78 Ai k91, pas de possibilites de (eu $ echec de cet essai 87
i, (k991 return BKPOAABT+E5
78 On met dans le tableau choi6 tous les coups possibles 87
listeRchoi6(tab,i,(,choi65
78 On teste toutes les possibilites de (eu (us#uUa trouver une solution
#ui marche 87
,or (l915 l.k5 l:: 2
tab3i43(49choi63l45
78 appel de la ,onction de resolution en aCant mis un chi,,re dans la
case i,(. Ai on gagne, on arrete, sinon, on essaCe une autre possibilit
87
i, (resolution(tab99S<S0E return S<S0E5
else tab3i43(49VBIE5
;
78 Bci, tous les essais pour la case i,( ont t ,aits et il a t
impossible de trouver une solution 87
return BKPOAABT+E5
;
+ype Abstrait , structures
de donnes
-iste% .iles% piles
37
/uel0ues types abstraits

Pile ile !iste


sucre
citron
menthe Rhum
client1
client2
client3
client4
Orange
Vodka
Gateaux
Bieres
Chocolat
38
1otion de type abstrait

"tructures de donnes

#nsem$le fini d%lments dont le nom$re


n%est &as 'i( ) l%avance

*&rations de $ase+

a,outer un lment ( ) l%ensem$le-

rec.erc.er si un lment ( est lment de


l%ensem$le-

su&&rimer un lment de l%ensem$le-

tester si l%ensem$le est vide

a''ic.er les di''rents lments de


l%ensem$le

/0&e a$strait de donnes

s&arer la vision a$straite qu%on a des


o$,ets de la re&rsentation mac.ine-

d'inir une smantique ind&endamment


de la re&rsentation

Pour lutilisateur

Conna1tre les &ro&rits sans savoir


comment il est im&lant

2e &as 3tre encom$r &ar les dtails

2e &as 3tre in'luenc &ar des contraintes


secondaires

4e&ousser la re&rsentation &.0sique en


mac.ine le &lus loin &ossi$le
-istes

#nsem$le 'ini mais varia$le et squentiel d%lments

chaque lment contient

Une valeur

Ladresse de llment suivant

On ne connat que la tte de liste

5ue veut dire squentiel 6

!acc7s ) un lment se 'ait ) &artir du d$ut 8tete9: en &arcourant les lments


les uns a&r7s les autres

Comment retrouver llment 8 de la liste ci dessous 6


1 8
40
2prations de base

8
1
1
1 8

*&rations de $ase+

initialisation + 89 liste

cration d%une liste vide-

;utres o&rations &ossi$les

longueur: &remier

a,outer en t3te < 8lment ( liste9 liste

tri: &lusieurs occurrences 6

a,outer + 8lment ( liste9 liste

tri: &lusieurs occurrences6

rec.erc.er+ 8lment ( liste9 lment

est=vide+ 8liste9 $oolen

su&&rimer+ 8lment ( liste9 liste


41
-istes : Exemple
1 8
78 liste".c 87
main( 2 +iste l5
l9creerliste(5
visualiser(l5
l9a(outRtete(W,l5
visualiser(l5
l9a(outRtete(X,l5
visualiser(l5
l9a(outRtete(",l5
visualiser(l5
l9supprimer(X,l5
visualiser(l5
l9a(outer(=,l5
visualiser(l5
;
8

1
1 !
42
-iste : 3mplmentation

2 >m&lmentations + comment re&rsenter une adresse

Pointeur

>ndice dans un ta$leau

d0namique &ar c.a1nage


9 ?1
0
1
2
8 1 5
3
1 5 4
1 8
suiv val

contigu@ &ar
c.a1nage e(&licite

5uelle im&lmentation c.oisir 6 Crit7res de c.oi(

CoAt de lallocation ) c.aque insertion

2om$re dlments ma(imum 'i( ) lavance


4
/a$leau de structure avec la valeur 8en vert9 et lindice de llment
suivant dans le ta$leau-
#/
!indice de de$ut de la liste
d$ut
ta$
-istes
3mplmentation
dynami0ue
44
Rappel sur les structures

Bn c.a1non ou maillon dune liste com&orte 2 &arties

ce qui doit 3tre stocC dans la liste

Bne in'ormation &our indiquer oD se trouve le suivant + &ointeur ou indice


main( 2
+iste p90G++5 78 ou Kaillon8 p5 87
78p est un pointeur, pas un maillon Y87
78 On alloue la memoire pour un maillon 87
p 9 calloc(",siZeo,(8p5
p!/val9"5 78On met " dans le chainon 87
p!/suiv90G++5 78 0G++ dans le suivant87
p!/val9W5 78 On change val87
;
1
0x2222
0x0000
0x100120
p 0x100120
4
p56&al
p56sui&
78 liste1.c 87
struct cellule 2
double val5
struct cellule 8 suiv5; 5
tCpede, struct cellule Kaillon5
tCpede, struct cellule 8 +iste5
0xb....#.c
45
-iste dynami0ue: 7.initions

Point de vue ;E"/4;>/: une liste c%est soit+

une liste vide

un lment et une liste


Fise en Guvre en liste c.aine+

Bn lment < une varia$le d%un t0&e quelconque 8dou$le: int:


structure: etc-9

Bn maillon < une structure contenant un lment et une liste

Bne liste < c%est un &ointeur vers un maillon ou vers null 8liste
vide9

46

"L"#"$% &ermet de ne &as savoir sur


quoi on travaille

/0&e ) d'inir +
typedef double ELEMENT;
struct cellule {
ELEMENT val;
struct cellule * suiv;} ;
typedef struct cellule * Liste;

Btile ) red'inir

com&araison de deu( #!#F#2/"


int compare(ELEMENT* e1, ELEMENT* e!;
"* #ompare *e1 et *e $ retourne %1 si
*e1&*e, ' si *e1((*e, )1 sinon

;''ic.age d%un #!#F#2/


void affic*e (ELEMENT* ae!;

onctions lies ) #!#F#2/


int compare(ELEMENT* ae1, ELEMENT* ae!
{ return (*ae1+*ae!; }
void affic*e (ELEMENT* ae!
{ printf(,-lf ,,*ae!; }
-istes dynami0ues !1"
47
-istes : Crer une liste
' l
' l 8

C.aque maillon de la liste contient 1 valeur et 1 &ointeur qui est ladresse du suivant et tous
les maillons ou c.a1nons sont du m3me t0&e

*n ne conna1t que le d$ut de la liste

*n acc7de au( autres lments squentiellement: en &artant du &remier: &uis en &assant au


second: &uis au troisi7me: etc--

#(em&le +

la liste vide

Bne liste avec 1 lment

Bne liste avec 2 lments

Une liste vide est re&rsente un &ointeur vide (ou $ULL) au d&art

*n d'init une varia$le l: de t0&e !iste

*n linitialise avec 2B!!: qui indique quil n0 a &as de suivant

Cest le &ointeur vide qui indique la 'in de la liste


48

Cration de liste
Liste creer.liste(void!
{ return N/LL; "* la liste vide est represent0e par N/LL *"
}

est=vide +
int est.vide(Liste L!
{ return 1L; "* la liste vide est represent0e par N/LL *"
}

#(em&le
main(!
{ Liste L;
L ( creer.liste(!;
if (est.vide(L!! printf(,la liste est vide2n,!;
else printf(,la liste n3est pas vide2n,!;
}
Cration dune liste
49
-istes : a8out en t9te!1"
l l 1

;,outer le rel 1 ) la liste l contenant d,) le rel 9

Pour a,outer 1 au d$ut de la liste contenant 9: il 'aut donc

Crer un nouveau maillon

Fettre 1 dedans

>nsrer ce nouveau maillon au $on endroit devant tous les autres: cest ) dire

>ndiquer ) ce nouveau maillon que son suivant est celui qui contient 9

>ndiquer que ce nouveau maillon est la t3te de liste

;//#2/>*2 ) !ordre des deu( derni7res ta&es


50
A8out en tete !2"
0x1000
4
0x0000
0x0000
tete
0x1000
p
0x1'00
1
0x0000 0x1'00
0x1000
p 9 calloc(",siZeo,(8p5
&
1
tete
tete9 p5
;
p!/suiv 9 tete5
0x1'00
main( 2 +iste tete,p5
'.
'. &al
sui&
p56&al
p56sui&
P!/val9"5
Fue se passe t il si vous inverseZ l)ordre de $ tete9 p5 p!/suiv 9 tete5
51
-istes : a8out en t9te!#"

;,out en t3te + algorit.me


fonction a4out.tete(e $ ELEMENT, l $ Liste! $ Liste
variable Liste p;
#r0er une cellule vide, la mettre dans p
5emplir la partie ,0l0ment, de p $ c3est e
5emplir la partie suivant de p $ c6est l
retourner p
7infonction
1
&
1
l
l
l 1
3
3
2
2
1
4
4

;,outer 1 en t3te de la liste


52
-istes : a8out en t9te!$"

;,out en t3te + liste3-c


+iste a(outRtete(E+EKE0T e, +iste +
2 +iste p9calloc(",siZeo,(8p5
i, (p990G++ return 0G++5
p!/val9e5
p!/suiv9+5
return p5
;
main( 2 +iste l5
l 9 creerRliste(5
l 9 a(outRtete(W,l5 visualiser(l5
l 9 a(outRtete(",l5 visualiser(l5
78 Fue ,ait la ligne suivante Q 87
a(outRtete(1,l5 visualiser(l5
;
1
2
3
4
53
:uppression en tete !1"

"u&&ression en t3te +
ne &as &erdre la t3te de
liste
54
-istes : suppression en
t9te !2"

"u&&ression en t3te + ;lgorit.me

li$7re la mmoire et retourne la tete


7onction supp.tete(Liste L! $ Liste
variable p $ Liste
sauver dans p la fin de liste
Lib0rer la m0moire occup0e par L
retourner la nouvelle tete p;
}

1
2
&
1
1
2
3
2
&
1seul lment
Plusieurs lments
1
L
L
*ttention + ne &as li,rer la mmoire
*-*$% de sauver le suivant
3
L
L
3
55
-istes : suppression en
t9te !#"

"u&&ression en t3te + liste5-c


+iste suppRtete(+iste +
2 i, (YestRvide(+ 2+iste p5
p9+!/suiv5
,ree(+5
return p5
;
else return 0G++5
;
main( 2 +iste l5 l9creerliste(5
l9a(outRtete(W,l5 l9a(outRtete(X,l5
l9a(outRtete(",l5 l9a(outer(=,l5
visualiser(l5
l 9 suppRtete(l5 visualiser(l5
l 9 suppRtete(l5 visualiser(l5
l 9 suppRtete(l5 visualiser(l5
;
56

Hisualiser itrati'
void visualiser(Liste L!
{ Liste p;
for (p(L; 1est.vide(p!; p(p+&suiv!
affic*e(8p+&val!;
}
9ffic*e
Parcours itrati. !1"
&
1
&
2
&
3
1 8 L
1 8

;lgorit.me + a''ic.e tous les lments de


la liste
proc0dure visualiser(Entr0e l $ Liste!
variable p $ Liste
p l
tant :ue p n3est pas le dernier
faire
affic*er(pval!
p elementsuivant(p!
fintant:ue
finproc0dure

Parcours dune liste &our visualiser tous les lments

Comme &our les ta$leau(: il 'aut un indice &our aller de maillon en maillon.

ici. l indice est ladresse de llment suivant. i/e/ un &ointeur &

0oint essentiel + &our &asser 1 llment suivant. il suffit que & &renne la valeur
suivante

& 2 &34suiv
57

Hisualiser itrati'
void visualiser(+iste +
2 +iste p5
p9+5
Lhile (YestRvide(p 2
a,,iche(Jp!/val5
p9p!/suiv5
;
;
9ffic*a;e ecran $
Parcours itrati. !1"
&
1
&
2
&
3
1 8 L
1 8



4
0x0000

1
0x0000
p
0x0000
0x1'00

0x1(00


;
l
0x1'00
0x1(00
0x1000
0x1000
0x1'00 0x1(00 0x1000 0x0000
-istes tries

-istes dont les lments sont en


ordre croissant

2rdre tabli < l=insertion

Point essentiel : attention < l=ordre


dans le0uel est .ait le cha>nage
59
A8outer !1"

;,outer le rel 8 ) la liste l contenant d,) les rels 0: 1 et 9 dans cet ordre
5 L 1
8
60
A8outer !1"

Pour a,outer 8 ) la liste contenant 0:1 et 9: il 'aut donc

Crer un nouveau maillon

Fettre 8 dedans

>nsrer ce nouveau maillon au $on endroit 8entre les maillons contenant 1 et 99 +'aire les c.ainages
corrects

>ndiquer ) ce nouveau maillon que son suivant est celui qui contient 9

>ndiquer au maillon contenant 1 que son suivant est le nouveau maillon

>ci: la tete de liste l nest &as modi'ie


&
8
5 L 1
61
-istes tries : A8out

;lgorit.me itrati'
fonction a4outer(element e, Liste L! $
Liste
variable c,p $ Liste;
<e positionner avec c 4uste avant le
point d6insertion ;
#r0er un c*ainon p
<toc=er la valeur e dans la partie
correspondante de p
5emplir l3adresse du c*ainon suivant
p (c60tait la partie suivant de c!
Modifier l3adresse du c*ainon suivant
c, car c3est > :ui suit 1 maintenant
1 ///
1
&
8
1 3
3
2
2
c
0
0
Liste a4outer(ELEMENT e, Liste L!
{ Liste p,c;
if (est.vide(L! ??
compare(8e,8L+&val!@'!
return a4out.tete(e,L!;
for(c(L; 1est.vide(c+&suiv!88
compare(8e,8c+&suiv+&val!&';
c(c+&suiv! ;
p( calloc(1,siAeof(#ell!!;
p+&val(e;
p+&suiv( c+&suiv;
c+&suiv(p;
return L;
}
62
A8out itrati.

;lgorit.me itrati'
-include Eliste.hE
main( 2 +iste l5
l9creerRliste(5 visualiser(l5
l9a(outer(W,l5 visualiser(l5
l9a(outer(X,l5 visualiser(l5
l9a(outer(",l5 visualiser(l5
l9a(outer(=,l5 visualiser(l5
l9a(outer("=,l5 visualiser(l5
;
63
-istes tries : A8out
rcursi.

;lgorit.me rcursi' +

!a 'onction a,outer a,oute llment e ) la liste ! et retourne la nouvelle liste ainsi


'orme
,onction a(outer(element e, +iste + $ +iste
Ai cUest la bonne position (e plus petit #ue la partie valeur de +
crer une nouvelle cellule c
Atocker la valeur e dans la partie correspondante de c
Demplir la partie suivant de c (cUest +
retourner la nouvelle cellule c
Ainon
il ,aut rappeler la ,onction a(outer sur la suite de la liste.
cette ,onction retourne la liste ,orme par l)a(out de e * la suite.
?ette nouvelle liste est la nouveau suivant de +
ie Kettre dans la partie suivant de + la liste retourne par
lUinsertion de e dans la suite de la liste
retourner +, puis#ue a(outer doit retourner la nouvelle liste ,orme
par l)a(out de e * +
64
-istes tries : A8out !2"

;,outer rcursi' +
+iste a(outer(E+EKE0T e, +iste +
2 i, ( estRvide(+[[ compare(Je,J+!/val.1
return a(outRtete(e,+5
else 2
78a(outer ##part apres $ la ,onction nous renvoie la
liste obtenue en a(outant e dans le reste de la liste 87
+!/suiv9a(outer(e,+!/suiv5
return +5
;
;
main( 2 +iste l5
l9creerliste(5
l 9 a(outRtete(W,l5
l 9 a(outRtete(",l5
l 9 a(outer(X,l5
;
65
Autres listes

!istes dou$lement c.a1nes

&ermettent le retour en arri7re

la valeur de l%lment

l%adresse du suivant

l%adresse du &rcdent

!istes circulaires

la 'in de liste &ointe sur le d$ut de la liste

!istes circulaires dou$lement c.a1nes


1 8
1 8
1 8
66
-istes : Exercices

aire une 'onction qui rec.erc.e si un lment 8un rel9 est &rsent dans une liste +
cette 'onction retourne le maillon de la liste contenant la valeur si elle est &rsente ou
2B!! sinon

aire une 'onction qui 'usionne deu( listes

aire une 'onction qui ins7re en t3te dans une liste dou$lement c.aine

aire une 'onction qui ins7re en queue dans une liste dou$lement c.aine

aire une 'onction qui ins7re en t3te dans une liste circulaire sim&lement c.aine

aire une 'onction qui a,oute un rel dans une liste trie et dou$lement c.aine de
rels-

aire une 'onction qui &rend une liste en &aram7tre: et cre une nouvelle liste
contenant les lments en ordre inverse- ; t on $esoin de conna1tre la nature des
lments de la liste 6
Pour en sa&oir plus

Hision rcursive des listes: &iles


et 'iles

Parcours gnriques
67
68
Parcours rcursi.

Hisualiser rcursi' + on consid7re une liste l comme +

Bn &remier lment 8&oint &ar l9

"uivi dune liste &lus courte de un lment &ointe &ar l?Isuiv

Pour visualiser toute la liste

Cas gnral +

a''ic.er le contenu du maillon

4ecommencer sur le reste de la liste

Cas &articulier

!a liste l est vide


proc0dure visualiser(Entr0e l $ Liste!
si l n3est pas vide faire
affic*er(lval!
visualiser le reste de la liste :ui est donn0 par l+&suiv
finsi
finproc0dure
69
Parcours rcursi&i. !2"

Hisualiser rcursi'
void visualiser(Liste L!{
if(1est.vide(L!!{affic*e(L+&val!; visualiser(L+&suiv!;} }
main(! { Liste L;
L(creer.liste(!; L(a4outer(B,L!; L(a4outer(C',L!; DD ; visualiser(L!; }
30 L 5 20 10
Eisualiser.5ec
L
if(1L! {
printf(,-d,,L+&val!;
visualiser(L+&suiv!;
}
Eisualiser.5ec
L
if(1L! {
printf(,-d,,L+&val!;
visualiser(L+&suiv!;
}
Eisualiser.5ec
L
if(1L! {
printf(,-d,,L+&val!;
visualiser(L+&suiv!;
}
Eisualiser.5ec
L
if(1L! {
printf(,-d,,L+&val!;
visualiser(L+&suiv!;
}
Eisualiser.5ec
L
if(1L! {DD}}
10 20 30 5
70
Parcours et action

void action=liste8!iste !9 + ralise une action sur tous les lments


de la liste !: sans modi'ier la structure de la liste

#(em&le daction + a''ic.er: rec.erc.e

Hersion itrative
void actionRlisteRit(+iste + 2
,or(p9+5 YestRvide(p5 p9p!/suiv
action(p5
;

Hersion rcursive
void actionRlisteRrec(+iste + 2
i,(YestRvide(+ 2
action(p5
actionRlisteRrec(+!/suiv5
;
;
71
Parcours et modi.ication

!iste action=liste8!iste !9 + ralise une action sur tous les lments


de la liste !: sans modi'ier la structure de la liste

#(em&le + a,outer: su&&rimer

Hersion itrative
+iste actionRliste(+iste + 2
,or(p9+5 YestRvide(p5 p9p!/suiv action(p5
return +5 78 Ou la nouvelle tete de liste si action l)a modi,ie
;

Hersion rcursive
+iste actionRliste(+iste + 2
i,(YestRvide(+ 2 action(p5 +!/suiv 9 actionRliste(+!/suiv5 ;
return +5
;
Piles
73
Piles

;nalogie + &ile d%assiettes

"eul le sommet de la &ile est accessi$le

2 o&rations + em&iler ou d&iler

!>* + !ast >n irst *ut

Pro&rit

!e dernier arriv est le &remier servi JJ

#(em&le+

#m&iler 10

#m&iler 20

#m&iler 30

K&iler
15
25
35
74
Piles
-include Epile.h
main( 2 Pile p5
E+EKE0T e5
p9creerRpile(5
p9empiler("1,p5 visualiser(p5
p9empiler(%1,p5 visualiser(p5
p9empiler(&1,p5 visualiser(p5
e9 depiler(Jp5
print,(EIepiler$ valeur de l)element depil Ml,NnE,e5
visualiser(p5
;
15 L
25
35
75
Piles

*&rations

creer=&ile + ?I &ile

initialisation-

em&iler+ lment ( &ile ?I &ile

a,out d%un lment au sommet i-e- en t3te

sommet + &ile ?I lment

valeur de l%lment de t3te

su&&rimer + &ile ?I &ile

su&&ression de l%lment situ en t3te-

&ile=vide + &ile ?I $oolen

d&iler + &ile ?I lment ( &ile

4etourne la valeur en t3te et su&&ression de cette


valeur de la liste
76
Piles : reprsentation
cha>ne
tCpede, double E+EKE0T5
tCpede, struct cellule 2
E+EKE0T val5
struct cellule 8 suiv5; Kaillon, 8 Pile5
78 declarations 87
78 <TTE0TBO0$ plusieurs de ces ,onctions nUont pas de sens avec une pile
vide 87
Pile creerRpile(void5
int pileRvide(Pile p5
Pile empiler(E+EKE0T,Pile5
Pile supprimer(Pile5
E+EKE0T sommet(Pile5
E+EKE0T depiler(Pile85
78 <TTE0TBO0 $ depiler doit raliser % actions $ retourner l)lment
au sommet de pile et modi,ier donc le sommet de pile. ?)est pour cela
#ue , est la pile est passe par adresse.
Ie plus, il est obligatoire #ue cette pile ne soit pas vide
87
Files
78
Files

;nalogie + 'ile d%attente du 4B 8mais


&as celui de minatec JJ9

insertion des lments en queue

retrait des lments en t3te

Pro&rit

irst >n irst *ut

Premier arriv: &remier servi

/erminologie +

t3te de 'ile

queue de 'ile

/erminologie +

#n'iler 10

#n'iler 20

#n'iler 30

de'iler
15
25
35
t9te
0ueue
79
Files

*&rations

'ile=vide + ?I 'ile

Cration dune 'ile vide

en'iler + lment ( 'ile ?I 'ile

a,out en queue dans une liste

t3te + 'ile ?I lment

valeur de la t3te de la liste

su&&rimer + 'ile ?I 'ile

su&&rime Len t3teL de la liste-

est=vide + 'ile ?I $oolen

d'iler + 'ile ?I lment ( 'ile

retourne l%lment en t3te &uis su&&ression de l%lment-


80
Files : reprsentation
cha>ne

dou$let t3te?queue de &ointeurs vers une


cellule-

adresse de la t3te de la 'ile

adresse de la queue de la 'ile-

ile vide < dou$let 2B!!?2B!!

!iste classique &our le reste


tCpede, int E+EKE0T5
tCpede, struct cellule 2
E+EKE0T val5
struct cellule 8 suiv5 ; ?ellule5
tCpede, struct 2
?ellule 8t, 8#5 ; Oile5
30

F
5 20 10

30

F
5 20

10

90

ajouter 90
supprimer
30

F
5 20

90

10

fle vide
F
81

ile vide + 'ile sans aucun lment

ile avec 1 lment

ile avec 2 lments


Files : reprsentation
cha>ne astucieuse
tCpede, int E+EKE0T5
tCpede, struct cellule 2
E+EKE0T val5
struct cellule 8 suiv5 ; ?ellule5
tCpede, ?ellule 8 Oile5
Oile ma,ile5
8

mafi le
mafi le
8
mafi le

ile + d'inie &ar un seul &ointeur sur la 5B#B# avec une !iste C>4CB!;>4#

; la 'in de la liste: on a,oute un lien qui ram7ne au d$ut de la liste

!a tete est d'inie &ar lelement qui suit la queue + tete < liste?Isuiv

!a queue est d'inie &ar la liste+ queue< liste


82
Files : reprsentation
cha>ne astucieuse
Oile en,iler(E+EKE0T e, Oile ,2
Oile c 9 calloc(",siZeo,(8c5
c!/val 9 e5
i, (estRvide(, c!/suiv 9 c5
else 2
c!/suiv 9 ,!/suiv5 ,!/suiv9c5
;
return c5
;
main( 2 Oile l5
l9 creerR,ile(5
78 En,iler X sur une ,ile vide 87
l9en,iler(X,l5
l9en,iler(W,l5
l9en,iler(",l5
;
l
8 1
c
l
8
c
Reprsentation contigue
des .iles et des piles
84
Piles : reprsentation
contigu?

Pile re&rsente &ar

un ta$leau

un indice re&rsentant le sommet

!es deu( lments sont inclus dans


une structure

*ttention 1 la ca&acit du ta,leau

0ile initiale

Kclaration
Fdefine LGNH.IJLE B
typedef double ELEMENT;
typedef struct { int nbre; ELEMENT
tabKLGNH.IJLEL;}* Iile;
10 20 #0 5;
$
5 1 2 3 4 ! ' 6
10 20 #0
#
5 1 2 3 4 ! ' 6
10 20
2
5 1 2 3 4 ! ' 6
E
m
p
i
l
e
r

5
;
d
e
p
i
l
e
r
85
Files : reprsentation
contigu?

structure+

un ta$leau re&rsente les valeurs

un entier re&rsente la &osition de la


t3te de la ile

un entier re&rsente la &osition de la


queue de la ile

le ta$leau est e(&loit de 'aMon


circulaire
-de,ine +O0SROB+E "1
tCpede, int E+EKE0T5
tCpede, struct 2
int tete5
int #ueue5
E+EKE0T tab3+O0SROB+E45;8 Oile5
5
8
4
10 20 30 40
0 1 2 3 4 5 6 7 8 9
la queue indique la position du prochain ajout
4
4
0 1 2 3 4 5 6 7 8 9
File vide
3
4
10 20 30 40
0 1 2 3 4 5 6 7 8 9
50 60 70 80 90
File pleine
86
Files : reprsentation
contigu?
78 les dpassement de capacit ne sont pas traits 87
Oile creerR,ile(void2 Oile ,9calloc(",sioZeo,(8,5
,!/tete9,!/#ueue915
return ,5
;
Oile en,iler(E+EKE0T e,Oile , 2
i, (Y(,ileRpleine(, 2
,!/tab3,!/#ueue49e5
,!/#ueue9(,!/#ueue:"M+O0SROB+E5
;
else 2; 78 erreur $ dpassement de capacit 87
return ,5
;
Oile supprimer(Oile p 2 p!/tete9(p!/tete:"M+O0SROB+E5 return p5 ;
87
Files : reprsentation
contigu?
E+EKE0T tete(Oile p 2 return p!/tab3p!/tete45 ;
E+EKE0T de,iler(Oile , 2 E+EKE0T e5
i, (Y,ileRvide(, 2
e9,!/tab3,!/tete45 ,9supprimer(,5
;
return e5
;
int ,ileRpleine(Oile , 2return (,!/#ueue:"M+O0SROB+E99,!/tete5;
void visualiser(Oile , 2 int i5
,or (i9,!/tete5 iY9,!/#ueue5 i9(i:"M+O0SROB+E
print,(EMl, E,,!/tab3i45
;
88
Files% Piles : exercices

#( 1 + Piles &ar listes c.aines + #crire les 'onctions em&iler: de&iler- 5uel est le cout
8com&le(it9 en 'onction du nom$re delements de la liste

#( 2 + Piles &ar listes c.aines + Comment crit on les 'onctions em&iler: de&iler en
utilisant les 'onctions a,out=tete et su&&=tete sur les listes c.aines-

#( 3 + iles &ar listes c.aines classiques + #crire les 'onctions en'iler: d'iler

#( 4 + iles &ar listes c.aines circulaires + #crire la 'onction d'iler

#( 5 + Piles &ar ta$leau + #crire les 'onctions em&iler et de&iler- 5uel est le cout
8com&le(it9 en 'onction du nom$re delements de la liste
7ictionnaires
5
7ictionnaire ou table

Un dictionnaire est une structure de donnes 7ardant en mmoire des lments


de la forme (cl. valeur)

Un dictionnaire de francais contient des mots (les cls) et leurs dfinitions


(les valeurs)

Le ,ut dun dictionnaire est dtre ca&a,le daccder ra&idement 1 une valeur. en
donnant sa cl/

"8em&le de &ro,l9mes &oss +

-rifier lortho7ra&he dun te8te. %rouver la dfinition ou la traduction dun mot

:l + un mot ; -aleur + &rsence. dfinition. traduction

<ictionnaire des mots connus dans une lan7ue dans un fichier ($ mots. $ 7rand)

-rifier un mot 2 rechercher sil est &rsent dans le dictionnaire

*nnuaire invers + trouver le nom dun individu 1 &artir de son numro de tl&hone

:l + un numro (un entier =) ; -aleur + nom et adresse

$umro 1 15 chiffres #215


15
numros/ 0eut3on faire un ta,leau de # &ositions =
1
7ictionnaire

>uelles o&rations &eut on faire sur un dictionnaire =

?nsrer un lment dans le dictionnaire

@u&&rimer un lment dans le dictionnaire

Rechercher un lment dans le dictionnaire

"t aussi + numrer les lments. fusionner 2 dictionnaires

>uelles structures de donnes &eut on utiliser =

%a,leau8 et ta,leau8 tris

Listes

%a,le de hacha7e

*r,res ,inaires

*r,res le8ico7ra&hiques
2
:olution se0uentielle

@olution squentielle

:har7er le fichier en mmoire dans un ta,leau ou une liste de $ lments (des mots en
%<)

:om&arer la cl de llment 1 celle du &remier lment du dictionnaire/

@i elles sont identiques. arrt de la vrification

@inon on &asse 1 llment suivant

$om,re de com&araisons effectues &our rechercher un lment dans

Le &ire des cas (le mot ne8iste &as dans le dictionnaire) =

"n moAenne (en su&&osant une equi3re&artition des mots dans la lan7ue) =
3
7ichotomie

0rinci&e + dans un ta,leau tri. tous les lments avant le milieu du ta,leau sont
&lus &etit que llment du milieu. ceu8 &lacs ensuite sont &lus 7rands

:har7er le fichier en mmoire dans un ta,leau de $ lments

%rier le ta,leau selon leur cl/

Le ta,leau contient des lments tris selon les cls entre les indices i125 et i22$31

:om&arer la cl de llment 1 celle de llment qui est au milieu du dictionnaire. ie en


i
m
2(i
1
Bi
2
)C2

@il est identique. arrt de la vrification

@inon deu8 cas


@oit la cl de llment recherch est &lus 7rand que celle de llment en i
m
*lors on recommence la mme chose entre les indices i
1
2i
m
B1 e t i
2
2i
2
@inon on recommence la mme chose entre les indices i
1
2i
1
et i
2
2i
m
31

Remarque + dans les e8em&les ci dessous. les lments ne contiennent que la cl


qui est un entier/ 0our un dictionnaire classique. la cl est un mot
4
7ichotomie

%a, 2 15 25 45 85 155 1!5 15 255 355.

Recherche de 1!5

?nitialement i125. i228D im24

im2(5B8)C224 + :om&araison du n, recherch 1!5 et de ta,EimF (155)

1!5 4 155 donc. on recommence avec i12imB12!. i228D

im2(!B8)C22' + :om&araison du n, recherch 1!5 et de ta,EimF (15)

1!5 G 15 donc. on recommence avec i12!. i22im312!

im2(!B!)C22! + :om&araison du n, recherch 1!5 et de ta,EimF (1!5)

1!5 22 1!5 donc. on a trouv 1!5 dans le ta,leau


355 255 15 1!5 155 85 45 25 15
!
7ichotomie

%a, 2 15 25 45 85 155 1!5 15 255 355. recherche de 35

?nitialement i125. i228D im24

:om&araison du n, recherch 35 et de ta,EimF (155)

35 G 155 donc. on recommence avec i125. i22im3123D

im vaut 1D :om&araison du n, recherch 35 et de ta,EimF (25)

35 4 25 donc. on recommence avec i12imB122. i223D

im vaut 2 + :om&araison du n, recherch 35 et de ta,EimF (45)

35 G 45 donc. on recommence avec i122. i22im3122D

$om,re de com&araisons effectues dans

Le &ire des cas (le nom,re ou le mot ne8iste &as dans le dictionnaire) =

"n moAenne (en su&&osant une equire&artition des mots dans la lan7ue) =
355 255 15 1!5 155 85 45 25 15

#ais comme lintervalle entre i1 et i2 est nul. cela veut dire quil faut sarreter
'
Recherche par
interpolation

0rinci&e+ on su&&ose quil e8iste une relation entre la valeur dun lment et
lendroit oH il est ran7 en mmoire

:har7er le fichier en mmoire dans un ta,leau de $ lments

%rier le ta,leau/

Le ta,leau contient des lments tris &ar cls entre les indices i125 et i22$31

:om&arer la cl I de llment recherch 1 celle de llment qui en


i
m
2i
1
B (I3ta,leauEi
1
F) C (ta,leauEi
2
F3ta,leauEi
1
F) J (i
2
3i
1
)

@il est identique. arrt de la vrification

@inon deu8 cas


@oit la cl de llment recherch est &lus 7rand que celle de llment en i
m
*lors on recommence la mme chose entre les indices i
1
2i
m
B1 e t i
2
2i
2
@inon on recommence la mme chose entre les indices i
1
2i
1
et i
2
2i
m
31
6
3nterpolation

%a, 2 15 25 45 85 155 1!5 15 255 355.

Recherche de 1!5

?nitialement i125. i228D im25 B (1!5315)C(2!5315)J(835) 2 4.''

:om&araison du n, recherch 1!5 et de ta,EimF avec im2!

1!5 22 155 donc. on a trouv 1!5 dans le ta,leau


2!5 255 15 1!5 155 85 45 25 15
8
3nterpolation

%a, 2 15 25 45 85 155 1!5 15 255 355. recherche de 35

?nitialement i125. i228D im25 B (35315)C(2!5315)J(835) 2 5.''

:om&araison du n, recherch 35 et de ta,EimF 2 25

35 4 25 donc. on recommence avec i12imB122. i228D

im 2 2B(35345)C(2!5345)J821.6 + :om&araison du n, recherch 35 et de ta,EimF (45)

35 G 45 et comme lintervalle i1 i2 est nul. on recommence avec i122. i22im3122 + lintervalle est nul

$om,re de com&araisons effectues dans

Le &ire des cas (le nom,re ou le mot ne8iste &as dans le dictionnaire) =

"n moAenne (en su&&osant une equire&artition des mots dans la lan7ue) =
2!5 255 15 1!5 155 85 45 25 15

#ais comme lintervalle entre i1 et i2 est nul. cela veut dire quil faut sarreter
@achage
155
+able de hachage

@olution + lKadressa7e calcul ou hacha7e

acc9s 1 lKlment 1 lKaide dune cl + dans le cas du dictionnaire. la cl est le mot dont on
recherche la dfinition/

La cl est utilise &our calculer un indice entier. qui donne la &osition du mot dans le
ta,leau

:e calcul est fait &ar une fonction de hacha7e. a&&lication de lKensem,le des cls vers les
entiers

acc9s en tem&s constant. ne d&end &as du nom,re dKlments stocLs

"8em&le + :onstruire le dictionnaire dans un ta,leau de $ cases

:ls + mots i/e/ une chane de caract9res

fonction de hacha7e +hash(mot) + somme des lettres de la chane modulo $

:l + Lame D <finition + &artie cou&ante dKun couteau

hash(lame) 2 (12 B 1 B 13 B !) M $ 2 31M$ 2 31 ($2155)/

On mettra lame et sa dfinition 1 lindice 31 de notre ta,leau

:l + Nac D <finition + e8amen &ass en terminale

hash(,ac)2(2B1B3)M$ 2 '

On mettra ,ac et sa dfinition 1 lindice ' de notre ta,leau


151
+able de hachage !2"
0
1
.
6 bac examen pass en terminale

31 lame partie coupante d'un couteau

99

Utiliser le dictionnaire : recherche du mot xxxx dans le dico

alculer hash!xxxx" #ui donne l$indice n dans le tableau o% doit se trou&er le mot xxxx

'i tableau(n) contient xxxx* alors le mot !et sa dfinition" est trou&

'inon le mot n$existe pas dans le dictionnaire


152
+able de hachage !#"

0ro,l9me + les collisions

OH mettre le mot male avec notre fonction de hacha7e =


hash(lame) 2 hash(male)

Une collision survient lorsque 2 cls ont la mme valeur de hacha7e

Oestion des collisions 2 solutions +

Utiliser des listes &our stocLer les mots qui collisionnent

<Anamique avec &ointeurs et allocation + hacha7e e8terne

@tatique dans le ta,leau + hacha7e interne coalescent (&ar chana7e)

Utiliser un deu8i9me calcul +

0rendre la case qui suit si elle est li,re + hacha7e linaire

Utiliser une deu8i9me fonction de hacha7e diffrente de la &remi9re qui doit s&arer et
donner des indices diffrents + il est &eu &ro,a,le que deu8 mots aient deu8 valeurs de
hacha7e identiques &ar deu8 fonctions distinctes+ hacha7e dou,le
153
-es collisions existent
elles A

0our que &ersonne nait le mme Pour danniversaire. il A a 3'! 8 3'4 8 Q/ 8 (3'!3nB1)

Le nom,re total de &ossi,ilits est 3'!


n

<onc la &ro,a,ilit de navoir aucune &ersonne avec la mme date est *
n
3'!
C 3'!
n

et celle que nous aAons 2 &ersonnes avec la mme date est + 13 *
n
3'!
C 3'!
n

@i on fi8e la &ro,a,ilit &. le nom,re n de &ersonnes est donn &ar la&&ro8imation

*vec une distri,ution uniforme. il A a !M de chances dKavoir une collision dans


une ta,le de taille 1555 avant quKelle ne contienne 66 lments

On est &resque sur quil A aura eu une collision a&r9s lintroduction du 66i9me
lment

:est le &arado8e des anniversaires + com,ien mettre de &ersonnes dans une


&i9ce sans que 2 dentre elle ne soient nes le mme Pour =
154
Fonctions de hachage

Une ,onne fonction de hacha7e

Rvite un 7rand nom,re de collisions

rem&lissa7e uniforme de la ta,le

ra&ide 1 calculer

:onsidrons une ta,le de taille $ (de &rfrence &remier) et un nom,re


dKentres #

:ls numriques

"ntiers + hash(L) 2 L modulo $

rels + hash(L) 2 0artie enti9re de LJ$


:ls al&hanumriques ou chane de caract9res + c
5
c
1
c
2
c
3
////c
L
c

0remi9re fonction
hash(L) 2 (c
5
B aJc
1
B a
2
Jc
2
B a
3
Jc
3
//// B a
L
Jc
L
) modulo $

a est quelconque. viter les &uissances de 2 . la ta,le de hacha7e de S*-* &rend a 2 31

Tonction universelle

a2 3141!D ,226183 ( a et , &remier entre eu8)


hash(L) 2 c
5
B (aJ,)M($31)Jc
1
B (aJ,
2
)M($31)Jc
2
B (aJ,
3
)M($31)Jc
3
//// B (aJ,
L
)M($31)Jc
L
) modulo
$

&ro,a,ilit de conflits en 1C$


15!
@achage par listes

Listes chanes (1 lKe8trieur du ta,leau)

toutes les cls aAant mme hacha7e sont chanes entre elles

nom,re moAen dKacc9s en recherche + 1B$C#


///
'
///
31 lame 0artie
cou&ante dun
couteau
male >ui est de se8e
masculin
mel
a
3i9me &ersonne du
&ass de meler
$ULL
,ac "8amen &ass en
terminale
$ULL
15'
@achage coalescent

0rinci&e + le ta,leau est cou& en deu8 +

Une &artie initiale. oH on met les &remi9res cls et leurs dfinitions

Une &artie rserve. qui sert 1 chaner les collisions

:haque lment du ta,leau contient la cl. linformation utile. et lindice du suivant

:onstruction et recherche

@i la fonction de hacha7e donne un indice oH il nKA a &as dKlment. on le stocLe 1 cet


endroit

@Kil A a dP1 un lment. on cherche la &remi9re case li,re dans la Uone rserve/
31

"8em&le avec rserve &our les collisions 1 &artir


de lindice 85 dans un ta,leau de 155 lments

aPout dans lKordre

,ac + h2'

lame + h 2 31

male + h 2 31

ca, + h 2'

mela + h 2 31

8
6
Q
31
//
'
//
5
31
31
31
31
31
31
31
31
,ac 8
lame
mela
ca,
male 6

Recherche de male

Recherche de elam
156
Collisions par recalcul

0rinci&e + On calcule une nouvelle &osition &ar une nouvelle fonction de


hacha7e

Vacha7e linaire

on &rend le suivant. &uis le suivant. &uis////

La fonction est donc + f(mot) 2 hash(mot)B(i) M$


oH i est le nom,re de fois quil A a des collisions &our mot

<ou,le hacha7e +

on &rend une autre fonction de hacha7e d(c) + f(mot) 2 hash(mot)Bd(mot)J(i) M$


158
Comparaison
1
2
#
0B1 0B# 0B' 0B) 0B4
CD1
1ombre dessai moyen
-ineaire
7ouble
Coalescent
listes
15
Comparaison

Vacha7e &ar listes

sim&le

allocation de mmoire dAnamique &our la 7estion des collisions

liens occu&ant de la mmoire + lon7ueur moAenne dKune liste #C$

su&&ressions sim&les

intressant &our #44$ + &lus de cls et dKlments que dKentres dans la ta,le de
hacha7e

Vacha7e ouvert &ar listes internes

$ et # &roches. $ et # 7rand. $4#. $C# W1

recherche en moAenne+

1.8 essais si la cl est &rsente.

2.1 essais si la cl est a,sente

Vacha7e ferm

$ et # &roches. $ et # 7rand. $4#. $C# W5.!

recherche en moAenne+

1.! essais si la cl est &rsente.

2.! essais si la cl est a,sente


Complment sur les
pointeurs
-es pointeurs de .onctions
111
Pointeurs de .onctions

$om de la fonction

adresse de la fonction + on &eut donc o,tenir ladresse dune fonction

0ointeur de fonction

varia,le contenant lKadresse dKune fonction

<clarer un &ointeur de fonction


tCpeRdeRretour (8idR,onct (dclaration paramtres5

"8ecuter la fonction &ointe + 2 critures


(8idR,onct (paramtres5
idR,onct (paramtres5
112
Pointeurs de .onctions
main( 2
78 +e pointeur #ui contiendra
l)adresse des ,onctions 87
int (8,(int, int5
int i,(,k5 i9%5 (9&5
78 On C met l)adresse de la ,onction
somme 87
,9somme5
print,(EOn ,ait la sommeNnE5
78 <ppel de somme par (8, 87
k 9 (8,(i,(5 78 ou ,(i,(5 87
print,(EMd : Md 9 MdNnE,i,(,k5
78 On C met l)adresse de la ,onction
produit87
print,(EOn ,ait le produitNnE5
,9prod5
k 9 (8,(i,(5
print,(EMd 8 Md 9 MdNnE,i,(,k5
;
E6emple $ p,".c
78 ,onction #ui a,,iche et retourne la
somme de % entiers 87
int somme (int a,int b2
print,(EAomme Md MdNnE,a,b5
return(a:b5
;
78 ,onction #ui a,,iche et retourne le
produit de % entiers 87
int prod (int a,int b2
print,(EProduit Md MdNnE,a,b5
return(a8b5
;
113
Pointeurs de .onctions !2"
Tonctions : standard + %R? + qsort. hea&sort. R":V"R:V"+,search
78 Fsort est d,inie en standart dans la lib? 87
#sort(char 8 base, int nel, int Lidth, int(8comp(char8 6, char8 C5
base$ Tableau a trier nel$ 0ombre d)elements * trier
Lidth$ Taille des lements
compar $ pointeur vers la ,onction #ui compare deu6 lments de base et
retourne .1, 91, ou /1
int comparaison(,loat8 6, ,loat8 C 2return(86 ! 8C5;
-de,ine 0 %1
main ( 2,loat tab3045 int i5
,or (i915 i.05 i:: tab3i49rand(7(doublerand(5
,or (i915 i.05 i:: print,(EM, E,tab3i45 puts(EE5
#sort(tab,0,siZeo,(,loat,comparaison5
,or (i915 i.05 i:: print,(EM, E,tab3i45 puts(EE5
;
114
Exercices

"81 + "crire une fonction de hacha7e &our une cl al&hanumrique &our une ta,le de $
lments/

"82 + "crire une fonction effectuant la recherche dichotomique dune chaine de caract9re
dans un ta,leau de chaines de caract9res/

"83+ "crire un &ro7ramme utilisant la fonction ,search &our rechercher une chaine de
caract9re dans un ta,leau de chaines de caract9res/
Arbres
116
Arbres explicites :
reprsentation de donnes
117
Arbres explicites !2"
118
Arbres : terminologie

racine
bord gauche
bord droit
feuille
noeud interne
noeud interne
au sens large
chemin
pre
filsdroit fils gauche
ascendants
branche
feuilles
feuille
racine
119
Arbres : terminologie !2"

nXud

racine

feuille (2nXud terminal) + aucun fils

nXud interne + au moins un fils

chemin menant 1 un noeud

suite des noeuds menant de la


racine au noeud concern

,ranche 33 chemin de la racine 1


une feuille

&9re

les fils

le fils et ses fr9res

tiquette dKun nXud

Proprits essentielles

racine 2 aucun &9re

autres nXuds 2 un seul &9re/

chemin unique conduisant de la


racine un nud

#esures

taille + nom,re de nXuds

de7r dKun nXud + nom,re de fils

lon7ueur dKune ,ranche + nom,re


de noeud sur la ,ranche

hauteur C &rofondeur C niveau dKun


nXud + nom,re de noeud sur le
chemin

racine + 5

hauteur C &rofondeur dKun ar,re +


hauteur de la &lus 7rande ,ranche

7nration + noeuds du mme


niveau
120
Arbres : modEle abstrait

+nsemble fini de n,uds


or-aniss de fa.on hirarchi#ue /
partir d'un n,ud particulier: la
racine

soit &ide*

soit form d'un n,ud et d'une


suite d'arbres : ses fils

0prations

rer un arbre

1rbre &ide 2

13outer un element

+nle&er un element

4arcours et utilisation

4arcours en profondeur:

on &isite les descendants d'un


n,ud a&ant de &isiter ses fr5res

4arcours en lar-eur:

on &isite les fr5res d'un n,ud


a&ant de &isiter ses fils
121
AF: modEle abstrait !1"

*r,re ,inaire

soit vide

soit un tri&let G o. N1. N24 oH N1 et


N2 sont deu8 ar,res ,inaires
disPoints/

chaque nXud a. au &lus. 2 fils

*r,re ,inaire de recherche

tiquettes sont ordonnes+

Les tiquettes du sous3ar,re


7auche sont infrieures 1 lKtiquette
de la racine

les tiquettes du sous3ar,re droit


sont su&rieures 1 lKtiquette de la
racine

*N 0arfait + ar,re dont tous les niveau8 sont com&l9tement rem&lis sauf le dernier/

*N :om&let + *N 0arfait B dernier niveau rem&li

Re&rsentation &ar ta,leau facile + :haque noeud a des fils au8 indices 2i et 2iB1/
122
AF: modEle abstrait !2"

ar,reYvide + 34 ar,re

retourne un ar,re vide/

aPouter+lment 8 ar,re 34 ar,re

aPout dKune feuille ou 1 la racine/

su&&rimer+ lment 8 ar,re 34 ar,re

rechercher+ lment 8 ar,re 34


ar,re

retourne le sous3ar,re dont la


racine contient lKlment

-isualisation

&arcours+ar,re 34

visualise les tiquettes dans lKordre


123
AF: reprsentation

Re&rsentation chane +
tCpede, int eti#uette5
tCpede, struct noeud 2
eti#uette val5
struct noeud 8 gauche5
struct noeud 8 droit 5 ; 0OEGI, 8 <DTDE5
60
30
10 50 80
90
60
90
80 50
30
10
124
AF: Exemple

6
!
" 9

"8&ressions arithmtiques ,inaires

On utilise la notation &rfi8e +


o&erateur o&erande1 o&erande2

J83'

(38)J'
!
6

" 9
125
AF: Parcours sans
modi.ications de l=arbre

0arcours en &rofondeur

&rfi8 ou RO< + Racine Oauche <roite


void parcoursRDSI(0OEGI 8p
2i, (p 2action(p5
parcoursRDSI(p!/gauche5
parcoursRDSI(p!/droit5
;
;
void a,,icheRDSI(0OEGI 8p
2i, (p 2print,(E Mc E,p!/val5
a,,icheRDSI(p!/gauche5
a,,icheRDSI(p!/droit5
;
;

6
!
" 9
6
7
9 x 6
a,,icheRDSI(\!)
print,(\!)5
a,,icheRDSI(\8)5 77 <,,iche le ,ils gauche de !
print,(\8)5
a,,icheRDSI(\W)5 77 <,,iche le ,ils gauche de 8
print,(\W)5
pas de ,ils, donc ,in de a,,icheRDSI(\W)5
a,,icheRDSI(\])5 77 <,,iche le ,ils droit de 8
a,,icheRDSI(\>)5 77 <,,iche le ,ils droit de !
a,,icheRDSI(\!)
print,(\!)5
a,,icheRDSI(\8)5 77 <,,iche le ,ils gauche de !

a,,icheRDSI(\>)5 77 <,,iche le ,ils droit de !
a,,icheRDSI(\!)
print,(\!)5
a,,icheRDSI(\8)5 77 <,,iche le ,ils gauche de !
print,(\8)5
a,,icheRDSI(\W)5 77 <,,iche le ,ils gauche de 8

a,,icheRDSI(\])5 77 <,,iche le ,ils droit de 8
a,,icheRDSI(\>)5 77 <,,iche le ,ils droit de !
126
AF: Parcours sans
modi.ications de l=arbre

4arcours en profondeur

infix ou 89D : 8auche 9acine Droite


void parcoursRSDI(0OEGI 8p
2i, (p
2parcoursRSDI(p!/gauche5
action(p5
parcoursRSDI(p!/droit5
;
;
void a,,icheRDSI(0OEGI 8p2
i, (p 2
a,,icheRSDI(p!/gauche5
print,(E Mc E,p!/val5
a,,icheRSDI(p!/droit5
;
;

6
!
" 9
127
AF: Parcours sans
modi.ications de l=arbre

0arcours en &rofondeur

&ostfi8 ou O<R + Oauche <roite Racine


void parcoursRSID(0OEGI 8p
2i, (p
2parcoursRSID(p!/gauche5
parcoursRSID(p!/droit5
action(p5
;

0arcours en lar7eur

fr9res. fils des fr9res. fils des fils ///

utilise une file &our tre ralis

*l7orithme
aPouter la racine de lKar,re dans la file
tant que la file nKest &as vide faire+
dfiler
action 1 raliser()
enfiler le fils 7auche
enfiler le fils droit
fin tant que

6
!
" 9
128
AF: Parcours a&ec
modi.ication de l=arbre

*ttention. si on doit modifier lar,re. il faut. comme &our les listes crire +
ARBRE parcours_et_modification(ARBRE p) {
if (p) {
/* Je fais ce que je dois faire sur la valeur de ma racine */
p->val=action(p);
/* Si besoin, Je fais ce que je dois faire sur le fils gauche :
Je rcupre le nouvel arbre et je change le fils gauche avec
le nouvel arbre */
p->gauche=parcours_et_modification (p->gauche);
/* Idem pour le droit */
p->droit=parcours_et_modification (p->droit);
}
else {
/* Cas ou larbre est vide : Peut etre y a t il qqchose faire ici*/
}
return p;
}
Arbres binaires de
recherche
130
AFR

1:9 : 1rbre binaire de 9echerche : noeuds ordonns

Les tiquettes du sous3ar,re 7auche sont infrieures 1 lKtiquette de la


racine

les tiquettes du sous3ar,re droit sont su&rieures 1 lKtiquette de la


racine
131
AFR

1rbre &ide 2
int arbreRvide(arbre a2 return a990G++5 ;

ration d'un arbre


arbre creerRarbre(void2 return 0G++5 ;

9echercher : #uelle est la complexit 2


arbre rechercher(eti#uette val, arbre a
78 retourne le n^ud #ui contient la valeur recherche 87
78 retourne un arbre vide si l)lment est absent 87
78 en cas de sCnonCmes, retourne la position de la "ere occurrence 87
2
i, (arbreRvide(a return 0G++5 78 lUarbre est vide 87
else i, (val99a!/val return a5 78 trouv $ a contient val 87
78 sinon essaCer * gauche * droite selon le cas 87
else i, (val.a!/val return rechercher(val, a!/gauche5
else return rechercher(val, a!/droit5
;
132
AFR A8outer
60
30
10 50 80
90
60
30
10 50 80
90
70

13out de ;
60
30
10 50 80
90
5

13out de 1;
60
30
10 50 80
90
15

13out de <0
100

13out de 100
60
30
10 50 80
90
133
AFR A8outer

1l-o : a3outer un n,ud / un arbre= >uelle est la complexit 2

si lUarbre est vide alors

crer un n^ud et le retourner ce n^ud

sinon

si la valeur stocke sur la racine est plus grande #ue la valeur * insrer
alors a(outer ce n^ud dans le sous arbre gauche et retourner le nouvel arbre

sinon a(outer ce n^ud dans le sous arbre droit et retourner le nouvel arbre
<DTDE a(outer(eti#uette nouveau, <DTDE a 2
i, (YarbreRvide(a 2 78 aY9arbreRvide( 87
i, (nouveau. a!/val
a!/gauche9a(outer(nouveau,a!/gauche5
else
a!/droit9a(outer(nouveau,a!/droit5
return a5
;
else 2 <DTDE b9(arbrecalloc(",siZeo,(noeud5
b!/val9nouveau5
return b5
;
;
134
AFR supprimer

3 cas

n,ud sans fils : &ident

n,ud a&ec 1 seul fils : le n,ud est remplac par son fils

noeud a&ec ? fils : remplac par le plus petit lment du sous arbre droit ou le plus
-rand du sous arbre -auche pour respecter l'ordre

+xemple :

1rbre 'uppression de ?0 'uppression de ; 'uppression de 9


15
8 4 20
1 9
5
14
14
8 4 15
1 9
5
14
8 15
1 9
4
8 15
1 14
4
135
AFR supprimer
<DTDE supprimer(eti#uette val, <DTDE a 2 78 val * supprimer 87
i, (arbreRvide(a return a5 78 arbre vide $ pas de suppression 87
else i, (val . a!/val 2 a!/gauche9supprimer(val, a!/gauche5 return a5 ;
else i, (val / a!/val 2 a!/droit 9supprimer(val, a!/droit 5 return a5 ;
else i, (Ya!/gauche2 78 c)est le n^ud a supprimer 87
i, (Ya!/droit 2 ,ree(a5 return(0G++5; 78 <ucun ,ils 87
else 2<DTDE #9a5 a9a!/droit5 ,ree(#5 return a5; 78" ,ils droit87
else i, (Ya!/droit2<DTDE #9a5 a9a!/gauche5 ,ree(#5 return a5 ; 78" ,ils87
else 2 a!/gauche9 AupKa6(a,a!/gauche 5 return a5 ; 78% ,ils87
;
<DTDE AupKa6(<DTDE dep, <DTDE p 78 dep $ n^ud * supprimer
recherche la valeur la plus grande du A<S (9Ka6
recopie dans le n^ud 8dep ce Ka6, detruit le noeud o_ se trouve ce Ka6
retourne le nouvel A<I ainsi modi,i87
2 i, (Yp!/droit 78 Ka6 trouve 872 <DTDE # 5
dep!/val9p!/val 5 78 recopie de la valeur Ka6 87
# 9 p!/gauche 5 ,ree(p 5 return #5 78 nouvel A<S 87
;
else 2 p!/droit 9 AupKa6(dep,p!/droit 5 return p 5;
;
+A:
136
+A: ou @EAP

1:9 parfait partiellement ordonn

n,ud a&ec ? fils : arbre rempli par


ni&eau

@a racine est suprieure aux deux fils

deux fils non ordonns

4roprit essentielle

racine A plus -rand lment

0prations

a3outer : lment x arbre 6B arbre

max : arbre 6B lment

retourne la racine

supCmax: arbre 6B arbre

retourne l'arbre pri& de sa racine


20
80
40
140
160
10
90
100
30 70

+xemple
138
+A: : a8outer
20
80
40
140
160
10
90
100
30 70
20
80
40
140
160
10 150
90
100
30 70
20
80
40
140
160
10
150 90
100
30
70

13out de 1;0
13
+A: : suppression
20
80
40
140
10
90
100
30 70
20
80
40
140
10
90
100
30 70
20
80
40
10
90
100
30 70
140
20 40
10 90
100
30 70
140
80
40
10
90
100
30 70
140
80
20
20
80
40
140
160
10
90
100
30 70
2
2 2
2
2
2
145
+A: : reprsentation

numrotation des n,uds en ordre hirarchi#ue

proprit:

le p5re du noeud de numro i porte le numro !i 61"D ?

le fils -auche du noeud de numro i porte le numro i 7 ? E 1

le fils droit du noeud de numro i porte le numro i 7 ? E ?

9eprsentation en tableau
1'5
145
85
65
5
155
45
!5
15
35
5
1
3
6
2
4 ! '
8
5 1 2 3 4 ! ' 6 8
1'5 145 155 85 65 5 35 !5 45 15
141
+ri par +A:

4rendre un tas.

+tape 1 : 'upprimer le maximum en l'chan-eant a&ec le dernier lment du


tableau

+tape ? : ror-aniser le tas* en descendant la nou&elle racine !echan-e a&ec le


plus -rand des deux fils pour respecter l$ordre partiel

recommencer* a&ec un tas Fdiminu G

>uelle est la complexit 2



+tape 1 : on chan-e
10 et 160
15
145
85
65
5
155
45
!5
35
5
1
3
6
2
4 !
'
8

5 1 2 3 4 ! ' 6 8
15 145 155 85 65 5 35 !5 45 1'5
142
+ri par +A:

Hteration 1* +tape ? : on chan-e 10 et le plus -rand de ses fils si besoin


145
15
85
65
5
155
45
!5
35
5
1
3
6
2
4 ! '
8
145
85
15 65
5
155
45
!5
35
5
1
3
6
2
4 ! '
8
5 1 2 3 4 ! ' 6 8
145 85 155 !5 65 5 35 15 45 1'5
145
85
!5 65
5
155
45
15
35
5
1
3
6
2
4 ! '
8
143
+ri par +A:

Hteration ?* +tape ? : on chan-e I0 et le plus -rand de ses fils si besoin


45
85
!5
65
5
155
15
35
5
1
3
6
2
4 ! '
8
155
85
!5 65
5
45
15
35
5
1
3
6
2
4 ! '
8
5 1 2 3 4 ! ' 6 8
155 85 5 !5 65 45 35 15 145 1'5
155
85
!5 65
45
5
15
35
5
1
3
6
2
4 ! '
8
Autres arbres
145
Arbre : la structure
par.aite A

4robl5me : nombre d'oprations / raliser lors des a3outsDsuppressions des


lments

dpend de la forme de l'arbre


146
Arbre : maintenir la
per.ection A

1rbre parfait : coJt des oprations uniforme

4robl5me : maintien de l'#uilibre trop lourd en recopieDdplacement


d'lments

+xemple : tous les lments sont dplacs lors de l'a3out de 1


100
5 12 60 90 110 180 220
10 70 150 250
50 200
100
5
12
60
90
110
180
220
10 70 150 250 50 200 1
ajout de 1
147
Arbres pres0ue par.aits

Hde : autoriser un certain ds#uilibre a&ant de ror-aniser plus


profondment

ds#uilibre!noeud" A hauteur du '18!noeud" 6 hauteur du '1D!noeud"

1K@ : ds#uilibre tolr A &aleurs 61* 0 ou 1

maintien de la structure : les rotations* oprations peu coJteuses

1rbre ?636I :

le nombre d'ti#uettes de cha#ue noeud A 1 / 3

cha#ue noeud interne poss5de ainsi ?* 3 ou I fils

maintien de la structure : clatements !a3outs"* fusions !suppression"

1rbre : : branches de mLme lon-ueur

cha#ue noeud a entre de m / ?m ti#uettes.


37
16 19 24 59 75
2 7 9 13 17 18 2123 27 32 35 39 42 63 70 79 85
Autres arbres
149
Arbres n5aires

ha#ue noeud un nombre &ariable de fils

+xemple :

alleM* allons* &a* &ais* &as* &ont


A
L
L
E
Z
\0
O
N
S
\0
V
A
\0
I
S
\0
S
\0
O
N
T
\0
150
Arbres n5aires
A
L
L
E
Z
\0
O
N
S
\0
V
A
\0 I
S
\0
S
\0
O
N
T
\0

Kision fils6frere : l$arbre


lexico-raphi#ue est un arbre
binaire ordonn.

Nils -auche : un fils : une


lettre sui&ante du mot

Nils droit : un fr5re du


n,ud : une lettre de mLme
ni&eau
151
Arbres n5aires !2"

9eprsentation
tCpede, struct noeud 2 char val5
struct noeud 8,ils, 8 ,rere5 ; 0OEGI, 8 <DTDE5

Nonction d'a3out d'un mot / l'arbre : on a3oute le mot s / l$arbre


<DTDE a(outer(unsigned char 8s, <DTDE r2
i, (s990G++ return 0G++5 77 Dien a a(outer
i, (Yr [[ 8s.r!/val 2 <DTDE p5 77 <rbre vide ou s plus petit
p9(<DTDE calloc(",siZeo,(0OEGI5
p!/val98s5
p!/,rere9 r5
i, (8sY91 p!/,ils9a(outer(s:", 0G++5 77Pas en ,in de mot Q
return p5
;
else i, (8s99r!/val 2 r!/,ils9a(outer(s:",r!/,ils5 return r5;
else 2r!/,rere9a(outer(s,r!/,rere5 return r5;
;

Вам также может понравиться