Vous êtes sur la page 1sur 43

Algorithmique Avance II

Lakhdar Sas
CRIL, Universit d Artois Bureau: C301 sais@cril.univ-artois. r !tt":##$$$.cril.univ-artois. r#%sais

Plan du cours

Rappels Tables de hachage Drcursivation Arbres binaires Arbres quilibrs B-Arbres graphes Bibliographie :

!ntroduction to Algorith"s par Tho"as # $or"en% $harles & Leiserson% and Ronald L Rivest T'pes de donnes et algorith"es par $hristine (roidevau)% *arie-$laude +audel% *ich,le Soria -tiliser l .internet/

Rappels 0 algorith"ique !
Quest-ce que lalgorithmique ?

Dfinition 1 (Algorithme). Un algorithme est suite finie doprations lmentaires constituant un schma de calcul ou de rsolution dun problme. rou!er une mthode de rsolution (exacte ou approche) du problme.

Double problmatique de lalgorithmique ?


1

2. Trouver une mthode efficace. =>Savoir rsoudre un problme est une chose, le rsoudre efficacement en est une autre, ou encore montrer qu il est correcte !!

Rappels 0 algorith"ique !
"#emple 1$

probl%me $ calculer xn
donnes $ # $ rel & n$ entier Mthode : x0 = ! xi " #$ xi-1 i %& !

+"n + " log n

Mthode ' ( x0 =

xi " xi/2 $ xi/2 , si i est pair; xi " #$xi/2 $ xi/2 si i est impair ... rsultats :

= xn

!a"uelle choisir# et pour"uoi#


$lut%t la deuxime.

"%)nal*se de la comple#it des algorithmes

Anal'se de la co"ple)it 0
&otation de !andau:
'n ne s (intresse pas en )nral * la complexit exacte, mais * son ordre de )randeur. => besoin de notations as mptoti"ues.

Anal'se de la co"ple)it 0
+)e"ples 0
2 0 n345n6% 5prendre n2 31% c316 7n 3 458n6 5prendre n2 31 c 3 7986 n7: n-1 3 45n76 5prendre n2 3 1% c 316 0 197 n7 -8n 3 5n76 trouver n2 c1% c7 t q c1 n7 197 n7 -8n c7 n7 c1 197 -89n c7 la partie droite de l .inquation peut ;tre satis<aite pour n2 3 1 et c7 3 197 la partie gauche de l .inquation peut ;tre satis<aite pour n2 3 = et c1 3 191> 3? en choisissant n2 3= % c1 3191>% c7 3 197 3? 197 n7 -8n 3 5n76

Anal'se de la co"ple)it 0
'omple#it
Dfinition ( ('omple#it). ,a comple#it dun algorithme est la mesure du nombre doprations fondamentales quil effectue sur un -eu de donnes. ,a comple#it est e#prime comme une fonction de la taille du -eu de donnes.

.ous notons /n lensemble des donnes de taille n et 0(d)


le co1t de lalgorithme sur la donne d.

'omple#it au meilleur : +min(n) = min d/n 0(d).


,(est le plus petit nombre d(oprations "u(aura * excuter l(al)orithme sur un -eu de donnes de taille .ixe, ici * n. ,(est une borne in.rieure de la complexit de l(al)orithme sur un -eu de donnes de taille n.

Anal'se de la co"ple)it 0
'omple#it au pire : +max(n) = max d/n 0(d). ,(est le
plus )rand nombre d(oprations "u(aura * excuter l(al)orithme sur un -eu de donnes de taille .ixe, ici * n.

A!antage : il s(a)it d(un maximum, et l(al)orithme .inira donc tou-ours avant d(avoir e..ectu +max(n) oprations.

)ncon!nient : cette complexit peut ne pas re.lter le comportement / usuel 0 de l(al)orithme, le pire cas pouvant ne se produire "ue trs rarement, mais il n(est pas rare "ue le cas mo en soit aussi mauvais "ue le pire cas.

Anal'se de la co"ple)it 0
'omple#it en mo*enne : +mo (n) = d/n 0(d) / |/n| ,(est la mo enne des complexits de l(al)orithme sur des -eux de donnes de taille n (en toute ri)ueur, il .aut bien videmment tenir compte de la probabilit d(apparition de chacun des -eux de donnes).
A!antage : re.lte le comportement / )nral 0 de l(al)orithme si les cas extr1mes sont rares ou si la complexit varie peu en .onction des donnes. )ncon!nient : la complexit en prati"ue sur un -eu de donnes particulier peut 1tre nettement plus importante "ue la complexit en mo enne, dans ce cas la complexit en mo enne ne donnera pas une bonne indication du comportement de l(al)orithme. +n pratique, nous ne nous intresserons "u(* la complexit au pire et * la complexit en mo enne.

Anal'se de la co"ple)it 0
+od%le de machine
$our "ue le rsultat de l(anal se d(un al)orithme soit pertinent, il .aut avoir un modle de la machine sur la"uelle l(al)orithme sera implment (sous .orme de pro)ramme). 'n prendra comme r.rence un modle de machine , acc%s alatoire (-A+) et * processeur uni"ue, o2 les instructions sont excutes l(une aprs l(autre, sans oprations simultanes.

Anal'se de la co"ple)it 0
pre"ier algorith"e de tri )llustration $ cas du tri par insertion

.roblmatique du tri
donnes $ une squence de n nombre a1, a&, . . . , an rsultats : une permutation 3a , a ', . . . , a n% des donnes t.q. a a ' , . . . , a n

exemple :

Anal'se de la co"ple)it 0 algorith"e de tri


'omple#it
attribution d (un co4t en temps ci * cha"ue instruction, et compter le nombre d(excutions de chacune des instructions. $our cha"ue valeur de - [2..n], nous notons t j le nombre

d(excutions de la boucle tant que pour cette valeur de -.


5l est * noter "ue la valeur de t j dpend des donnes6

!e temps d(excution total de l(al)orithme est alors :

Anal'se de la co"ple)it 0 algorith"e de tri


'omple#it au meilleur : le cas le plus .avorable
pour l(al)orithme T7585&9+7T5'& est "uand le tableau est d-* tri. :ans ce cas t - = ; pour tout -.

+(n) peut ici 1tre crit sous la .orme +(n) = an+b, a


et b tant des constantes indpendantes des entres, et

+(n) est donc une fonction linaire de n.

Anal'se de la co"ple)it 0 algorith"e de tri

'omple#it au pire : le cas le plus d.avorable pour l(al)orithme T7585&9+7T5'& est "uand le tableau est d-* tri dans l (ordre inverse. :ans ce cas t- =- pour tout -.

7appel :

donc

et

+(n) peut ici 1tre crit sous la .orme +(n)=a#' 2b# 2c, a, b et c tant des constantes, et +(n) est donc une .onction "uadrati"ue.

Anal'se de la co"ple)it 0 algorith"e de tri

'omple#it en mo*enne : supposons "ue l(on appli"ue l(al)orithme de tri par insertion * n nombres choisis au hasard. <uelle sera la valeur de t - # ,(est8*8dire, o2 devra8 t8on insrer => -? dans le sous8tableau =>;.. -8;?# +n mo enne t- " -3'. Si l on reporte cette valeur dans l quation on obtient galement une fonction quadratique.
meilleur cas : (n). pire cas : (n2). en mo*enne : (n2).

+n )nral, on considre "u(un al)orithme est plus e..icace "u(un autre si sa complexit dans le pire cas a un ordre de )randeur in.rieur.

Anal'se de la co"ple)it 0 algorith"e de tri


'lasses de comple#it
!es al)orithmes usuels peuvent 1tre classs en un certain nombre de )randes classes de complexit : @ !es al)orithmes sub-linaires dont la complexit est en )nral en 4(logn). @ !es al)orithmes linaires en complexit 4(n) et ceux en complexit en 4(nlogn) sont considrs comme rapides. @ !es al)orithmes polynomiaux en 4(n5) pour 5 > A sont considrs comme lents, sans parler des al)orithmes exponentiels (dont la complexit est suprieure * tout pol n%me en n) "ue l(on s(accorde * dire impraticables ds "ue la taille des donnes est suprieure * "uel"ues diBaines d(units.

!a rcursivit et le paradi)me / diviser pour r)ner 0


-cursi!it
:e l(art d(crire des pro)rammes "ui rsolvent des problmes "ue l(on ne sait pas rsoudre soi8m1me C

Dfinition / (Dfinition rcursi!e& algorithme rcursif). Une dfinition rcursive est une dfinition dans laquelle intervient ce que lon veut dfinir. Un algorithme est dit rcursif lorsquil est dfini en fonction de lui6m7me. 7evenons * la .onction puissance # #n. ,ette .onction peut 1tre d.inie rcursivement :

-cursi!it simple

!a rcursivit et le paradi)me / diviser pour r)ner 0

-cursi!it multiple Dne d.inition rcursive peut contenir plus d(un appel rcursi.. &ous voulons calculer ici les combinaisons 0np en se servant de la relation de $ascal :

-cursi!it mutuelle :es d.initions sont dites mutuellement rcursives si elles dpendent les unes des autres. Ea peut 1tre le cas pour la d.inition de la parit :

!a rcursivit et le paradi)me / diviser pour r)ner 0

-cursi!it imbrique !a .onction d(=cFermann est d.inie comme suit :

!a rcursivit et le paradi)me / diviser pour r)ner 0


.rincipe et dangers de la rcursi!it

.rincipe et intr0t $ ce sont les m1mes "ue ceux de la dmonstration par rcurrence en mathmati"ues. 'n doit avoir :
@ un certain nombre de cas dont la rsolution est connue, ces / cas simples 0 .ormeront les cas d(arr1t de la rcursion ; @ un mo en de se ramener d(un cas / compli"u 0 * un cas / plus simple 0.

!a rcursivit permet d(crire des al)orithmes concis et l)ants.

!a rcursivit et le paradi)me / diviser pour r)ner 0


Difficults $
@ la d.inition peut 1tre dnue de sens : =l)orithme =(n) ren!o*er =(n) @ il .aut 1tre s4rs "ue l(on retombera tou-ours sur un cas connu, c(est8*8dire sur un cas d(arr1t ; il nous .aut nous assurer "ue la .onction est compltement d.inie, c(est8*8 dire, "u(elle est d.inie sur tout son domaine d(applications.

!a rcursivit et le paradi)me / diviser pour r)ner 0


1on dcidabilit de la terminaison
Question : peut8on crire un pro)ramme "ui vri.ie automati"uement si un pro)ramme donn 8 termine "uand il est excut sur un -eu de donnes /#

"ntre$ Dn pro)ramme $ et un -eu de donnes :. 2ortie$ vrai si le pro)ramme 8 termine sur le -eu de donnes /, et fau# sinon. 9upposons "u(il existe un tel pro)ramme, nomm termine, de vri.ication de la terminaison. G partir de ce pro)ramme on conHoit le pro)ramme < suivant :

Dmonstration de la non dcidabilit

!a rcursivit et le paradi)me / diviser pour r)ner 0


programme Q rsultat = termine(<) tant que rsultat = vrai faire attendre une seconde fin tant que

ren!o*er rsultat

9upposons "ue le pro)ramme < I"ui ne prend pas d(ar)umentsI termine. :onc termine(<) renvoie vrai, la deuxime instruction de < boucle ind.iniment et < ne termine pas. 5l a donc contradiction et le pro)ramme < ne termine pas. :onc, termine(<) renvoie fau#, la deuxime instruction de < ne boucle pas, et le pro)ramme < termine normalement. 5l a une nouvelle .ois contradiction : par cons"uent, il n(existe pas de pro)ramme tel "ue termine.

3e probl%me de la terminaison est indcidableCC

!a rcursivit et le paradi)me / diviser pour r)ner 0


Di!iser pour rgner

.rincipe

&ombres d(al)orithmes ont une structure rcursive : pour rsoudre un problme donn, ils s(appellent eux8m1mes rcursivement une ou plusieurs .ois sur des problmes trs similaires, mais de tailles moindres, rsolvent les sous problmes de manire rcursive puis combinent les rsultats pour trouver une solution au problme initial. !e paradi)me / diviser pour r)ner 0 donne lieu * trois tapes * cha"ue niveau de rcursivit :
Di!iser $ le problme en un certain nombre de sous8problmes ; -gner $ sur les sous8problmes en les rsolvant rcursivement ou,

si la taille d(un sous8problme est asseB rduite, le rsoudre directement ;


'ombiner $ les solutions des sous8problmes en une solution

complte du problme initial.

!a rcursivit et le paradi)me / diviser pour r)ner 0


.remier e#emple $ multiplication na4!e de matrices

&ous nous intressons ici * la multiplication de matrices carrs de taille n. Algorithme na4f
JD!T5$!5+78J=T75,+9(), 9) 9oit n la taille des matrices carrs ) et 9 9oit 0 une matrice carr de taille n .our i ; , n faire .our - ; , n faire ci- K .our 5 ; , n faire ci- ci- +ai5 * b5ren!o*er 0

,et al)orithme e..ectue (nA) multiplications et autant

!a rcursivit et le paradi)me / diviser pour r)ner 0


Algorithme 5 di!iser pour rgner 6 na4f
:ans la suite nous supposerons "ue n est une puissance exacte de 2. :composons les matrices ), 9 et 0 en sous8matrices de taille n/2 Ln/2. !("uation 0 = ) $9 peut alors se rcrire :

+n dveloppant cette "uation, nous obtenons :

,hacune de ces quatre oprations correspond * deu# multiplications de matrices carrs de taille n/2 et une addition de telles matrices. G partir de ces "uations on peut aisment driver un al)orithme / diviser pour r)ner 0 dont la complexit est donne par la rcurrence :
l(addition des matrices carrs de taille n/2 tant en (n2).

!a rcursivit et le paradi)me / diviser pour r)ner 0


Anal*se des algorithmes 5 di!iser pour rgner 6

!ors"u(un al)orithme contient un appel rcursi. * lui8 m1me, son temps d(excution peut souvent 1tre dcrit par une "uation de rcurrence "ui dcrit le temps d(excution )lobal pour un problme de taille n en .onction du temps d(excution pour des entres de taille moindre.

!a rcursivit et le paradi)me / diviser pour r)ner 0

!a rcurrence d.inissant le temps d(excution d(un al)orithme / diviser pour r)ner 0 se dcompose suivant les trois tapes du paradi)me de base :
;. 9i la taille du problme est su..isamment rduite, n c pour une certaine constante c, la rsolution est directe et consomme un temps constant (1). 2. 9inon, on divise le problme en a sous8problmes chacun de taille 1/b de la taille du problme initial. !e temps d(excution total se dcompose alors en trois parties : (a) D(n) : le temps ncessaire * la division du problme en sous8 problmes. (b) aT(n/b) : le temps de rsolution des a sous8problmes. (c) C(n) : le temps ncessaire pour construire la solution .inale * partir des solutions aux sous8problmes.

!a rcursivit et le paradi)me / diviser pour r)ner 0


!a relation de rcurrence prend alors la .orme :

o2 l(on interprte n3b soit comme

, soit comme

!a rcursivit et le paradi)me / diviser pour r)ner 0

-solution des rcurrences :

$our une dmonstration de ce thorme voir 7ivest8,armen8etal 5l existe d (autres mthodes de rsolution des rcurrences : par substitution, chan)ement de variables etc.

!a rcursivit et le paradi)me / diviser pour r)ner 0


Algorithmes de tri

ri par fusion !(al)orithme de tri par .usion est construit suivant le paradi)me / diviser pour r)ner 0 :
;. 5l divise la s"uence de n nombres * trier en deux sous8s"uences de taille n/2. 2. 5l trie rcursivement les deux sous8s"uences. A. 5l .usionne les deux sous8s"uences tries pour produire la s"uence complte trie.

.rincipe

!a rcursion termine "uand la sous8s"uence * trier est de lon)ueur ; car une telle s"uence est tou-ours trie.

!a rcursivit et le paradi)me / diviser pour r)ner 0

'omple#it

$our dterminer la .ormule de rcurrence "ui nous donnera la complexit de l(al)orithme T758MD95'&, nous tudions les trois phases de cet al)orithme / diviser pour r)ner 0 :
Di!iser $ cette tape se rduit au calcul du milieu de l(intervalle >p..r? -gner $ l(al)orithme rsout rcursivement deux sous8problmes de

tailles respectives nN2


'ombiner $ la complexit de cette tape est celle de l(al)orithme de

.usion "ui est de (n) pour la construction d(un tableau solution de taille n.

!a rcursivit et le paradi)me / diviser pour r)ner 0


$ar cons"uent, la complexit du tri par .usion est
donne par la rcurrence :

$our dterminer la complexit du tri par .usion, nous


utilisons de nouveau le thorme.

5ci a=2 et b=2 donc lo)ba =;, et nous nous trouvons dans le deuxime cas du thorme par cons"uent : $our des valeurs de n su..isamment )randes, le tri par .usion avec son temps d(excution en (nlo)n) est nettement plus e..icace "ue le tri par insertion dont le temps d(excution est

Drcursivation
Drcursi!er, c(est trans.ormer un al)orithme rcursi. en un al)orithme "uivalent ne contenant pas d(appels rcursi.s.

-cursi!it terminale
Dfinition Un algorithme est dit rcursif terminal sil ne contient aucun traitement aprs un appel rcursif.

Rcursivit ter"inale
"#emple $ =!O'75TPJ+ .(D)
si 0:U; alors /:U;;.((U)) sinon +:U;

o2 :

@ U est la liste des paramtres ; @ 0:U; est une condition portant sur U ; @ /:U; est le traitement de base de l(al)orithme (dpendant de U) ; @ (U) reprsente la trans.ormation des paramtres ; @ +:U; est le traitement de terminaison (dpendant de U).

Rcursivit ter"inale
=vec ces notations, l(al)orithme $ "uivaut *
l(al)orithme suivant : =!O'75TPJ+ .(U)
tant que 0:U; faire /:U;; U (U) fintantque +:U;

!(al)orithme . est une version drcursi!e de

-cursi!it non terminale


5ci, pour pouvoir drcursiver, drcursiver il va .alloir
sauve)arder le contexte de l(appel rcursi., t pi"uement les paramtres de l(appel en)endrant l(appel rcursi..

'ri)inellement, l(al)orithme est :


=!O'75TPJ+ Q(D) si 0(U) alors /(U);Q((U));<(U) sinon +(U)

-cursi!it non terminale


Dtilisation de piles =prs drcursivation on obtiendra donc :
=!O'75TPJ+ Q(D) empiler:nouvel=appel, U; tant que pile non vide faire dpiler:tat, >; si tat " nouvel=appel alors U > si 0(U) alors /(U) empiler:fin, U; empiler:nouvel=appel, (U); sinon +(U) si tat " fin alors U > <(U)

)llustration de la drcursi!ation de lalgorithme Q


+xemple d(excution de < :
Appel Q(UK) 0(UK) vrai /(UK) Appel Q((UK)) 0((UK)) vrai /((UK)) Appel Q(((UK))) 0(((UK))) fau# +(((UK))) <((UK)) <(UK)

=ppel <((UK)

+xemple d(excution de l(al)orithme drcursiv.


empiler:nouvel=appel, U;; pile = >(nouvelQappel, UK)? dpiler:tat, >;; tat nouvelQappel ; > UK ; pile = >? U UK '(78) vrai D(78) empiler:fin, U;; pile = >(.in, UK)? empiler:nouvel=appel, (U);; pile = >(.in, UK) ; (nouvelQappel, (UK))?

+xemple d(excution de l(al)orithme drcursiv.


dpiler:tat, >;; tat nouvelQappel ; > (UK) ; pile = >(.in, UK)? U (UK) '((78)) vrai D((78)) empiler:fin, U;; pile = >(.in, UK) ; (.in, (UK))? empiler:nouvel=appel, (U);; pile = >(.in, UK) ; (.in, (UK)) ; (nouvelQappel, ((UK)))?

+xemple d(excution de l(al)orithme drcursiv.


dpiler:tat, >;; tat nouvelQappel ; > ((UK)) ; pile = >(.in, UK) ; (.in, (UK))? U ((UK)) '(((78))) faux (((78))) dpiler:tat, >;; tat .in ; > (UK) ; pile = >(.in, UK)? 9((78)) dpiler:tat, >;; tat .in ; > UK ; pile = >? 9(78)

Drcursivation
-emarques

!es pro)rammes itrati.s sont souvent plus e..icaces, mais les pro)rammes rcursi.s sont plus .aciles * crire. !es compilateurs savent, la plupart du temps, reconnaRtre les appels rcursi.s terminaux, et ceux8ci n(en)endrent pas de surco4t par rapport * la version itrative du m1me pro)ramme. 5l est tou-ours possible de drcursiver un al)orithme rcursi..

Vous aimerez peut-être aussi