• Aucun résultat trouvé

14a2008 É ieS Bi Uiveiédei eShia Ai

N/A
N/A
Protected

Academic year: 2022

Partager "14a2008 É ieS Bi Uiveiédei eShia Ai"

Copied!
37
0
0

Texte intégral

(1)

David SimoninietSébastien Verel

vereli3s.unie.fr

www.i3s.unie.fr/

verel

ÉquipeSoBi-UniversitédeNieSophia-Antipolis

14 mars2008

(2)

Objetifs de la séane 8

1

Connaîtrele prinipe etl'interêtdesalgorithmesde tri

2

Algorithmede triparséletions etpermutations

3

Algorithmede triparinsertions

4

Algorithmede trirapide

Questions prinipales dujour :

Comment mettreunpeu d'ordredansesdonnées?

(3)

Plan

1

Prinipeet interêts

2

Triparseletionset permutations

3

Triparinsertions

4

Trirapide

(4)

Reherhe dihotomique

0 1 2 3 4 5 6 7 8

3 3 10 11 12 12 12 15 15

La tehniqueonsisteà:

Tester l'élémentdumilieu dutableau

à reherher àdroitesi l'élémentàreherher est plusgrand

ou à reherherà gauhesi l'élémentàreherher est pluspetit

(5)

Reherhe dihotomique

Algorithme reherheDihotomique(x:entier,t:tableaud'entier,n:

entier): booleen

début

variable a,b,:entier

a

0

b

n

1

← (

a

+

b

)/

2

tantque a

bett

[

] 6=

x faire

sit

[

] <

x alors

a

+

1

sinon

b

1

n si

← (

a

+

b

)/

2

n tantque

retourner a

b

(6)

Exemple

reherhe(10, t, 9)

0 1 2 3 4 5 6 7 8

3 3 10 11 12 12 12 15 15

a b

10

<

t

[

]

don :

0 1 2 3 4 5 6 7 8

3 3 10 11 12 12 12 15 15

a b

(7)

Nombre de omparaisons

Supposons quen

=

2

α

et notonsT

(

n

)

le nombrede omparaisons pour unsous-tableaude taillen.

T

(

n

) =

T

(

n

2

) +

1

T

(

n

) =

T

(

n

4

) +

1

+

1

T

(

n

) =

T

(

n

8

) +

1

+

1

+

1

. . .

T

(

n

) =

T

(

1

) + α

T

(

n

)

estde l'ordre delog2

(

n

)

.

Pour n

=

109 nous avonsT

(

n

) ≈

30

Alorsquepour lareherheitérativele nombred'opérationest de

l'ordre n

/

2

0

.

5 109.

(8)

Idée et intérêts

Pour ungrandnombre de reherhesdansun tableau

(imaginer lespagesjaunes...), l'idée est d'abordde trier le

tableau avant d'eetuerunereherhe.

attention :ilfautalorsprendreen ompte leoûtdutri du

tableau

Il existe d'autressituationsoù ilest intéressantde trier les

données :

Représentationd'objeten 3D

lassiation de mails,hiers,textos...

basesde données

(9)

Prinipe des tris

le trid'un tableau s'eetue dansletableau lui-même

pas de réationde tableau supplémentaire quioupede la

mémoiresupplémentaire.

Larapidité d'untri dépend dutableau àtrier:

Parexemple, letableau initialpeut êtrepratiquement trié

(10)

Tri Séletion/permutation : permutation ave le plus petit

élément

12 4 3 78 12 3 9 11 12

3 4

12

78 12 3 9 11 12

3

3

12 78 12

4

9 11 12

3 3

4

78 12

12

9 11 12

3 3 4

9

12 12

78

11 12

(11)

L'algorithme

En supposantdans unpremiertempsque indieMinetpermuter

sont dénis.

Algorithme triSelet(t:tableau d'entier, n :entier) :rien

début

variable i,jMin :entier

pour ide 0 àn-2 faire

jMin

indieMin(t, n,i) permuter(t, i,jMin)

npour

n

la boule s'arrêteà l'indien

2,puisquele derniernombre est

néessairement le plusgrand.

(12)

L'algorithme

3

jMin i

12 4

3

(13)

Permutation de deux valeurs dans un tableau

Algorithme permuter(t:tableau d'entier;i, j :entier):rien

début

variable x :entier

x

t

[

i

]

t

[

i

] ←

t

[

j

]

t

[

j

] ←

x

n

(14)

Reherhe de l'indie du nombre le plus petit

iDeb 12 3 3

Algorithme indieMin(t:tableaud'entier, n :entier,iDep:

entier) :entier

début

variable i,iMin :entier

pour ide iDep à n-1faire

si t

[

i

] <

t

[

iMin

]

alors

iMin

i

nsi

npour

retourneriMin

n

Faux :premier élémentàinitialiser

(15)

Reherhe de l'indie du nombre le plus petit

Algorithme indieMin(t:tableaud'entier, n :entier,iDep:

entier) :entier

début

variable i,iMin :entier

iMin

iDep

pour ide iDep+1 àn-1 faire

si t

[

i

] <

t

[

iMin

]

alors

iMin

i

nsi

npour

retourneriMin

n

(16)

Nombre d'opérations

Chaque reherhe d'indiedemande n

i omparaisons

Or, ily an itérationsde la reherhed'indie,d'où :

P

n

1

i

=

0

(

n

i

) = P

n

i

=

1i

=

n

(

n

+

1

)

2

Pour n

=

106,de l'ordrede 0

.

5 1012!

Mêmeà 0.1milliseondeparopération... n'essayez même pas.

(17)

En Maple

Algorithme triSelet(t : tableau d'en-

tier,n:entier):rien

début

variable i,jMin:entier

1: pouride0àn-2faire

2: jMin

indieMin(t,n,i) 3: permuter(t,i,jMin)

4: npour

n

triSelet := pro(t, n)

# t : tableau d'entiers

# n : entier, taille du tableau

# sortie : auune, tri dans t

loal i, jMin;

1. for i from 1 to n-2 do

2. jMin := indieMin(t,n,i);

3. permuter(t, i, jMin);

4. od:

end;

(18)

En Maple

Algorithme permuter(t:tableaud'en-

tier;i,j:entier):rien

début

variable x:entier

1: x

t

[

i

]

2: t

[

i

] ←

t

[

j

]

3: t

[

j

] ←

x

n

permutater := pro(t, i, j)

# t : tableau d'entiers

# i,j : entier, indies à permuter

# sortie : auune, permutation dans t

loal x;

1. x := t[i℄;

2. t[i℄ := t[j℄;

3. t[j℄ := x;

end;

(19)

En Maple

Algorithme indieMin(t:tableaud'en-

tier,n:entier,iDep:entier):entier

début

variable i,iMin:entier

1: pourideiDepàn-1faire

2: sit

[

i

] <

t

[

iMin

]

alors

3: iMin

i

4: nsi

5: npour

6: retourneriMin

n

indieMin := pro(t, n, iDep)

# t : tableau d'entiers

# n : entier, taille du tableau

# iDep : entier, premier indie de reherhe

# sortie : entier, indie du minimum de t

loal i, iMin;

1. for i from iDep to n - 1 do

2. if t[i℄ < t[iMin℄ then

3. iMin := i;

4. fi;

5. od;

6. RETURN(iMin);

end;

(20)

Prinipe : insertion de l'élément ourant dans le

sous-tableau trié

12

4 3 78 12 3 9 11 12

4 12

3 78 12 3 9 11 12

3 4 12

78 12 3 9 11 12

3 4 12 78

12 3 9 11 12

3 4 12 12 78

3 9 11 12

D.Simonin,S.Verel Algorithmesdetri

(21)

L'algorithme

Algorithme triInsertion(t:tableaud'entier, n :entier) :rien

début

variable i:entier

pour ide 1 àn-1 faire

inserer(t,i)

npour

n

labouleommeneàl'indie1,puisquelepremier nombreestdéjà

en plae.

(22)

Algorithme insertion

Insère lenombred'indiei dansle sous-tableaude l'indie0 etài.

Le tableau de l'indie0 età i

1est supposétriédansl'ordre

roissant.

Algorithme inserer(t :tableau d'entier, i:entier) :rien

début

variable j

,

x :entier

x

t

[

i

]

j

i-1

tant que0

j ETx

t

[

j

]

faire

t

[

j

+

1

] ←

t

[

j

]

j

j

1

ntant que

t

[

j

+

1

] ←

x

n

(23)

Exemple d'insertion : inserer(t,4)

3 4 12 78

4 3 9 11 12

3 4 12 78 78

3 9 11 12

3 4 12 12 78

3 9 11 12

3 4 4 12 78

3 9 11 12

3 4 4 12 78 3 9 11 12

[ ]

(24)

Nombre d'opérations

Chaque reherhe insertiondemandei

/

2omparaisons en moyenne

Or, ily an itérationsde l'insertion,le nombrede omparaisonsest

don en moyenne :

P

n

1

i

=

0 i

/

2

=

n

(

n

+

1

)

4

Pour n

=

106,de l'ordrede 0

.

25 1012 en moyenne!

(25)

En Maple

Algorithme triInsertion(t : tableau

d'entier,n:entier):rien

début

variable i:entier

1: pouride1àn-1faire

2: inserer(t,i)

3: npour

n

triInsertion := pro(t, n)

# t : tableau d'entiers

# n : entier, taille du tableau

# auune : tri dans t

loal i;

for i from 1 to n-1 do

inserer(t,n,i);

od:

end;

(26)

En Maple : inserer

Algorithme inserer(t:tableaud'entier;

i:entier):rien

début

variable j

,

x :entier

1: j

i-1

2: x

t

[

i

]

3: tantque0

j ETx

t

[

j

]

faire

4: t

[

j

+

1

] ←

t

[

j

]

5: j

j

1

6: ntantque

7: t

[

j

+

1

] ←

x

n

inserer := pro(t, i)

# t : tableau d'entiers

# i : entier, borne d'insertion

# sortie : auune, insertion dans t

loal j;

j := i-1;

x := t[i℄;

while 0 <= j and t[j℄ <= x do

t[j+1℄ := t[j℄;

j := j - 1;

od:

t[j+1℄ := x;

end;

(27)

Prinipe

Le tri rapide(enanglais quiksort) estune méthode de triinventée

parC.A.R. Hoareen 1962 baséesur laméthode diviserpour

régner.

Il onsiste àhoisir unnombrepivotdansle tableau,

à partionner en deux letableau ave:

les nombres pluspetitsà gauhedunombre pivotet

les nombres plusgrands àdroite dunombrepivot

et d'itérerle proessussur lessous-tableaux obtenus.

(28)

Prinipe

Voirlesanimations de lapage web :

http://lwh.free.fr/pages/algo/tri/tri.htm

(29)

L'algorithme

Algorithme triRapide(t:tableaud'entier;rst,last:entier):rien

début

variable iPivot:entier

sirst <lastalors

iPivot

partionner(t,rst, last) triRapide(t,rst, iPivot)

triRapide(t,iPivot+1, last)

nsi

n

(30)

Algorithme : partitionner

Partionne en deuxdusous tableau entrerst etlast :

les nombrespluspetitquelenombrepivotsontàgauhe dee

nombre

les nombresplus grandquele nombrepivotsontàdroitede e

nombre

(31)

Algorithme partionner (1)

Algorithme partionner(t:tableaud'entier,rst,last:entier):entier

début

variable i,j,pivot:entier

pivot

t[rst℄

i

rst-1

j

last+1

tant quei<jfaire

j

j-1

tantquet

[

j

] >

pivotfaire

j

j-1

ntant que

i

i+1

tantquet

[

i

] <

pivotfaire

i

i+1

ntant que

sii<jalors

permuter(t,i,j)

nsi

ntantque

(32)

Algorithme partionner (2)

(...)

tant quei<jfaire

j

j-1

tantquet

[

j

] >

pivotfaire

j

j-1

ntant que

i

i+1

tantquet

[

i

] <

pivotfaire

i

i+1

ntant que

sii<jalors

permuter(t,i,j)

nsi

ntantque

retourner(j)

n

(33)

Nombre d'opérations

Le nombremoyen d'opérationsest de l'ordrenlog

2

(

n

)

Dans lepire desas,e nombre estn 2

.

On doit eetuerk reherhes dansununtableau nonordonnéde

taillen :

Est-il intéressantde triere tableau avantd'eetuer lareherhe?

(34)

En Maple : triRapide

Algorithme triRapide(t:tableaud'en-

tier;rst,last:entier):rien

début

variable iPivot:entier

1: sirst<lastalors

2: iPivot

partionner(t,rst,last) 3: triRapide(t,rst,iPivot)

4: triRapide(t,iPivot+1,last)

5: nsi

n

triRapide := pro(t, first,

last)

# t : tableau d'entiers

# first, last : entier, borne du

sous-tableau à trier

loal iPivot;

if first < last then

iPivot := partionner(t,

first,

last);

triRapide(t, first, iPivot);

triRapide(t, iPivot + 1, last);

fi;

end;

(35)

En Maple : partitionnner

partitionner := pro(t, n, first,

last)

# t : tableau d'entiers

# n : entier, taille du tableau

# first, last : entier,

borne du sous-tableau à trier

loal pivot, i, j;

pivot := t[first℄;

i := first - 1;

j := last + 1;

while i < j do

j := j - 1;

while pivot < t[j℄ do

j := j - 1;

od;

i := i + 1;

while t[i℄ < pivot do

i := i + 1;

od;

if i < j then

permuter(t, i, j);

fi;

od;

RETURN(j);

end;

(36)

Exeries

Supprimerunélément dansuntableaunon ordonné en

déalant tousles élémentsnéessaires versla gauhe.

Trier dansl'ordredéroissantuntableau d'entiersparle tripar

séletion/permutation

Appliquerle tri rapidesur letableau ontenantdanset ordre

5,4,3,2,1.

(37)

Objetifs de la séane 8

1

Connaîtrele prinipe etl'interêtdesalgorithmesde tri

2

Algorithmede triparséletions etpermutations

3

Algorithmede triparinsertions

4

Algorithmede trirapide

Questions prinipales dujour :

Comment mettreunpeu d'ordredansesdonnées?

Références

Documents relatifs

Connaître les mots lefs d'un langage impératif simple.. Connaître les opérations de bases

booléen est une expression dont la valeur est soit Vrai soit Faux. Cette expression peut

−→ utiliser un shéma itératif à nombre d'itérations déterminé. −→ appeler aussi souvent

ne retourner auune valeur : on notera le type de retour rien. Algorithme deviner(n : entier)

Utilisation d'un aumulateur pour réaliser un alul dans

A l'aide d'un système physique dont l'état est aléatoire :.. Valeur préise d'une résistane, appartition des

A-t-on besoin d'un traitement séquentiel des données. Le nombre de données est-il déterminé

Le nombre de noeuds d'un arbre binaire omplet équilibré en. fontion de la hauteur h est 2 h