ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

30
ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell

Transcript of ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

Page 1: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE

Recherches : séquentielle, dichotomique

Tris : sélection, bulle, insertion, shell

Page 2: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 2

ALGORITHMIQUERecherche et Tris

•RECHERCHES : relation d’équivalence du style « égal ».•TRIS : relation d’ordre total du style « inférieur ou égal ». •Application possible : entiers, réels et chaînes de caractères (strcmp)•Application impossible : nombres complexes et structures (en C).•Pour les structures en C il faut disposer d'un champ correspondant à la clé de recherche et/ou tri.

Page 3: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 3

Algorithmes présentés

RECHERCHES•Séquentielle (linéaire)•Dichotomique (dans un tableau ou une liste triée)

TRIS•Tri par insertion•Tri par sélection•Tri par bulle v1 et v2•Shell sort• Quicksort (voir séance récursivité)

Page 4: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 4

Recherche séquentielle ou linéaire Principe

• Principe : comparer les uns après les autres tous les éléments du tableau avec l’objet recherché. Arrêt si :– l’objet a été trouvé

– tous les éléments ont été passés en revue et l’objet n’a pas été trouvé

tableau

 

 

   

 

Etape courante i objet = t[i]

Etapes précédentes : objet t[j] , j < i

Page 5: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 5

int rechSequentielle(int t[], int quoi, int max){

int i;int arret= 0;i= 0;while( (i < max) && ( arret == 0)){ if (t[i] == quoi)

arret = 1;else

i++;}if (i == max)

return -1;else

return i;}

Recherche séquentielleProgramme

Page 6: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 6

Recherche dichotomiquePrincipe

ATTENTION :ATTENTION : toute collection d’objet préalablement triée.

 

AA chaque étape :

• découpage du tableau en deux sous-tableau à l’aide d’un indice médian (tableau inférieur) et (tableau supérieur)

• comparaison de la valeur située à l’indice moyen et de l’objet recherché,

1. si l’objet est supérieur ou égal à la valeur t[moyen] relancer la recherche avec le tableau supérieur,

2. sinon relancer la recherche avec le tableau inférieur.

Page 7: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 7

Recherche dichotomiqueExemple

quoi = 11 : quoi < t[med]

med = (max + min) / 2

7 9 11 12 33

max = 8

max med -1min

7 9 11 12 33

min = 0

Page 8: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 8

sortie de boucle (arret = 1) ou (quoi = t[med])ou (min > max)

int rechDichotomique(int t[], int quoi, int max){ int min = 0 , med, pos, arret = 0;

do{ med= (max+min)/2;if(quoi == t[med]) { arret = 1;

pos = med;}else{ if(quoi > t[med]) min = med + 1;

else max = med - 1;}if(min > max){ arret = 1;

pos = -1;}

} while(arret != 1);return pos;

}

Recherche dichotomiqueProgramme

Page 9: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 9

Algorithmes de recherchecomplexité : exemple

Exemple sur une recherche de 256 objets (28)

• Recherche linéaire : Au pire 256 (n) en bout de tableau

Au mieux en début du tableau 1

En moyenne 128 (n/2)

• Recherche dichotomique : Etape 1 : 256 Etape 5 : 16

Etape 2 : 128 Etape 6 : 8

Etape 3 : 64 Etape 7 : 4

Etape 4 : 32 Etape 8 : 2

Coût au pire, au mieux, en moyenne : log2 (256) soit 8. Attention disposer d'une collection triée.

Page 10: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 10

Algorithmes de recherchecomplexité : évaluation

Type de recherche Cout moyen d’une recherche

Coût maximal (élément absent)

Linéaire n/2 n Dichotomique log2n log2n

Le coût du tri est plus important qu'une simple recherche.

La comparaison entre une recherche simple et un tri suivi d'une recherche dichotomique est à l'avantage de la recherche simple.

Page 11: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 11

Tris

Prérequis : existence d'une relation d’ordre total du type ≤ . 

Généralisation :

Ensemble ou collection d’informations possédant une clé.

Existence d'une relation d’ordre total de type sur la clé

Exemple : ordre lexicographique (utiliser strcmp en C)

 

Dans la suite utilisation de tableaux d’entiers :

t[1..n] est ordonné : si pour tout i, j : i < j alors t[i] t[j]

Page 12: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 12

Tri sélection - Principe

A chaque étape i :1. On recherche parmi les t[i],.. t[n] le plus petit élément qui doit

être positionné à la place i.

2. Supposons cet élément à ind_min t[ind_min] et t[i] sont échangés.

3. i = i+1, retourner en 1

Nota : au cours du tri les éléments de 0 à i –1 sont tous ordonnés et bien placés

Page 13: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 13

Tri sélection - Exemple

Eléments de 1 à i –1 bien placés

t[ind_min] le plus petit de tous les éléments entre i et n, à permuter avec t[i]

 1 i-1 i 5 ind_min n

15 9 7 12 19

Page 14: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 14

Tri sélectionProgramme

1. void triSelection(int t[ ], int max)2. { int ind_min, i, j;3. int temp;4. i= 0;5. while(i < max)6. { ind_min= i; 7. // RECHERCHE DE L'INDICE CONTENANT8. // LE PLUS PETIT ELEMENT9. 10. temp= t[i];11. t[i]= t[ind_min];12. t[ind_min]= temp;13. i= i+ 1;14. }15. }

Page 15: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 15

Tri sélectionProgramme

1. void triSelection(int t[ ], int max)2. { int ind_min, i, j;3. int temp;4. i= 0;5. while(i < max)6. { ind_min= i;7. for(j = i+1; j < max; j++)8. if(t[j] < t[ind_min])9. ind_min= j;10. temp= t[i];11. t[i]= t[ind_min];12. t[ind_min]= temp;13. i= i+ 1;14. }15. }

Page 16: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 16

Tri bulle ou échange Principe

Tableau de n éléments : au début max = n.

A la fin de chaque étape la partie du tableau de t[max+1,.. n] est constituée d’éléments bien placés et tous supérieurs aux éléments de t[0,.. max-1].

1. Pour les éléments i, de 0 à max-1 comparer et permuter successivement (si nécessaire) les éléments t[i] et t[i+1].

2. Faire max = max -1, (fin de l'étape) recommencer en 1

  Arrêt de l’algorithme lorsque max = 0.

Remarque : Possibilité d'arrêter l’algorithme si à une étape il n’y a pas eu de changement.

Page 17: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 17

Tri bulle - exemple

Tri bulle version de base• De i = 1 à max -1

1. Comparaison et échange si nécessaire entre t[i] et t[i+1]

2. max = max -1

3. Retourner en 10 i-1 i i+1 MAX+1 n

15 9 7 17 19

Page 18: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 18

Tri bulleProgramme1. void triBulle(int t[ ], int max)

2. { int i, temp;3. while(max > 0)4. { i = 0;5. while(i < max -1)6. 7. // COMPARAISON DES TERMES 8. // ADJACENTS, ECHANGE SI 9. // NECESSAIRE10. 11. 12. 13. max= max -1;14. }15.}

Page 19: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 19

Tri bulleProgramme1. void triBulle(int t[ ], int max)

2. { int i, temp;3. while(max > 0)4. { i = 0;5. while(i < max -1)6. { if( t[i] > t[i+1])7. { temp = t[i];8. t[i] = t[i+1];9. t[i+1] =

temp;10. }11. i = i+1;12. }13. max= max -1;14. }15.}

Page 20: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 20

Tri bulle – améliorations

• Test d'arrêt : mise en place d'un indicateur d'échange effectués. Si au cours d'un passage aucun changement n'a été effectué : arrêt.

• Parcours dans les deux sens : on remarque que ce tri est particulièrement défavorable si il est dans l'ordre exactement inverse (valeurs élevées en bas du tableau). On met en place une double boucle pour :

1. "pousser les valeurs les plus élevées vers le haut"

2. "pousser les valeurs les plus petites vers le bas"

Page 21: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 21

Tri insertion - Principe

A chaque étape i (indice courant i du tableau) :

La partie du tableau de 0 à i-1 est déjà triée ( les objets ne sont pas forcément à leur place finale)

1. la valeur courante en i est enlevée de sa place initiale créant un trou.

2. Les éléments de 0 à i-1 supérieurs à la valeur courante sont décalés vers la droite, déplaçant le trou (pos) vers la droite.

3. La valeur courante est insérée à la bonne place (pos) dans le trou.

Page 22: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 22

Tri insertion - Exemple

0 i-1 i n-1

7 17 19 22 9

7 17 19 22

7 17 19 22

7 17 19 22

Etape courante : itemp = 9

Déplacement du trou vers la gauche tant que t[i] < t[pos]

Page 23: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 23

Tri insertionProgramme

•les éléments de 1 à i-1 sont triés mais pas définitivement placés•pos est la position courante du trou•recherche de la bonne place

1. void triInsertion(int t[], int maxSaisi)2. { int i, pos, temp;3.4. for(i = 1; i< maxSaisi; i++)5. { temp = t[i];6. pos= i;7. // DEPLACEMENT DU TROU 8. // JUSQU'À LA BONNE POSITION 9. 10. 11. t[pos] = temp;12. }13.}

Page 24: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 24

Tri insertionProgramme

•les éléments de 1 à i-1 sont triés mais pas définitivement placés•pos est la position courante du trou•recherche de la bonne place

1. void triInsertion(int t[], int maxSaisi)2. { int i, pos, temp;3.4. for(i = 1; i< maxSaisi; i++)5. { temp = t[i];6. pos= i;7. while((pos > 0) && (t[pos-1] > temp))8. { t[pos]= t[pos-1];9. pos= pos -1;10. }11. t[pos] = temp;12. }13.}

Page 25: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 25

Tri shell - Principe

• C'est une amélioration du tri insertion. Il est basé sur le constat que le tri insertion est coûteux lorsqu'il faut faire de grands déplacements.

• On pratique donc un tri insertion en déplaçant les valeurs d'un pas donné. On raffine ce pas jusqu'à la valeur 1.

• Lorsque le pas vaut 1 c'est le tri insertion.• Le choix du pas est important pour les performances la

série : 1, 4, 13, 40, 121 (pas = 3.pas+1) est souvent utilisée

Page 26: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 26

Tri shell - Exemple

Boucle de tri avec un "pas" de 4

A remarquer que le nombre 8 est déplacé de deux "pas"

53 31 10 87 13 59 62 26 8 38

13 31 10 87 53 59 62 26 8 38

13 31 10 87 53 59 62 26 8 38

13 31 10 87 53 59 62 26 8 38

13 31 10 26 53 59 62 87 8 38

13 31 10 26 8 59 62 87 53 38

8 31 10 26 13 59 62 87 53 38

8 31 10 26 13 38 62 87 53 59

Page 27: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 27

Tri shellProgramme

1. void triShell(int tab[], int maxSaisi)2. { int pas, i, j, temp;3. pas = 0;4. while ( pas < maxSaisi) // Calcul du pas5. pas = 3*pas+1;6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. }18.}

Page 28: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 28

Tri shellProgramme

1. void triShell(int tab[], int maxSaisi)2. { int pas, i, j, temp;3. pas = 0;4. while ( pas < maxSaisi) // Calcul du pas5. pas = 3*pas+1;6. while (pas != 0) // tant que le pas est > 07. { pas = pas/3;8. for(i= pas; i < maxSaisi; i++)9. { temp = tab[i]; // valeur à décaler

éventuellement10. 11. 12. 13. 14. tab[j] = temp;15. }16. }17.}

Page 29: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 29

Tri shellProgramme

1. void triShell(int tab[], int maxSaisi)2. { int pas, i, j, temp;3. pas = 0;4. while ( pas < maxSaisi) // Calcul du pas5. pas = 3*pas+1;6. while (pas != 0) // tant que le pas est > 07. { pas = pas/3;8. for(i= pas; i < maxSaisi; i++)9. { temp = tab[i]; // valeur à décaler

éventuellement10. j = i;11. while((j>(pas-1)) && (tab[j-pas]> temp))12. { tab[j] = tab[j-pas]; // échange des valeurs13. j = j-pas;14. }15. tab[j] = temp;16. }17. }18.}

Page 30: ALGORITHMIQUE Recherches : séquentielle, dichotomique Tris : sélection, bulle, insertion, shell.

ALGORITHMIQUE (c) Ch. PAUL 30

Tris - Complexité

• Le tri à bulle O(n2)

• Le tri sélection O(n2)

• Le tr insertion O(n2)

Ces tris sont considérés comme inefficaces pour des problèmes de grande taille.

• Le tri rapide (quicksort) O(n2) au pire, O(n.log(n)) en moyenne.