Documente Academic
Documente Profesional
Documente Cultură
Recherche
dans un
arbre
binaire
Algorithmes de recherche dun lment
dans un arbre binaire
Introduction
Dans les domaines de mathmatiques et informatique, un
algorithme est une rponse un problme. Il est compos d'un ensemble
d'tapes simples ncessaires la rsolution, dont le nombre varie en
fonction du nombre d'lments traiter. D'autre part, plusieurs
algorithmes peuvent rpondre un mme problme. Pour savoir quelle
mthode est plus efficace il faut les comparer.
Ainsi, intervient la thorie de la complexit, qui est un domaine des
mathmatiques et plus prcisment de linformatique thorique, qui
tudie formellement la quantit de ressources (en temps et en espace)
ncessaire pour la rsolution de problmes, dit algorithmiques, au moyen
de l'excution d'un algorithme. Il s'agit donc d'tudier la difficult
intrinsque de problmes poss mathmatiquement.
Pour dfinir la thorie de la complexit, il faut prsenter les concepts
de problmes algorithmiques, de rponses algorithmiques aux problmes,
et la complexit des problmes algorithmiques. Cette thorie tudie
principalement (mais pas uniquement) les problmes de dcisions, qui
posent une question dont la rponse est oui ou non.
Lorsque ltude se focalise sur un algorithme en particulier plutt
que la difficult intrinsque des problmes, nous parlons de lanalyse de la
complexit de cet algorithme. Cette analyse a pour but la comparaison
entre deux algorithmes comme cit prcdemment.
La ncessit de comparaison entre deux algorithmes est parue
lorsque les scientifiques ont voulu noncer formellement et
rigoureusement ce qu'est l'efficacit d'un algorithme ou au contraire
sa complexit, ils se sont rendu compte que les outils pour le faire
l'poque taient primitifs. Dans la prhistoire de l'informatique (les annes
1950), la mesure publie, si elle existait, tait souvent dpendante
du processeur utilis, des temps d'accs la mmoire vive et de masse,
du langage de programmation et du compilateur utilis.
Une approche indpendante des facteurs matriels tait donc
ncessaire pour valuer l'efficacit des algorithmes. Donald Knuth fut un
des premiers l'appliquer systmatiquement ds les premiers volumes de
sa srie The Art of Computer Programming. Il compltait cette analyse de
considrations propres la thorie de l'information : celle-ci par exemple,
combine la formule de Stirling, montre que, dans le pire des cas, il n'est
pas possible d'effectuer, sur un ordinateur classique, un tri gnral (c'est-dire uniquement par comparaisons) de N lments en un temps
croissant avec N moins rapidement que N ln N.
Ils existent plusieurs approches pour analyser la complexit dun
algorithme. La plus classique est donc de calculer le temps de calcul dans
Structure de donnes
Dans notre tude la structure de donnes choisie a t larbre
binaire. Dans un premier lieu dfinissons quest-ce un arbre ? Puis, quest
ce qui le rend rajoute la facult de binarit. En thorie des graphes,
un arbre est un graphe non orient, acyclique et connexe. Sa forme
voque en effet la ramification des branches d'un arbre. Un ensemble
d'arbres est appel une fort.
Il existe plusieurs dfinitions quivalentes d'un arbre, en plus de
celle donne en introduction. Pour deux dfinitions bases sur la diffrence
entre le nombre d'artes et le nombre de sommets :
et
un sommet
de
. Aucun autre graphe n'est un arbre. Si nous choisissons un
sommet r quelconque dans un arbre, il est possible d'enraciner l'arbre
Algorithmes de parcours
Souvent, il est souhaitable de visiter chacun des nuds dans un
arbre et d'y examiner la valeur par exemple pour une impression ou pour
une recherche dun lment. Il existe plusieurs faons et ordres dans
lesquels les nuds peuvent tre visits, et chacun a des proprits utiles
qui sont exploites par les algorithmes bass sur les arbres binaires.
Parcours en profondeur
Avec ce parcours, nous tentons toujours de visiter le nud le plus
loign de la racine que nous pouvons, la condition qu'il soit le fils d'un
nud que nous avons dj visit. Les parcours prfixe , infixe et
postfixe sont des cas particuliers de ce type de parcours.
Pour effectuer ce parcours, il est ncessaire de conserver une liste
des lments en attente de traitement. Dans le cas du parcours en
profondeur, il faut que cette liste ait une structure de pile (de type
LIFO, Last In, First Out autrement dit : dernier entr, premier sorti ).
Dans cette implmentation, on choisira galement d'ajouter les fils d'un
nud de droite gauche.
ParcoursProfondeur(Arbre A) {
S = Pilevide
ajouter(Racine(A), S)
Tant que (S != Pilevide) {
nud = premier(S)
retirer(S)
Visiter(nud) //On choisit de faire une opration
Si (droite(nud) != null) Alors
ajouter(droite(nud), S)
Si (gauche(nud) != null) Alors
ajouter(gauche(nud), S)
}
}
Parcours en largeur
Le parcours en largeur (ou BFS, pour Breadth First Search)
correspond un parcours par niveau de nuds de l'arbre. Un niveau est
un ensemble de nuds internes ou de feuilles situes la mme
profondeur on parle aussi de nud ou de feuille de mme hauteur dans
l'arbre considr. L'ordre de parcours d'un niveau donn est
habituellement confr, de manire rcursive, par l'ordre de parcours des
nuds parents nuds du niveau immdiatement suprieur.
partir d'un sommet S, le parcours en largeur liste d'abord les
voisins de S pour ensuite les explorer un par un. Ce mode de
fonctionnement utilise donc une file dans laquelle il prend le premier
sommet et place en dernier ses voisins non encore explors. Ainsi, si
l'arbre gauche est utilis, le parcours sera A, B, C, D, E, F puis G.
L'implmentation est quasiment identique celle du parcours en
profondeur ce dtail prs qu'on doit cette fois utiliser une structure
Figure 2: Dcoupage en
de file d'atten
te (de type FIFO, First in, first
niveau d'un arbre binaire.
out autremen
t dit premier entr, premier
sorti ), ce qui induit que l'ordre de sortie n'est pas le mme (i.e. on
permute gauche et droite dans notre traitement).
qui
ParcoursLargeur(Arbre A) {
f = FileVide
enfiler(Racine(A), f)
Tant que (f != FileVide) {
nud = defiler(f)
Visiter(nud)
//On choisit de faire une opration telle un affichage ou un test
dgalit.
Si (gauche(nud) != null) Alors
enfiler(gauche(nud), f)
Implmentation en langage C
Vu que nous avons besoin de calculer le temps dexcution de
chaque algorithme, nous avons besoin den implmenter en utilisant un
langage de programmation. Dans notre tude nous allons utiliser C comme
langage de programmation. Alors dans ce qui suivra, nous allons prsenter
en premier lieu les caractristiques du langage C, puis nous allons dfinir
la structure de donnes Arbre binaire- dans ce dernier et enfin nous
allons prsenter limplmentation de chaque algorithme de recherche.
Caractristiques du langage C
C est un langage de programmation impratif et gnraliste. Il
est qualifi de langage de bas niveau dans le sens o chaque instruction
du langage est conue pour tre compile en un nombre d'instructions
machine assez prvisible en termes d'occupation mmoire et de charge de
calcul. En outre, il propose un ventail de types entiers et flottants conus
pour pouvoir correspondre directement aux types de donne supports
par le processeur. Enfin, il fait un usage intensif des calculs d'adresse
mmoire avec la notion de pointeur.
Hormis les types de base, C supporte les types numrs, composs,
et opaques. Il ne propose en revanche aucune opration qui traite
directement des objets de plus haut niveau (fichier informatique, chane
de caractres, liste). Ces types plus volus doivent tre traits en
manipulant des pointeurs et des types composs
Ces caractristiques en font un langage privilgi quand on cherche
matriser les ressources matrielles utilises, le langage machine et les
donnes binaires gnres par les compilateurs tant relativement
prvisibles. Ce langage est donc extrmement utilis dans des domaines
o la rapidit de traitement est importante. Il constitue une bonne
alternative au langage d'assemblage dans ces domaines, avec les
avantages d'une syntaxe plus expressive et de la portabilit du code
source.
En contrepartie, la mise au point de programmes en C, surtout s'ils
utilisent des structures de donnes complexes, est plus difficile qu'avec
des langages de plus haut niveau. En effet, dans un souci de performance,
le langage C impose l'utilisateur de programmer certains traitements
return 0 ;
}
Parcours postfixe
int ParcoursPostfixe(Arbre a, int x) {
if (a != NULL) {
ParcoursPostfixe(a->filsG);
ParcoursPostfixe(a->filsD);
if (a->contenu==x) return 1;
}
return 0 ;
}
Parcours prfixe
int ParcoursPrefixe(Arbre a, int x) {
if (a != NULL) {
if (a->contenu==x) return 1;
ParcoursPrefixe(a->filsG);
ParcoursPrefixe(a->filsD);
}
return 0 ;
}
Parcours en largeur
int parcours_en_largeur(Arbre a,int x) {
Queue q;
Arbre g, d;
if (a !=NULL) {
q= init_queue();
enqueue(q, a);
do {
a = arbre(sortir(q));
if(a->contenu==x) return 1 ;
g = gauche(a);
d = droit(a);
if (g !=NULL) enqueue (f, g);
if (d ! =NULL) enqueue (f, d);
} while (!queue_empty(f));
}
return 0 ;
}
char*
nomDuFichier,
char*
formatDeLecture,
char*
Algorithme
Parcours
Infixe
Nombre
donnes
entre
10
100
500
1000
2500
5000
7500
10000
Parcours
Postfixe
10
100
500
1000
2500
5000
7500
de Position
en
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Temps
dexcution en
secondes
0.02217
0.01208
0.01749
0.02468
0.01744
0.03696
0.02492
0.04902
0.06338
0.02322
0.07145
0.1308
0.04087
0.1567
0.3069
0.1316
0.319
0.6789
0.2727
0.552
1.073
0.4377
0.9759
1.609
0.5856
0.6083
0.5536
0.5404
0.5699
0.5874
0.5707
0.5957
0.6124
0.6287
0.6458
0.6608
0.7775
0.603
0.7659
1.045
0.848
1.071
1.418
10000
Parcours
Prfixe
10
100
500
1000
2500
5000
7500
10000
Parcours
Largeur
en 10
100
500
1000
2500
5000
7500
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
Au milieu
A la fin
Au dbut
1.227
1.409
1.683
1.532
1.697
0.544
0.5358
0.4026
0.5517
0.5588
0.3978
0.698
0.5925
0.4368
0.5626
0.6438
0.485
0.7421
0.6797
0.6148
0.6505
0.8595
1.027
0.7728
1.116
1.48
1.005
1.397
1.683
0.5347
0.4063
1.367
0.4137
0.443
1.418
0.4716
0.5009
1.407
0.4189
0.5154
1.44
0.4652
0.5389
1.565
0.5251
0.7489
1.83
0.6497
10000
Au milieu
A la fin
Au dbut
Au milieu
A la fin
1.01
1.467
0.817
1.293
1.562
2
1.8
1.6
1.4
1.2
Temps dexcution en secondes
p.infixe
p.postfixe
1
0.8p.prefixe
p.largeur
n*log(n)/100000
0.6
0.4
0.2
0
10
100
500
Conclusion
Rfrences
Articles de Wikipedia.org (consults le 17/02/2015) :
http://fr.wikipedia.org/wiki/Arbre_enracin%C3%A9
http://fr.wikipedia.org/wiki/Algorithme_de_parcours_en_largeur
http://fr.wikipedia.org/wiki/Algorithme_de_parcours_en_profondeur
http://fr.wikipedia.org/wiki/Arbre_binaire
http://fr.wikipedia.org/wiki/Arbre_(graphe)
http://fr.wikipedia.org/wiki/Complexit%C3%A9_en_temps
http://fr.wikipedia.org/wiki/Analyse_de_la_complexit
%C3%A9_des_algorithmes
http://fr.wikipedia.org/wiki/Complexit
%C3%A9_en_moyenne_des_algorithmes
http://fr.wikipedia.org/wiki/Th%C3%A9orie_de_la_complexit
%C3%A9_(informatique_th%C3%A9orique)
http://en.wikipedia.org/wiki/C_date_and_time_functions
http://fr.wikipedia.org/wiki/Time.h
http://en.wikipedia.org/wiki/CPU_time
http://fr.wikiversity.org/wiki/Fonctions_de_base_en_langage_C/time.h