Tri en Python. # on cherche k tel que a k = min(a j ) ji



Documents pareils
1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Architecture des Systèmes d Information Architecture des Systèmes d Information

Algorithmique I. Algorithmique I p.1/??

1 Recherche en table par balayage

Quelques Algorithmes simples

Chapitre 7. Récurrences

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

Représentation d un entier en base b

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Initiation à la programmation en Python

Initiation à l algorithmique

Recherche dans un tableau

Définitions. Numéro à préciser. (Durée : )

STAGE IREM 0- Premiers pas en Python

Les structures de données. Rajae El Ouazzani

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

ARBRES BINAIRES DE RECHERCHE

Résolution de systèmes linéaires par des méthodes directes

Licence Sciences et Technologies Examen janvier 2010

Corrigé des TD 1 à 5

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Arbres binaires de recherche

Les arbres binaires de recherche

Algorithmique, Structures de données et langage C

V- Manipulations de nombres en binaire

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Algorithmes récursifs

Les deux points les plus proches

Master IMEA 1 Calcul Stochastique et Finance Feuille de T.D. n o 1

MIS 102 Initiation à l Informatique

Image d un intervalle par une fonction continue

Représentation des Nombres

Découverte de Python

Traitement des données avec Microsoft EXCEL 2010

Introduction à MATLAB R

Algorithmique et Programmation

Intégration et probabilités TD1 Espaces mesurés Corrigé

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

Chapitre 5. Équilibre concurrentiel et bien-être

SUPPORT DE COURS. Dr. Omari Mohammed Maître de Conférences Classe A Université d Adrar Courriel : omarinmt@gmail.com

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Algorithmes et mathématiques. 1. Premiers pas avec Python. Exo Hello world!

Utilisation d objets : String et ArrayList

4. Les structures de données statiques

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Chapitre 5 : Flot maximal dans un graphe

Cours de Probabilités et de Statistique

Intégration et probabilités TD1 Espaces mesurés

Souad EL Bernoussi. Groupe d Analyse Numérique et Optimisation Rabat http ://

Calcul matriciel. Définition 1 Une matrice de format (m,n) est un tableau rectangulaire de mn éléments, rangés en m lignes et n colonnes.

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

chapitre 4 Nombres de Catalan

Plus courts chemins, programmation dynamique

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Leçon 01 Exercices d'entraînement

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Cours d initiation à la programmation en C++ Johann Cuenin

INF 232: Langages et Automates. Travaux Dirigés. Université Joseph Fourier, Université Grenoble 1 Licence Sciences et Technologies

CHAPITRE V. Recherche et tri

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

CCP PSI Mathématiques 1 : un corrigé

Présentation du langage et premières fonctions

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Probabilités sur un univers fini

Transmission d informations sur le réseau électrique

Logiciel Libre Cours 3 Fondements: Génie Logiciel

DM 1 : Montre Autoquartz ETA

Théorie et Codage de l Information (IF01) exercices Paul Honeine Université de technologie de Troyes France

CONCOURS D ENTREE A L ECOLE DE 2007 CONCOURS EXTERNE. Cinquième épreuve d admissibilité STATISTIQUE. (durée : cinq heures)

Deuxième partie : Cours de I ère. Applications Delphi

Cours d analyse numérique SMI-S4

Exo7. Calculs de déterminants. Fiche corrigée par Arnaud Bodin. Exercice 1 Calculer les déterminants des matrices suivantes : Exercice 2.

Exo7. Limites de fonctions. 1 Théorie. 2 Calculs


Objets Combinatoires élementaires

Cryptographie et fonctions à sens unique

Algorithmique, graphes et programmation dynamique Notes de Cours Rapport de Travaux Pratiques. Laurent Canet

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

1. Structure d'un programme FORTRAN 95

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Cours 7 : Utilisation de modules sous python

Jade. Projet Intelligence Artificielle «Devine à quoi je pense»

Examen Médian - 1 heure 30

Compression de Données - Algorithme de Huffman Document de Conception

Projet de programmation (IK3) : TP n 1 Correction

Découverte du tableur CellSheet

Arithmétique binaire. Chapitre. 5.1 Notions Bit Mot

Adama MBODJI MBODJ.SYSTEM

Cours 1 : La compilation

Perl Orienté Objet BioPerl There is more than one way to do it

Université Ibn Zohr Excel Résume de cours

Classification non supervisée

Exercices Corrigés Premières notions sur les espaces vectoriels

Bases de données documentaires et distribuées Cours NFE04

RÉALISATION DE GRAPHIQUES AVEC OPENOFFICE.ORG 2.3

Utiliser un tableau de données

AWS avancé. Surveiller votre utilisation d EC2

Transcription:

Tri en Python On considère ici des tableaux ou listes d entiers ou de ottants. En Python, on peut trier une liste à l aide de la méthode sort : si a est une liste d entiers ou de ottants, a.sort() modi e la liste en la liste triée. En revanche, la fonction sorted(a) est une fonction qui prenant une liste ou un tableau renvoie la liste (ou la tableau) des éléments triés par ordre croissant. Ainsi : a = [4,1,3,2] ; a.sort(a) # modi e a en [1; 2; 3; 4] sorted([4,1,3,2]) # renvoie la liste [1; 2; 3; 4] 1) Tri par sélection (dans un tableau) a) Principe : On détermine la position du plus petit élément, on le met en première position (en échangeant avec le premier élément), et on itère le procédé sur le tableau restant. def triselection(a) : n = len(a) for i in range(n) : k = i for j in range(i+1,n) : if a[k] > a[j] : k = j a[k],a[i] = a[i],a[k] # il s agit d une procédure : elle modi e a # on cherche k tel que a k = min(a j ) ji # on met par échange cet élément en première position a = [1,3,2] ; triselection(a) ; print(a) renvoie [1; 2; 3] c) Complexité : P n k=1 k = O(n2 ) dans tous les cas. d) Complément culturel : Le tri bulle est une variante, consistant à comparer, en commençant par la n de la liste, les couples d éléments successifs : Lorsque deux éléments successifs ne sont pas dans l ordre croissant, ils sont échangés. On fait ainsi remonter le terme le plus petit (de même que les bulles les plus légères remontent le plus vite à la surface...). D où le nom donné à ce tri. Puis on itère le procédé sur le sous-tableau restant : def tribulle(a) : for i in range(n-1) : for j in range(n-1,i,-1) : 2) Tri rapide par insertion dans une liste if a[j] < a[j-1] then a[j],a[j-1] = a[j-1],a[j] a) Principe : On insère au fur et à mesure les éléments dans une liste triée. On va utiliser une procédure auxiliaire ajouter(a,x) qui étant donnés une liste triée a et un élément x, modi e a en insérant x dans la liste a à la bonne place (de sorte à obtenir une liste triée). On suppose connue la fonction a.insert(i,x) qui permet d insérer un élément x en position i. La structure de listes en Python est particulièrement e cace, car l ajout se fait en O(1) opérations (en moyenne). Dans la fonction ajouter(a,x), il faut déterminer la position d insertion.

Pour optimiser la recherche, on utilise une méthode par dichotomie. def ajouter(x,a) : i = 0 ; j = len(a) while j>i : k = (i+j)//2 if x < a[k] : j = k else : i = (k+1) a.insert(i,x) def triinsertion(a) : b = copy(a) for x in a : ajouter(x,a) Variante récursive : def triinsertion(a) : x = a.pop() triinsertion(a) ajouter(x,a) Complexité : O(n log n) dans le pire cas et en moyenne, O(n) dans le meilleur cas. c) La variante sur les tableaux est de complexité O(n 2 ). En e et, l ajout d un élément dans un sous-tableau trié nécessite de décaler O(n) éléments. Par exemple, l ajout de 3 dans le tableau [1,5,6,*,*,*] donne [1,3,5,6,*,*,*]. 3) Tri rapide par fusion de listes triées a) Principe : Il s agit d un exemple d algorithme de type diviser pour régner. On procède par fusions successives de listes déjà triées. La première fonction, appelée fusion, fusionne deux listes supposées triées en une seule. Par exemple, fusion([1,2,4],[2,3,8]) renvoie 1,2,2,3,4,8]. La fonction de tri, récursive, consiste à couper en deux la liste initiale, à trier (par appels récursifs) les deux sous-listes, puis à les fusionner en faisant appel à la fonction fusion. Remarque : L algorithme permettant la fusion de deux listes triées consiste à comparer les éléments de tête et à sélectionner le plus petit d entre eux, à l ajouter à la liste des éléments déjà sélectionnés, et à poursuivre sur les listes associées aux autres éléments. def fusion(a,b) : c = [] ; n = len(a) ; m = len(b) ; i = 0 ; j = 0 while i < len(a) and j < len(b) : # on continue tant que les deux listes ne sont pas vides if a[i] < b[j] : c.append(a[i]) ; i = i + 1 else : c.append(b[j]) ; j = j + 1 # à ce stade, une (au moins) des deux listes est vide, et on ajoute les éléments de l autre liste à c

if i = len(a) : for j in range(j,len(b)) : else : for j in range(i,len(a)) : return c c.append(b[j]) c.append(a[i]) def trifusion(a) : # il s agit ici d une fonction renvoyant la liste des éléments de a triés n = len(a) if n <= 1 return a m = n // 2 # on utilise ensuite le slicing pour dé nir les sous-listes, on les trie et on renvoie leur fusion : return fusion( trifusion(a[0:m]), trifusion(a[m:n]) ) Si on veut obtenir une procédure, on peut par exemple considérer (il y a d autres méthodes, plus directes) : def trifusion_proc(a) b = trifusion(a) for i in range(len(a)) : a[i] = b[i] c) Complexité : O(n log n) dans tous les cas. Notons n le nombre d éléments de la liste à trier, et T (n) le nombre d opérations utilisées dans le tri fusion. Pour n 2, on a T (n) = T n 2 + T n 2 + n + c, où c est une constante, car n représente le coût de la fusion de deux listes contenant au total n éléments. Si n = 2 p, on a T (n) = 2T ( n 2 ) + n + c. D où on peut déduire T (n) = 2p T (1) + np + (1 + 2 + ::: + 2 p Ainsi, sachant que p = log n, on a : T (n) = nt (1) + n log n + (n 1)c, donc T (n) = O(n log n). 1 )c: Remarque : Pour majorer T (n) dans le cas général, on montre d abord par récurrence forte que (T (n)) n2n est une suite croissante. On encadre alors n par des puissances de 2, en considérant 2 p n < 2 p+1, où p = log n: On a donc T (n) T (2 p+1 ), et comme 2 p+1 log(2 p+1 ) 2n log(2n), on peut en conclure T n = O(n log n): 4) Tri rapide par pivot a) Principe : Il s agit de choisir un élément, appelé pivot, et de séparer en O(n) opérations la liste en deux sous-listes comprenant respectivement les éléments inférieurs et les éléments supérieurs au pivot. On itère ensuite le procédé sur les deux sous-listes ainsi obtenues, jusqu à obtenir des listes de longueur 1. La procédure partition(a,debut,fin) prend en arguments une liste a de longueur n, un indice i de début, un indice j de n tels que 0 i j < n. On choisit comme pivot la valeur de l élément a i, c est-à-dire le premier élément de la sous-liste considérée. Elle a pour e et de modi er (en temps linéaire) l ordre des éléments de la sous-liste (a i ; a i+1 ; :::; a j ) de sorte que les éléments inférieurs au pivot se retrouvent avant le pivot, lequel précède ceux qui sont supérieurs au pivot. De plus, la fonction partition renvoie la valeur de la position du pivot dans la liste obtenue. Par exemple, avec a = [3; 5; 1; 6; 2; 4; 7], d = 0, f = 6, partition(a,i,j,p) a pour e et de transformer a par exemple en la liste [2; 1; 3; 5; 6; 4; 7]:

L algorithme le plus élégant consiste à utiliser deux indices permettant de parcourir en parallèle les éléments de la liste (hormis le pivot) par la gauche et par la droite : dès qu on obtient à gauche un élément plus grand que le pivot et à droite un élément plus petit, on e ectue un échange. A la n, on permute le pivot avec le dernier élément de la première sous-liste, de sorte à le mettre à sa place, et on renvoie la position du pivot ainsi modi ée. Remarque : Une solution plus facile à programmer mais utilisant un tableau auxilaire consisterait à construire les deux listes contenant respectivement les éléments inférieurs au pivot et les éléments supérieurs au pivot, puis à concaténer les deux listes. def partition(a,debut,fin) : if debut >= fin : return debut i = debut + 1 j = fin while i<j : if a[i] <= pivot : i = i + 1 elif a[j] > pivot : j = j - 1 else : a[i],a[j] = a[j],a[i] ; i = i + 1 ; j = j - 1 if a[i] < pivot : a[debut],a[i] = a[i],a[debut] ; return(i) else : a[debut],a[i-1] = a[i-1],a[debut] ; return(i-1) def tripivot(a,debut,fin) : # tri du sous-tableau dé ni par les indices de debut et de n. if debut <= fin : k = partition(a,debut,fin) tripivot(a,debut,k-1) ; tripivot(a,k+1,fin) def tripivot2(a) : # tri du tableau (on appelle la fonction précédente avec les bonnes bornes) tripivot(a,0,len(a)-1) c) Complexité : O(n log n) en moyenne (di cile à prouver), O(n 2 ) dans le pire cas. Notons n le nombre d éléments de la liste à trier, et T n le nombre d opérations utilisées dans le tri rapide. Dans le cas le pire, le choix du pivot correspond à chaque itération à un des extrema de la liste considérée. On obtient alors T n de l ordre de n 2 : 5) Complexité optimale d un algorithme de tri (complément culturel) Il y a n! ordres totaux possibles dans un ensemble de cardinal n. L algorithme de tri doit réaliser des opérations di érentes pour chacune de ces possibilités (puisque les échanges sont di érents pour deux con gurations initiales di érentes). Or, chaque test if distingue les permutations qui le véri ent de celles qui ne le véri ent pas. Ainsi, après N tests, on distingue donc au plus 2 N classes de permutations. De ce fait, tout algorithme de tri doit au moins comporter un nombre de tests N véri ant 2 N n! On peut aussi interpréter les échanges e ectués (selon les résultats aux tests) par un arbre (binaire) de décision : un arbre de hauteur N comporte au plus 2 N feuilles. En conclusion, si T n est la complexité (en temps) d un algorithme de tri, alors 2 Tn n!

Comme log(n!) n log n, alors T n est nécessairement au moins de l ordre de n log n. Remarque : Le raisonnement précédent peut s avérer faux lorsqu on dispose d informations supplémentaires. Si par exemple, on sait que les éléments à trier sont des entiers compris entre 1 et p, on peut e ectuer le tri en O(p) opérations : il su t d utiliser un tableau de longueur p donnant les occurrences de chaque élément.