• Aucun résultat trouvé

Algorithmique et Analyse d’Algorithmes

N/A
N/A
Protected

Academic year: 2022

Partager "Algorithmique et Analyse d’Algorithmes"

Copied!
27
0
0

Texte intégral

(1)

Algorithmique et Analyse d’Algorithmes

Algorithmique et Analyse d’Algorithmes

L3 Info

Cours 2 : algorithmes récursifs, analyse en moyenne

Benjamin Wack

2021 – 2022

(2)

Algorithmique et Analyse d’Algorithmes

La dernière fois

I Qu’est-ce qu’un algorithme I Notion de coût

I Notions de complexité (au pire) et ordres de grandeur

Aujourd’hui

I Comment écrire un algorithme récursif ? I Comment évaluer son coût ?

I Comment évaluer l’efficacité d’un algorithme plus finement que dans le pire cas ?

I Tri rapide

(3)

Algorithmique et Analyse d’Algorithmes

Plan

Algorithme récursif Schémas récursifs Analyse de coût

Analyse en moyenne Contexte Méthode

Tri rapide

(4)

Algorithmique et Analyse d’Algorithmes Algorithme récursif

Schémas récursifs

Notion d’algorithme récursif

Aux constructions habituelles on ajoute la possibilité d’appeler l’algorithmelui-mêmesur une autre donnée.

Calcul de la factorielle FACT(n)

Données :un entiern

Résultat :la valeur den! =n×(n−1)×. . .×2×1 ifn= 0

return1

returnn×FACT(n−1)

I caractéristique de l’algorithme, pas du problème

I non limité aux entiers, et particulièrement adapté aux structures récursives

I ce n’est pas de latriche!

Travail fourni = identifier la structure récursive du problème

(5)

Algorithmique et Analyse d’Algorithmes Algorithme récursif

Schémas récursifs

Structure

Prérequis

I Savoir directementrésoudrele problème sur descas de base I Savoirutiliserune (ou des) instances plus petitespour résoudre le

problème

« plus petit » = entier inférieur, sous-arbre, liste plus courte... mais pas seulement

PAIR(n)

Données :un entiern

Résultat :booléen «nest-il pair ? » ifn= 0

returnVrai else

returnPAIR(n−2)

Tout chemin d’exécution doit mener à un cas de base en temps fini.

(6)

Algorithmique et Analyse d’Algorithmes Algorithme récursif

Schémas récursifs

Écriture d’un algorithme récursif

Un problème qui casse pas des briques

On cherche à construire un mur de longueurnavec des briques de longueur 2 ou 3.

2+2+3+2+3+2 3+2+2+2+2+3 3+3+3+2+3 Exemples pourn= 14

Combien y a-t-il de possibilités distinctes ?

(7)

Algorithmique et Analyse d’Algorithmes Algorithme récursif

Schémas récursifs

Analyse du problème

I Données :

la longueur ndu mur (les tailles des briques sont fixées) (la récursivité ne peut donc porter que sur n)

I Utilisation de sous-problèmes:

Une fois la première brique posée il reste un mur de longueur<n.

I Reconstruction de la solution : Les arrangements de longueurn

= ceux commençant par une brique de longueur 2 + ceux commençant par une brique de longueur 3 I Cas de base:n= 1 impossible ; pour n= 2 ou 3 un seul choix.

BRIQUES(n) ifn= 1

return0

else ifn= 2ou n= 3 return1

else

returnBRIQUES(n−2) + BRIQUES(n−3)

(8)

Algorithmique et Analyse d’Algorithmes Algorithme récursif

Schémas récursifs

Exemple : Conversion en base 2

Spécification

Étant donné un entiern, on cherche à produire à l’écran l’écriture binaire den.

Idée

On sait que :

I n% 2 donne ledernierbit

I les bits les plus à gauche sont aussi ceux den/2.

Remarque

Le problème ne se résout pas naturellement de manière impérative : il faut « commencer par la fin ».

(9)

Algorithmique et Analyse d’Algorithmes Algorithme récursif

Schémas récursifs

Exemple : Conversion en base 2 (suite)

Structure récursive

I Les casn= 0 et n= 1 sont connus.

I On sait résoudre le problème si on a résolu l’instance n/2.

Écriture binaire d’un entier ECRITURE_BINAIRE(n) ifn<2

Écriren else

ECRITURE_BINAIRE(n/2) Écriren% 2

Un algorithme récursif ne se termine en généralpaspar l’appel récursif.

Et si on voulait stocker le résultat dans un tableau ?

(10)

Algorithmique et Analyse d’Algorithmes Algorithme récursif

Analyse de coût

Retour sur la factorielle

Rappel

Le coût de l’appel d’une procédure est :

I le coût du corps de la procédure pour ses paramètres d’appel I plus le coût de l’évaluation de ses paramètres.

Calcul de la factorielle FACT(n)

ifn= 0 return1

returnn×FACT(n−1) D’où

ß CFACT(0) = 0

CFACT(n) = 2 +CFACT(n−1)

La fonction de coût d’un algorithme récursif obéit généralement elle-même à une équation récursive.

(11)

Algorithmique et Analyse d’Algorithmes Algorithme récursif

Analyse de coût

Quelques équations récursives classiques

Coût arithmétique(un seul appel qui s’effectue en temps constant) SiC(n) =a+C(n−1)

alorsC(n) =a×n+C(0) =O(n) : coût linéaire Équations linéaires simples(un seul appel qui coûtef(n)) SiC(n) =C(n−1) +f(n)

alorsC(n) =C(0) +f(0) +f(1) +· · ·+f(n) =C(0) +Pn i=0f(i) CommeC(0) est constant on peut généralement l’ignorer.

En particulier Pn

i=11 =n=O(n) ; Pn

i=1i= n(n+1)2 =O(n2) et de manière plus générale Pn

i=1ik =O(nk+1).

(12)

Algorithmique et Analyse d’Algorithmes Algorithme récursif

Analyse de coût

Quelques équations récursives classiques (2)

Coût géométrique(aappels récursifs) SiC(n) =a×C(n−1) (aveca>1)

alorsC(n) =an×C(0) =O(an) Équations linéaires multiples Plus généralement si on a

C(n) =a1C(n−1) +a2C(n−2) +. . .akC(nk) (plusieurs appels récursifs pour des données presque aussi grandes)

alors en général on obtient une solution de la forme C(n) =O(nk−1λn).

autrement dit une croissance au moins exponentielle.

(13)

Algorithmique et Analyse d’Algorithmes Algorithme récursif

Analyse de coût

Cas particuliers

Calcul de coût direct

Il est parfois possible de donner directement le coût.

Ex : l’algorithme d’écriture binaire effectue clairementblog2(n)cdivisions.

Chaque appel compte

A(n) ifn= 0

return1 else

returnA(n-1) + A(n-1) + 1

B(n) if n= 0

return1 else

return2×B(n-1) + 1 I mathématiquement équivalents

I algorithmiquement très différents

(14)

Algorithmique et Analyse d’Algorithmes Algorithme récursif

Analyse de coût

Cas particuliers (2)

PGCD

SOUSTRACTIONS (a,b)

Données :Deux entiersaetb non nuls

Résultat :Le plus grand diviseur commun àa etb ifa=b

returna else ifa>b

returnSOUSTRACTIONS (ab, b) else

returnSOUSTRACTIONS (b, a)

« Décroissance » des données en un sens à préciser

(15)

Algorithmique et Analyse d’Algorithmes Analyse en moyenne

Contexte

Motivation

Recherche séquentielle en table RECH_SEQ(e,T,n)

Données :l’élémente à rechercher, un tableauT de taillen Résultat :le premier indicei tel queT[i] =e, ou −1 s’il est absent i= 0

whilei<n et puis T[i]6=e i=i+ 1

ifi <n returni else

return−1

Complexité au pire

I la bouclewhile ne peut pas faire plus dencomparaisons I pire cas facile à exhiber :e absent deT ou en dernière position D’oùCRECH_SEQ(n) =O(n)

(16)

Algorithmique et Analyse d’Algorithmes Analyse en moyenne

Contexte

Plus finement

I Pour tous les autres cas on faitstrictementmoins den comparaisons !

I Ce genre d’algorithme est utilisé de façon répétée :

le coût d’une exécution « au pire » n’est pas très informatif.

Idée : moyenne de coût de plusieurs exécutions

On « lisse » les écarts de coûts en prenant en compte les différentes instances possibles :

Cmoy(n) = moyenne(coût(d)) pour toutes les donnéesd de taillen

Maisune moyenne uniforme est-elle représentative ?

Etcomment faire une moyenne sur tous les tableaux possibles ?

(17)

Algorithmique et Analyse d’Algorithmes Analyse en moyenne

Méthode

Calcul de coût moyen

Présupposé indispensable

Modèle probabiliste de répartition des données

i.e. pour une taillenfixée, probabilité pour chacune des donnéesd possibles qu’elle soit donnée en entrée à l’algorithme

Il doit correspondre à une réalité d’utilisation :

I recherche dans un dictionnaire : la plupart du temps le mot existe I accès mémoire : l’élément recherché est souvent au début (cache) I les algorithmes de tri reçoivent souvent des données presque triées I . . .

Formule générale : moyennepondérée

Cmoy(n) = P

donnéesdde taille n

(Proba que l’entrée soitd) × (coût de l’algo surd)

(18)

Algorithmique et Analyse d’Algorithmes Analyse en moyenne

Méthode

Fin de l’exemple : recherche en table

Deux paramètres sont nécessaires : I probabilité P(eT) notéep

I dans le cas où eT, on supposera équiprobable de le trouver à chacun des indices 0..n−1.

On trouve alors :

CRECH_SEQmoy (n) = (1−p)×n+

n

P

i=1 p n×i

= (1−p)n+pnn(n+1)2

= (1−p)n+pn+12

En particulier sip= 1 on aCRECH_SEQmoy (n) = n+12

(19)

Algorithmique et Analyse d’Algorithmes Analyse en moyenne

Méthode

En pratique

I L’analyse au pire et au mieux donne déjà des informations sur la complexité moyenne :

Cmin(n) ≤ Cmoy(n) ≤ Cmax(n)

Maisattentionen généralCmoy(n)

6=

(Cmin(n) +Cmax(n))/2

I Regrouper les données de même coût : Cmoy(n) = X

coûtsc

c×(probabilité des données engendrant un coûtc)

I Parfois un modèle simplifié s’impose pour que les calculs soient faisables :

I minimiser les paramètres I privilégier l’équiprobabilité

(20)

Algorithmique et Analyse d’Algorithmes Tri rapide

Le tri rapide

I aussi appelé QuickSort, Tri par segmentation...

I inventé par Tony Hoare en 1961

I utilisé dans de nombreuses librairies comme tri

« de référence »

C.A.R. Hoare (1934-) Quelques caractéristiques

I fondamentalement récursif

I en place (pas besoin de tableau auxiliaire)

I non stable (les éléments « égaux » ne conservent pas leur ordre initial)

(21)

Algorithmique et Analyse d’Algorithmes Tri rapide

Principe général

D A E C B F

1. Choisir un élément : lepivot

D A E C B F

2. Partitionnerle tableau selon ce pivot : I élémentsinférieursau pivot à gauche I élémentssupérieursau pivot à droite

A C B D F E

3. Trier récursivement les deux sous-tableaux ainsi formés A B C D E F

(22)

Algorithmique et Analyse d’Algorithmes Tri rapide

Schéma de l’algorithme

TriSegmentation(E)

Donnée-résultatUn ensemble E de n éléments comparables Effet de bordE est trié par ordre croissant

ifE 6=∅

ChoisirunpivotdansE

SegmenterE selon lepivoten deux sous-ensemblesE1etE2

// E1 éléments plus petits que pivot // E2 éléments plus grands que pivot

Assembler(TriSegmentation(E1), pivot,TriSegmentation(E2))

À instancier avec les contraintes suivantes : I E est représenté dans un tableau

I Segmenter en place (pas de tableau auxiliaire) I Après l’appel àSegmenter on ne touche plus au pivot

(23)

Algorithmique et Analyse d’Algorithmes Tri rapide

Conception récursive

I Les appels récursifs opéreront sur des sous-tableaux (segments)

⇒2 paramètres en plus : les indices entre lesquels on travaille I Reconstruction triviale :E1 etE2 sont triés et leurs éléments sont

bien placés par rapport au pivot

I Cas de base : tableau de taille 0 ou 1 (déjà trié)

TriSegmentation(T,g,d)

Donnée-résultatUn tableau T d’éléments comparables

Effet de bordT est trié par ordre croissant entre les indices g et d ifg<d

pivot:=T[g]

i :=Partition(T,g,d,pivot) TriSegmentation(T,g, ?i−1) TriSegmentation(T, ?i+ 1,d)

(24)

Algorithmique et Analyse d’Algorithmes Tri rapide

La procédure Partition

Partition(T,g,d)

Donnée-résultatUn tableau T d’éléments comparables

Résultat :L’indicei depivot correctement placé dans le tableau Effet de bordLes éléments de T entre les indices :

I g et i−1sont tous inférieurs à pivot.

I i+ 1et d sont tous supérieurs à pivot.

i=g whilei<d

if T[i+ 1]≤T[g] i=i+ 1 else

ÉchangerT[d] etT[i+ 1]

d=d−1 ÉchangerT[g] et T[i]

returni

(25)

Algorithmique et Analyse d’Algorithmes Tri rapide

Éléments de complexité

I La taille des données est ici dg

(taille dusegment de tableau manipulé) I Partition a un coût linéaire endg. I Coût d’évaluation des paramètres constant

donc négligeable devant dg I D’où

CTriSegmentation(d−g) = CPartition(d−g)

+CTriSegmentation(i−1−g) +CTriSegmentation(d−i−1)

= O(d−g)

+CTriSegmentation(i−1−g) +CTriSegmentation(d−i−1) ... maisi est donné parPartition, donc dépend de la donnée.

I Intuitivement : l’algorithme est efficace (resp. inefficace) quand le pivot est un élément médian (resp. extrême).

I La suite plus tard...

(26)

Algorithmique et Analyse d’Algorithmes Tri rapide

En résumé

Aujourd’hui

I Un algorithmerécursifprofite de la présence desous-problèmes pour résoudre un problème

I La complexité en moyennepermet d’évaluer le comportement d’un algorithme dans une situation réaliste décrite par unedistribution aléatoire

I L’algorithme de tri rapideest récursif, peu performant au pire mais efficace en général

La prochaine fois I Invariant

I Correction d’un algorithme I Terminaison d’un algorithme I Drapeau hollandais

(27)

Algorithmique et Analyse d’Algorithmes

Bonus

Fonction 91 de McCarthy MC91 (n)

ifn≤100

returnMC91(MC91(n+ 11)) else

returnn−10

Références

Documents relatifs

procedure saisie(var t:tab;var n:integer);.

3) Combiner : les deux sous-listes triées sont alors combinées de sorte à ce que la liste résultat soit triée... Il nécéssite de l’ordre de n log(n) comparaisons/affectations

On pousse tous les bits d'un cran (ou de plusieurs si on remplace 1 par n) vers la droite (on perd donc des données de ce côté), on complète par des zéros sur la gauche. On obtient

Le mot algorithme vient du nom Al Khwarizmi (Abu Ja’far Mohammed Ben Mussa Al-Khwarismi), né vers 780 dans la ré- gion de Khwarezm (aujourd’hui Khiva), au sud de la Mer

[r]

Le mot algorithme vient du nom Al Khwarizmi (Abu Ja’far Mohammed Ben Mussa Al-Khwarismi), né vers 780 dans la région de Khwarezm (aujourd’hui Khiva), au sud de la Mer

Un algorithme de tri permet de mettre dans un ordre croissant ou décroissant des valeurs stockées dans une structure de donnée comme un tableau en mémoire centrale.. Ces valeurs

2/ Mission 1 : Initialiser le robot de sorte qu’il soit placé dans le coin Sud-Ouest et orienté vers le Nord.. Faire avancer Nono de