(a) Utiliser cette méthode pour trier pas à pas la liste

Documents pareils
Initiation à la programmation en Python

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

1 Recherche en table par balayage

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

Recherche dans un tableau

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.

Licence Sciences et Technologies Examen janvier 2010

Examen Médian - 1 heure 30

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Chapitre 10. Les interfaces Comparable et Comparator 1

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

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

Algorithmique I. Algorithmique I p.1/??

Introduction a l'algorithmique des objets partages. Robert Cori. Antoine Petit. Lifac, ENS Cachan, Cachan Cedex. Resume

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

Quelques Algorithmes simples

Propagation sur réseau statique et dynamique

Chapitre 2 Devine mon nombre!

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

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

Cours Informatique Master STEP

STAGE IREM 0- Premiers pas en Python

chapitre 4 Nombres de Catalan

Algorithmes récursifs

1.6- Génération de nombres aléatoires

# 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>

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

CORRECTION EXERCICES ALGORITHME 1

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Le chiffre est le signe, le nombre est la valeur.

Les chaînes de caractères

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Cours 02 : Problème général de la programmation linéaire

Les deux points les plus proches

Les arbres binaires de recherche

I. Introduction aux fonctions : les fonctions standards

Algorithme. Table des matières

Programmation C++ (débutant)/instructions for, while et do...while

Application 1- VBA : Test de comportements d'investissements

Découverte de Python

Ordonnancement. N: nains de jardin. X: peinture extérieure. E: électricité T: toit. M: murs. F: fondations CHAPTER 1

Corrigé des TD 1 à 5

Algorithmes de recherche

Quelques algorithmes simples dont l analyse n est pas si simple

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Définition 0,752 = 0,7 + 0,05 + 0,002 SYSTÈMES DE NUMÉRATION POSITIONNELS =

Durée de L épreuve : 2 heures. Barème : Exercice n 4 : 1 ) 1 point 2 ) 2 points 3 ) 1 point

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Algorithmique avec Algobox

Introduction à MATLAB R

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

Arbres binaires de recherche

Objets Combinatoires élementaires

Série TD 3. Exercice 4.1. Exercice 4.2 Cet algorithme est destiné à prédire l'avenir, et il doit être infaillible! Exercice 4.3. Exercice 4.

C f tracée ci- contre est la représentation graphique d une

Programme Compte bancaire (code)

Représentation des Nombres

L ALGORITHMIQUE. Algorithme

LES DECIMALES DE π BERNARD EGGER

1. Création d'un état Création d'un état Instantané Colonnes Création d'un état Instantané Tableau... 4

BACCALAURÉAT GÉNÉRAL SESSION 2012 OBLIGATOIRE MATHÉMATIQUES. Série S. Durée de l épreuve : 4 heures Coefficient : 7 ENSEIGNEMENT OBLIGATOIRE

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

Factorisation Factoriser en utilisant un facteur commun Fiche méthode

Utilisation d objets : String et ArrayList

FctsAffines.nb 1. Mathématiques, 1-ère année Edition Fonctions affines

V- Manipulations de nombres en binaire

Pourquoi l apprentissage?

Algorithmique et Programmation, IMA

Programmation Objet - Cours II

t 100. = 8 ; le pourcentage de réduction est : 8 % 1 t Le pourcentage d'évolution (appelé aussi taux d'évolution) est le nombre :

6. Hachage. Accès aux données d'une table avec un temps constant Utilisation d'une fonction pour le calcul d'adresses

Bases de programmation. Cours 5. Structurer les données

SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources

Exercices du Cours de la programmation linéaire donné par le Dr. Ali DERBALA

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

TD3: tableaux avancées, première classe et chaînes

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Définition : On obtient les nombres entiers en ajoutant ou retranchant des unités à zéro.

Université du Québec à Chicoutimi. Département d informatique et de mathématique. Plan de cours. Titre : Élément de programmation.

UNIFINANZ - Consolidation financière

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)

Plus courts chemins, programmation dynamique

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

1 - Clients 2 - Devis 3 - Commandes 4 - Livraisons 5 - Factures 6 - Avoirs 7 - Modèles

Bernard HAMM, Évelyne LAVOISIER

Suites numériques 4. 1 Autres recettes pour calculer les limites

Cours 7 : Utilisation de modules sous python

TP 1. Prise en main du langage Python

La boucle for La boucle while L utilisation du if else. while (condition) { instruction(s) }

ET 24 : Modèle de comportement d un système Boucles de programmation avec Labview.

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


Groupe symétrique. Chapitre II. 1 Définitions et généralités

Géométrie dans l espace Produit scalaire et équations

EPFL TP n 3 Essai oedomètrique. Moncef Radi Sehaqui Hamza - Nguyen Ha-Phong - Ilias Nafaï Weil Florian


LibreOffice Calc : introduction aux tableaux croisés dynamiques

Transcription:

La problématique de tri d'un ensemble d'objets pouvant être ordonnés est une question fondamentale dans le traitement des données. De nombreux algorithmes portant sur de tels ensembles sont facilités si on dispose d'une relation d'ordre et si on est par exemple capable de ranger les éléments de l'ensemble dans l'ordre croissant. Cet ordre peut être l'ordre naturel sur l'ensemble des réels, sur l'ensemble des entiers écrits dans une base b quelconque ou encore l'ordre lexicographique pour trier des chaînes de caractère. Dans la suite on va présenter quelques algorithmes usuels de tri et on les appliquera à des listes d'entier. On comparera les performances de ces algorithmes et leur facilité d'implémentation. I : Tri par insertion C'est la manière naturelle de trier par exemple un tas de copie par ordre de note ou par ordre alphabétique. On prend la copie du haut du tas, puis la deuxième que l'on place dans l'ordre choisi, puis la troisième que l'on insère à sa bonne place etc. Ce tri est lent mais on voit évoluer en haut un tas trié et en dessous un tas non encore trié. Le travail s'achève avec la dernière copie. 1. Un exemple Nous utiliserons cette méthode en triant les éléments d'une liste en plaçant le plus petit terme à gauche et en commençant avec le premier élément à gauche de la liste. (a) Utiliser cette méthode pour trier pas à pas la liste L = [7, 2, 5, 8, 4, 6, 2, 3, 6]. (b) Même étude avec les deux listes L 1 = [1, 3, 5, 7, 9, 12] et L 2 = [9, 7, 6, 4, 2, 1]. Que constatez-vous? 2. Mise en place de l'algorithme (a) Écrire une procédure Tri_insert qui partant d'une liste a la retourne triée. On remarquera qu'il n'y pas de copie de liste mais seulement des échanges d'éléments deux à deux. On pourra imbriquer deux boucles. (b) Mettre en évidence dans la boucle principale une structure qui dépend de l'indice i mais qui reste inchangée à chaque étape. Cette structure est appelée invariant de boucle. (c) Mettre en évidence un invariant de la boucle secondaire. I.P.T. Tris 1

3. Performance de l'algorithme (a) Donner un majorant du nombre d'opérations élémentaires nécessaires pour trier une liste de n éléments. (b) Préciser le nombre d'opérations dans le pire des cas et dans le meilleur des cas. (c) Quelle complexité obtient-on pour cet algorithme? (d) On peut estimer qu'en moyenne, pour insérer un nouvel élément sur dans une liste triée de de p éléments, on eectue p/2 échanges. Donner une estimation moyenne d'une nombre d'opérations nécessaires au tri. II : Tri rapide quicksort L'idée essentielle de cette deuxième méthode est de diviser le problème en deux sous-problèmes de tri de taille plus petite. Pour qu'au nal le tas soit eectivement trié il sut de découper le paquet en deux parties A et B avec a A, b B, a b. Pour trier un jeu de cartes on peut ainsi repérer une carte pivot qui permettra de diviser le paquet en deux sous paquets ayant cette propriété puis on recommence sur chacun des sous-paquets crées. Pour obtenir les deux sous-paquets on procède à des comparaisons et à des échanges. Cette méthode semble intuitivement plus rapide. 1. Exemple Trier par cette méthode la liste de cartes (de même couleur) L = [3, 1, 6, 7, D, 9, 5, 8, 10, R, V, 2, 4]. Comptabiliser le nombre d'échanges. 2. Séparer en deux listes (a) Écrire une procédure Echange(a,i,j) qui échange les termes a[i] et a[j] de la liste. (b) Écrire une procédure Partition(a,g,d) a étant une liste, g, d deux indices avec 0 g < d len(a) qui prend a[g] comme pivot et qui modie la partie [a[g],..., a[d]] en une partie de même longueur mais du type [éléments plus petits que a[g]], a[g], [éléments plus grands que a[g]]. (c) Écrire une procédure Tri_rapide qui pourra faire appel à ellemême (procédure récursive). I.P.T. Tris 2

3. Performance de l'algorithme On note C(n) le coût du tri rapide pour un tableau de taille n. (a) Montrer que dans le pire des cas C(n) = n 1 + C(n 1). (b) Montrer que dans le meilleur des cas C(n) = n 1 + 2C(n/2). En déduire alors que C(n) n ln(n). 4. Amélioration de l'algorithme Pour se placer dans le meilleur des cas on propose un choix aléatoire du pivot puis on diminue les appels récursifs par l'utilisation d'une boucle. (a) Partition_2(a,g,d) def Partition_2(a,g,d): assert g<d echange(a,g,random.randint(g,d-1)) Sto=a[g] k=g for i in range (g+1,d): if a[ i ]<Sto: k=k+1 echange(a,i,k) if g!=k: echange(a,g,k) return k (b) Tri_rapide_rec2(a,g,d) def Tri_rapide_rec2(a,g,d) while g<d-1: m=partition_2(a,g,d) if m-g <d-m-1: Tri_rapide_rec2(a,g,m) g=m+1 Tri_rapide_rec2(a,m+1,d) d=m I.P.T. Tris 3

(c) Tri_rapide2(a) def Tri_rapide2(a): Tri_rapide_rec2(a,0,len(a)) Attention : avant l'exécution de ces fonctions il est nécessaire de charger le module random sous le nom random. On écrira : import random as random III : Tri par fusion On utilise encore un principe de division en deux paquets. Mais on trie chacun des deux paquets puis on fusionne les deux paquets triés. 1. Écrire un algorithme qui fusionne deux paquets supposés déjà triés. 2. Donner une écriture récursive du tri fusion.évaluer la complexité de l'algorithme. Étudier l'exemple d'écriture : def Fusionner(a,b): i=j=0 n1,n2,n=len(a),len(b), len(a)+len(b) L=[] while i< n1 and j< n2: if a[ i ]<=b[j]: L.append(a[i]) i=i+1 L.append(b[j]) j=j+1 if i==n1: while j <n2: L.append(b[j]) j=j+1 while i<n1: L.append(a[i]) i=i+1 return (L) I.P.T. Tris 4

3. Et pour le programme principal : def Tri_fusion(a): N=len(a) if N <=1: return a m=n//2 a1=tri_fusion(a[0:m]) a2=tri_fusion(a[m:n]) return Fusionner(a1,a2) IV : Médiane d'une série statistique Soit L = [x 0,..., x n 1 ] une liste de n réels. Notons L = [x 0,..., x n 1] la liste obtenue en triant les éléments de L par ordre croissant. Distinguons deux cas : 1. Si n est un entier impair, n = 2p + 1, la médiane de L est l'élément α = x p. Il y a p éléments de L plus petits que α et p éléments de L plus grands que α. 2. Si n est un entier pair, on conviendra qu'il y a deux valeurs médianes, x p 1 et x p. Les procédures de tri déjà exposées permettent donc d'obtenir un calcul de la médiane. Ecrire une procédure de calcul de médiane d'une série statistique de n éléments avec un coût en O(n ln(n)). Il est possible d'obtenir la médiane avec un algorithme en O(n). Voici par exemple les étapes d'un tel algorithme : 1. Écrire une fonction d'argument un tableau de 5 éléments et qui en retourne la médiane (idem avec au plus 5 éléments). 2. Dénir une fonction qui partant d'un tableau de n éléments le divise en sous-tableaux de 5 éléments (au plus) et retourne la liste des médianes de chacun des sous-tableaux obtenus. 3. Déterminer récursivement la médiane des médianes :A. 4. Trier la liste à partir du pivot A obtenu : à savoir des éléments inférieurs à A,A, des éléments supérieurs à A. I.P.T. Tris 5

5. Recommencer si nécessaire. Eectuer à la main cette procédure pour le tableau suivant : L = [12, 5, 45, 7, 84, 13, 24, 56, 8, 9, 14, 17, 42, 30, 24, 50, 9, 13, 22, 44, 17, 8, 45] On remarquera que dans le cas général c'est la même procédure qui conduit à rechercher la médiane ou la valeur du k-ème élément d'une liste. On pourra obtenir par exemple : def valeur_indice(a,k): if k>= len(a): raise ValueError('position demandée extérieure à la liste ' ) elif len(a)<=5: return valeur_indice_petit(a,k) Sto=[] q=len(a)//5 r=len(a)-5*q for i in range(0,q): Sto.append(valeur_indice_petit(a[5*i:5*i+5],2)) if r>0: Sto.append(valeur_indice_petit(a[5*q:5*q+r],r//2)) Pseudo=valeur_indice(Sto,len(Sto)//2) K,inf,sup=Premier_tri(a,Pseudo) if K==k: return Pseudo elif K>k: return valeur_indice(inf,k) return valeur_indice(sup,k-k) I.P.T. Tris 6