0% ont trouvé ce document utile (0 vote)
49 vues17 pages

Introduction au Tri Fusion et Algorithmes

Le document décrit l'algorithme de tri fusion. Il explique son fonctionnement basé sur le paradigme diviser pour régner ainsi que son historique et ses inventeurs comme Von Neumann et Turing. Le document présente également le programme en langage C de l'algorithme de tri fusion.

Transféré par

benrafi.k668
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
49 vues17 pages

Introduction au Tri Fusion et Algorithmes

Le document décrit l'algorithme de tri fusion. Il explique son fonctionnement basé sur le paradigme diviser pour régner ainsi que son historique et ses inventeurs comme Von Neumann et Turing. Le document présente également le programme en langage C de l'algorithme de tri fusion.

Transféré par

benrafi.k668
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi