TRI FUSION
MERGE SORT
174
Tri fusion
Machine à trier des cartes perforées en 1938
1er algo de tri fusion écrit par Von Neumann pour l’EDVAC en 1945
Basé sur le paradigme « Diviser pour Régner »
175 Soukaïna MERZOUK
175
1
Tri fusion
John von Neumann (1903-1957)
Mathématicien et physicien américano-hongrois.
Importantes contributions:
mécanique quantique, analyse fonctionnelle, sciences économiques,
théorie des ensembles, informatique,
Il a de plus participé aux programmes militaires américains.
Architecture de Von Neuman:
possède une unique mémoire qui sert à conserver les logiciels et les
données.
utilisée dans la quasi-totalité des ordinateurs modernes.
176 Soukaïna MERZOUK
176
Tri fusion
Alan Mathison Turing (1912-1954)
Mathématicien britannique,
Auteur de l'article fondateur de la science informatique:
La machine de Turing et
les concepts modernes de programmation et de programme
Création des calculateurs universels programmables: les ordinateurs.
Pere de l’informatique : Il est également à l'origine:
de la formalisation des concepts d'algorithme et
de calculabilité qui ont profondément marqué cette discipline.
Thèse de Church-Turing : Son modèle a contribué à établir définitivement la thèse
Church-Turing qui donne une définition mathématique au concept intuitif de fonction
calculable
177 Soukaïna MERZOUK
177
2
Tri fusion
Alan Mathison Turing (1912-1954)
Durant la Seconde Guerre mondiale:
Il joue un rôle majeur dans les recherches sur les cryptographies générées par la
machine Enigma utilisée par les nazis.
Après la guerre:
il travaille sur un des tout premiers ordinateurs puis contribue au débat déjà houleux à
cette période sur la capacité des machines à penser en établissant le test de Turing.
En 1952 un fait divers indirectement lié à son homosexualité lui vaut des poursuites
judiciaires. Pour éviter la prison, il choisit la castration chimique par prise d'œstrogène.
Il se suicide par empoisonnement au cyanure le 7 juin 1954.
178 Soukaïna MERZOUK
178
Tri fusion
Alan Mathison Turing (1912-1954)
Réabilitation en 2009
Pétition: « Nous soussignés demandons au premier ministre de s'excuser pour
les poursuites engagées contre Alan Turing qui ont abouti à sa mort
prématurée», dressée à l'initiative de l'informaticien John Graham-Cumming a
été envoyée à Gordon Brown.
En septembre 2009, le Premier ministre britannique a présenté des regrets au
nom du gouvernement britannique pour le traitement qui lui a été infligé.
179 Soukaïna MERZOUK
179
3
Tri fusion
PRIX TURING
Depuis 1966 le prix Turing est annuellement décerné par l'Association for
Computing Machinery à des personnes ayant apporté une contribution
scientifique significative à la science de l'informatique.
Cette récompense est souvent considérée comme l'équivalent du prix Nobel de
l'informatique.
180 Soukaïna MERZOUK
180
Tri fusion
Diviser pour Régner
Séparer le problème en plusieurs sous-problèmes similaires au problème initial
1. Diviser : le pb en un certain nombre de sous-pb
2. Régner : sur les sous-pbs en les résolvant
3. Combiner : les solutions des sous-pbs en une solution unique.
181 Soukaïna MERZOUK
181
4
Tri fusion
Diviser pour Régner
Séparer le problème en plusieurs sous-problèmes similaires au problème initial
1. Diviser :
la séquence de n éléments à trier en 2 sous-séquences de n/2
éléments, jusqu'à que chaque sous-séquence soit de taille 1
2. Régner :
Trier les 2 sous-séquences récursivement à l’aide du tri fusion
3. Combiner :
Fusionner les 2 sous-séquences triées pour produire la séquence triée.
182 Soukaïna MERZOUK
182
Tri fusion
Diviser pour Régner
8 2 5 4 9 6 1 7
Diviser 8 2 5 4 9 6 1 7
8 2 5 4 9 6 1 7
8 2 5 4 9 6 1 7
2 8 4 5 6 9 1 7
2 4 5 8 1 6 7 9
Fusionner
1 2 4 5 6 7 8 9
183 Soukaïna MERZOUK
183
5
Tri fusion
Diviser pour Régner
Pour écrire l'algorithme on va appliquer le principe à l’envers : on fusionne
des blocs de une case, puis des blocs de deux cases, etc.
Fusionner les deux sous-parties d’un tableau « en place », oblige à réaliser
de nombreux décalages.
Pour gagner du temps, on va consommer de l’espace mémoire en utilisant
un tableau temporaire.
184 Soukaïna MERZOUK
184
Tri fusion - Programme
#include <stdio.h>
void triFusion(int i, int j, int tab[], int tmp[]) {
if(j <= i){ return;}
int m = (i + j) / 2;
triFusion(i, m, tab, tmp); //trier la moitié gauche récursivement
triFusion(m + 1, j, tab, tmp); //trier la moitié droite récursivement
int pg = i; //pg pointe au début du sous-tableau de gauche
int pd = m + 1; //pd pointe au début du sous-tableau de droite
int c; //compteur
185 Soukaïna MERZOUK
185
6
Tri fusion - Programme
// on boucle de i à j pour remplir chaque élément du tableau final fusionné
for(c = i; c <= j; c++) {
if(pg == m + 1) { //le pointeur du sous-tableau de gauche a atteint la limite
tmp[c] = tab[pd];
pd++;
}else if (pd == j + 1) { //le pointeur du sous-tableau de droite a atteint la limite
tmp[c] = tab[pg];
pg++;
}else if (tab[pg] < tab[pd]) { //le pointeur du sous-tableau de gauche pointe vers un
élément plus petit
tmp[c] = tab[pg];
pg++;
}else { //le pointeur du sous-tableau de droite pointe vers un élément plus petit
tmp[c] = tab[pd];
pd++;
}
}
for(c = i; c <= j; c++) { //copier les éléments de tmp[] à tab[]
tab[c] = tmp[c];
}
}186 Soukaïna MERZOUK
186
Tri fusion - Programme
int main() {
int nbr, i, tab[100], tmp[100];
printf(" Entrez le nombre d'éléments dans le tableau: ");
scanf("%d", &nbr);
printf(" Entrez %d entiers : ", nbr);
for (i = 0; i < nbr; i++)
scanf("%d", &tab[i]);
triFusion(0, nbr-1, tab, tmp);
printf("\n Tableau trié : ");
for(i = 0; i < nbr; i++) {
printf(" %4d", tab[i]);
}
printf("\n");
return 0;
}
187 Soukaïna MERZOUK
187
7
Tri fusion – Fonctionnement du Programme
188 Soukaïna MERZOUK
188
Travail demandé
Le mini projet étudie les différents algorithmes de tri à savoir :
a) Le tri par sélection ( vu en cours )
b) Le tri à bulle ( vu en cours )
c) Le tri par insertion
d) Le tri rapide
e) Le tri par fusion ( vu en cours )
Le programme va se dérouler comme suit :
1) La demande d’entrer la taille du tableau par l’utilisateur
2) Le remplissage du tableau.
3) Le choix entre les algorithmes de tri proposés –gestion des erreurs-
4) L’affichage du tableau trié dans ordre croissant et décroissant.
Travail par binôme
189 Soukaïna MERZOUK
189
8
Algorithmes de recherches
RECHERCHES : relation d’équivalence du style « égal ».
Le but de des algorithmes de recherche est de trouver un élément donné parmi
une liste d’éléments fourni par un vecteur.
Les algorithms présenté:
Séquentielle (linéaire)
Dichotomique (dans un tableau ou une liste triée)
190 Soukaïna MERZOUK
190
Recherche séquentielle ou linéaire
Le problème est de trouver un élément dans une structure linéaire (tableau) non
trié.
L'élément peut ne pas être présent
L'élément peut être présent à plusieurs endroits
Si la structure a plusieurs dimensions, il faut fouiller chaque dimension
191 Soukaïna MERZOUK
191
9
Recherche séquentielle ou linéaire
Principe : La recherche séquentielle (sequential search en anglais) parcourt, case
après case les n éléments d’un tableau et compare 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é
192 Soukaïna MERZOUK
192
Recherche séquentielle Programme
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;
}
193 Soukaïna MERZOUK
193
10
Recherche séquentielle Programme
#include <stdio.h>
void Recherche();
// Variables
int t[] = { 14,78,67,88,54,30,88,33,90,34 } ;
int t_length = sizeof(t)/sizeof(int) ;
int i ; // parcours sur t
int val ; // Valeur à chercher
// Programme de recherche d'une valeur saisie au clavier.
void Recherche(){
printf("Valeur a chercher "); scanf("%d", &val);
i = 0 ;
while (i < t_length && val != t[i]){ i = i + 1 ; }
if (i < t_length) { printf("Valeur trouvee en position %d" ,i);
} else { printf("Valeur absente : %d" ,val); }
}
int main(){
Recherche() ;
Return 0;
194
} Soukaïna MERZOUK
194
Recherche séquentielle dans un tableau trié
Parcourir le tableau jusqu’à ce qu’on trouve l’élément recherché ou un
élément supérieur à l’élément recherché ou encore qu’on ait atteint la fin
du tableau
Dans le pire des cas nécessitera n comparaisons (n étant le nombre
d’éléments du tableau)
Cas où l’élément recherché est plus grand que le dernier élément du tableau
(i.e élément d’indice n)
Amélioration possible :
Regarder si l’élément recherché n’est pas plus grand que le dernier élément
du tableau
Mais le problème demeure si l’élément recherché est le dernier élément du
tableau
195 Soukaïna MERZOUK
195
11
Recherche dichotomique
Existe-t-il un algorithme plus efficace (en nombre de
comparaisons) qui permettrait de rechercher l’existence
d’un élément donné dans un tableau trié?
196 Soukaïna MERZOUK
196
Recherche dichotomique
Principe : comparer la valeur cherchée avec celle se situant au milieu du tableau :
si la valeur est plus petite, rechercher dans le sous tableau des valeurs
inférieures;
si la valeur est plus grande ou égale, rechercher dans le sous tableau des valeurs
supérieures ou égales.
L’espace de recherche dans les sous tableaux successifs diminue à chaque étape.
Il faut alors arrêter si le sous tableau contient une seule valeur.
Il suffit alors de comparer la valeur cherchée avec cette valeur pour déterminer si la
recherche est fructueuse.
197 Soukaïna MERZOUK
197
12
Recherche dichotomique
ATTENTION : toute collection d’objet préalablement triée.
A 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.
198 Soukaïna MERZOUK
198
Recherche dichotomique
Supposons un tableau T[1..n] trié i [2..n], T[i-1] T[i]
Partitionnons le tableau T en 3 sous-tableaux T[1..m-1], T[m], T[m+1..n]
En comparant l’élément recherché à T[m], s’il n’y a pas égalité, il est possible
de dire à quel sous-tableau appartient l’élément recherché :
À T[1..m-1] si l’élément recherché < T[m],
À T[m+1..n] si l’élément recherché > T[m],
On se retrouve alors dans le cas précédent mais avec les sous-tableaux
T[1..m-1] ou T[m+1..n]
199 Soukaïna MERZOUK
199
13
Recherche dichotomique
Donc :
Soit il a été trouvé un indice k tel que
Élément recherché = T[k]
• et l’algorithme est terminé
Soit il a été trouvé en un nombre fini d’itération un sous-tableau
vide et dans ce cas
Élément recherché T[1..n]
• et l’algorithme est terminé
200 Soukaïna MERZOUK
200
Recherche dichotomique
Exemple
quoi = 11 : quoi < t[med]
med = (max + min) / 2
min = 0 max = 8
7 9 11 12 33
max med -1
min
7 9 11 12 33
201 Soukaïna MERZOUK
201
14
Recherche dichotomique : Exemple d’exécution
Valeur Cherchée = 17; Début = 0, Fin = 10
j
i milieu
-1 11
0 1 2 3 4 5 6 7 8 9 10
-2 5 7 9 11 15 17 20 21 30 39
Valeur
Valeurcherchée
cherchée=<>tableau[milieu]
tableau[milieu]
La
Lavaleur
valeurcherchée
cherchéeest
est
Ondans
dans
retourne
lalapartie
partie
milieu
gauche
droite du
du tableau
tableau
202 Soukaïna MERZOUK
202
Recherche dichotomique Programme
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;
} sortie de boucle (arret = 1)
} while(arret != 1);
ou (quoi = t[med])
return pos;
203
} Soukaïna MERZOUK ou (min > max)
203
15
Recherche dichotomique Programme
#include <stdio.h>
void Dicho();
int a[] = { 19,19,41,49,54,67,79,82,85,97 } ;
int a_length = sizeof(a)/sizeof(int) ;
int droite;
int gauche;
int m ;
int val ; // Valeur à chercher
204 Soukaïna MERZOUK
204
Recherche dichotomique Programme
void Dicho(){
printf("Valeur a chercher :"); scanf("%d", &val);
gauche = 0 ;
droite = a_length - 1 ;
while (gauche != droite){
m = gauche + droite ;
m = m / 2 ;
if (val > a[m]) { gauche = m + 1 ;
} else { droite = m ; }
}
if (a[gauche] == val) {
printf("Valeur trouvée en position : %d" ,gauche);
} else { printf("Valeur absente : %d" ,val); }
}
int main(){
Dicho() ;
Return 0;
}
205 Soukaïna MERZOUK
205
16
Algorithmes de recherche
complexité : 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.
206 Soukaïna MERZOUK
206
Algorithmes de recherche
complexité : évaluation
Type de recherche Cout moyen d’une Coût maximal
recherche (é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.
207 Soukaïna MERZOUK
207
17