Semaine 3 : Série d exercices sur les algorithmes [Solutions]

Documents pareils
Algorithmes récursifs

ALGORITHMIQUE II NOTION DE COMPLEXITE. SMI AlgoII

1 Recherche en table par balayage

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

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)

Algorithmique et structures de données I

CORRECTION EXERCICES ALGORITHME 1

Quelques tests de primalité

Correction TD algorithmique

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

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

Cours d algorithmique pour la classe de 2nde

Quelques algorithmes simples dont l analyse n est pas si simple

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

Programmation linéaire

La maison Ecole d ' Amortissement d un emprunt Classe de terminale ES. Ce qui est demandé. Les étapes du travail

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

Contexte. Pour cela, elles doivent être très compliquées, c est-à-dire elles doivent être très différentes des fonctions simples,

4. Les structures de données statiques

Chapitre 6. Fonction réelle d une variable réelle

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

Initiation à la programmation en Python

ARBRES BINAIRES DE RECHERCHE

Exercices - Polynômes : corrigé. Opérations sur les polynômes

Factorisation Factoriser en utilisant un facteur commun Fiche méthode

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Nouvelles propositions pour la résolution exacte du sac à dos multi-objectif unidimensionnel en variables binaires

Mathématiques financières

Feuille TD n 1 Exercices d algorithmique éléments de correction

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Baccalauréat ES Polynésie (spécialité) 10 septembre 2014 Corrigé

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

Algorithme. Table des matières

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

1 I ) Une première approche de l algorithme en seconde, saison 2010 _ Antoine ROMBALDI

Chapitre VI - Méthodes de factorisation

Chapitre 7. Récurrences

Algorithmique et Programmation

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

Représentation des Nombres

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

Logiciel Libre Cours 3 Fondements: Génie Logiciel

Recherche dans un tableau

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

La persistance des nombres

Les deux points les plus proches

Objets Combinatoires élementaires

Comparaison de fonctions Développements limités. Chapitre 10

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

Algorithmique avec Algobox

Calcul Formel et Numérique, Partie I

Initiation à l algorithmique

Rappels sur les suites - Algorithme

Complément d information concernant la fiche de concordance

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

Jean-Philippe Préaux

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

0x700. Cryptologie Pearson France Techniques de hacking, 2e éd. Jon Erickson

La fonction exponentielle

Algorithmique et Programmation, IMA

Chapitre 3. Quelques fonctions usuelles. 1 Fonctions logarithme et exponentielle. 1.1 La fonction logarithme

Optimisation non linéaire Irène Charon, Olivier Hudry École nationale supérieure des télécommunications

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

Maple: premiers calculs et premières applications

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

Objectifs du cours d aujourd hui. Informatique II : Cours d introduction à l informatique et à la programmation objet. Complexité d un problème (2)

STAGE IREM 0- Premiers pas en Python

LES REGLEMENTS AVEC SOCIEL.NET DERNIERE MISE A JOUR : le 14 juin 2010

Qualité du logiciel: Méthodes de test

MIS 102 Initiation à l Informatique

OPTIMISATION À UNE VARIABLE

Capacité d un canal Second Théorème de Shannon. Théorie de l information 1/34

Exo7. Matrice d une application linéaire. Corrections d Arnaud Bodin.

Organigramme / Algorigramme Dossier élève 1 SI

Optimisation Discrète

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

Les arbres binaires de recherche

Algorithmique et programmation : les bases (VBA) Corrigé

Par combien de zéros se termine N!?

Eteindre. les. lumières MATH EN JEAN Mme BACHOC. Elèves de seconde, première et terminale scientifiques :

Introduction à MATLAB R

Optimisation, traitement d image et éclipse de Soleil

Nombres, mesures et incertitudes en sciences physiques et chimiques. Groupe des Sciences physiques et chimiques de l IGEN

avec des nombres entiers

Algorithmique, Structures de données et langage C

Texte Agrégation limitée par diffusion interne

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

Baccalauréat S Antilles-Guyane 11 septembre 2014 Corrigé

Résolution d équations non linéaires

Adama MBODJI MBODJ.SYSTEM


L ALGORITHMIQUE. Algorithme

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

Algorithmique et Programmation Fonctionnelle

Programmation avec Xcas ou Python

Logique. Plan du chapitre

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

Découverte de Python

Reaper : utilisations avancées

Corrigé des TD 1 à 5

Transcription:

Information, calcul et communication EPFL MA/PH Automne 2016 Semaine 3 : Série d exercices sur les algorithmes [Solutions] 1 Quel est le bon algorithme? le retour Le bon algorithme est le c. Le a a deux problèmes : 1) si n est pair, il ne calcule que la somme des n/2 premiers nombres pairs ; 2) si n est impair, la condition de terminaison n est jamais recontrée et l algorithme ne s arrête jamais ; le b est problématique car pour n 1, sa sortie est un nombre plus grand ou égal à 2 n, et le d est encore plus problématique, car il ne s arrête jamais pour toute valeur de n 2. 2 Que font ces algorithmes? algo1 : a) 36 ; b) pas récursif ; c) sortie : la somme des n premiers nombres impairs (qui vaut n 2 ) ; d) O(n) ;. algo2 : a) 36 ; b) pas récursif ; c) sortie : n 2 ; d) O(1). algo3 : a) 36 ; b) récursif. ; c) sortie : la somme des n premiers nombres impairs (qui vaut n 2 ) ; d) O(n). algo4 : a) 12 ; b) récursif ; c) sortie : si n est impair, la somme des (n + 1)/2 premiers nombres impairs ; si n esd pair, la somme des n/2 premiers nombres pair ; c) O(n). e) algo7 est le seul algorithme qui fonctionne correctement ; les autres ne s arrêtent jamais. f) Il recalcule plusieurs fois la même chose inutilement et prend également un temps exponentiel pour s exécuter. g) Si l entrée est n, alors la sortie sera n (tout ça pour ça...). 3 Au temps des Grecs Algorithme d Euclide - version récursive : pgcdrecursif entrée : a, b deux entiers naturels non nuls sortie : pgcd (a, b) Si b = 0 sortir : a sortir : pgcdrecursif (b, a mod b) 1

4 Au temps des Egyptiens, deuxième partie La version récursive de l algorithme est donnée par : multrecursif entrée : a, b deux entiers naturels non nuls sortie : a b Si b = 1 sortir : a Si b est pair sortir : multrecursif(2a, b/2) sortir : a + multrecursif(a, b 1) 5 Création d algorithmes a) La solution la plus simple consiste ici à compter les espaces et à ajouter 1 : nombre de mots entrée : chaîne de caractères A sortie : le nombre de mots de A n taille(a) s 0 Pour i allant de 2 à n 1 Si A(i) = s s + 1 sortir : s + 1 La complexité de cet algorithme est clairement O(n) (taille est toujours O(n), voire peut être moins). Pour les séquences d espaces, il suffit : soit d ajouter une boucle dès qu on a trouvé une espace ; soit de ne compter un mot que si le caractère précédent (une espace) n est pas une espace. Pour les espaces initiales et finales, la seconde solution ci-dessus convient aussi ; elle est donc la plus simple. Attention cependant à la fin : il faut maintenant aller jusqu au bout (n au lieu de n 1) et n ajouter 1 que si la dernière lettre n est pas une espace : 2

nombre de mots entrée : chaîne de caractères A sortie : le nombre de mots de A n taille(a) s 0 Pour i allant de 2 à n Si A(i) = et A(i 1) s s + 1 Si A(n) s s + 1 sortir : s b) Il suffit de regarder tour à tour toutes les valeurs de la liste, en mémorisant la plus grande vue jusqu ici : la plus grande valeur entrée : liste L (non vide) de nombres entiers positifs sortie : la plus grande valeur de L n taille(l) x L(1) Pour i allant de 2 à n Si L(i) > x sortir : x x L(i) A nouveau, l ordre de complexité de l algorithme est O(n). Et pour une version récursive : plus_grande_valeur_r entrée : liste L (non vide) de nombres entiers positifs sortie : la plus grande valeur de L n taille(l) Si n = 1 sortir : L(1) sortir : max (L(1), plus_grande_valeur_r ( L(2, n) )) en notant «L(2, n)» la sous-liste de L constituée des éléments L(2), L(3),, L(n). Notons C(n) la complexité de cette version récursive. Supposons de plus ici que la complexite de taille est O(1), disons a (sinon, il suffirait de changer un tout petit peu l algorithme en lui ajoutant un paramètre de plus, la taille, pour retrouver ce même résultat). Nous avons : C(n) = a + 1 + 1 + 1 + C(n 1) et C(1) = a + 3. Donc : C(n) = (a + 3) n, qui est donc aussi en O(n). 3

c) Ici, plusieurs possibiltés s offrent à nous, qui sont plus ou moins efficaces. Une première possibilité est de parcourir toutes les paires de nombres de la liste et de garder la trace du plus grand des produits de ces paires de nombres. La complexité d un tel algorithme est O(n 2 ) et n est pas optimale. Une meilleure option est de parcourir une fois la liste et de garder la trace des deux plus grands nombres rencontrés : le plus grand produit entrée : liste L de nombres entiers positifs sortie : le plus grand produit de deux valeurs de L Si L(1) > L(2) x 1 L(1) x 2 L(2) x 1 L(2) x 2 L(1) n taille(l) Pour i allant de 3 à n Si L(i) > x 1 x 2 x 1 x 1 L(i) Si L(i) > x 2 x 2 L(i) sortir : x 1 x 2 L ordre de complexité de l algorithme est O(n) (car à chaque itération, le nombre d opérations effectuées est constant). Une troisième possibilité serait de d abord trier (dans l ordre croissant) la liste avec un algorithme de tri efficace, puis de sortir le produit des deux derniers nombres de la liste. Mais la complexité serait alors au mieux de O(n log 2 (n)) en fonction de l algorithme de tri utilisé. 6 Taille de liste a) Pour la solution linéaire : il suffit d essayer toutes les valeurs une à une : Taille entrée : Liste L sortie : n le nombre d éléments de L n 1 Tant que a_element(l, n) n n + 1 n n 1 sortir : n L algorithme met effectivement n + 1 étapes à s arrêter. C est bien un algorithme linéaire. 4

b) Pour une version sous-linéaire, toute la difficulté est de trouver une borne supérieure à la taille, car une fois que l on a une telle borne supérieure, on peut simplement rechercher par dichotomie entre par exemple 1 et cette borne, ce qui donnera un algorithme de complexité logarithmique. La question est donc de savoir si l on peut trouver une borne supérieure à la taille n de L en un temps logarithmique en n. La réponse est oui : prenons une constante K (par exemple K = 2) et demandons si a_element(l, K i ), pour i partant de 1 et augmentant. Nous aurons besoin de poser log K (n) +1 fois cette question. Une fois i trouvé, nous pouvons rechercher la taille par dichotomie entre K i 1 et K i. Au total, notre algorithme effectuera O(log n) opérations. Formellement, avec K = 2, on peut écrire l algorithme comme ceci : TailleLog entrée : Liste L sortie : le nombre d éléments de L t 1 Tant que a_element(l, t) t 2 t sortir : TailleDichotomique(L, t/2, t) avec TailleDichotomique entrée : L, a, b sortie : le nombre d éléments de L Si a b 1 sortir : a c a + b a 2 Si a_element(l, c) sortir : TailleDichotomique(L, c, b) sortir : TailleDichotomique(L, a, c) L idée de ce dernier algorithme est de chercher la taille entre a inclus et b exclu. Pour aller plus loin 7 Devinette Cet algorithme récursif effectue une recherche par dichotomie presque exactement comme vu en cours. La seule différence avec le cours, c est qu ici on compare aussi avec «l élément du milieu» (c dans l algorithme). 5

Rappel du fonctionnement de l algorithme : Étant donnés une liste L triée par ordre croissant, un objet x et des bornes a b, il cherche l emplacement dans L entre les indices a et b qui contient x. Une manière de chercher dans toute la liste est de choisir a = 1 et b = taille de L. L algorithme procède en affinant successivement l intervalle de recherche. À chaque étape, x est comparé à l élément c situé au milieu de l intervalle actuel, et un appel récursif est effectué sur un nouvel intervalle réduit de moitié. Lorsque l intervalle a été réduit à un seul élément (a = b), soit l élément est équivalent à x et l indice est retourné, soit la liste ne contient pas x et l algorithme retourne 0 (indice impossible pour un élément). Exactitude : Sans autre contraintes sur a et b, cet algorithme n est pas correct dans tous les cas. Si en entrée a > b, il peut arriver qu il ne termine pas en raison d un nombre infini d appels récursifs. Par ailleurs, si a est plus grand que le nombre d éléments dans la liste, «le a-ième» ou «le c-ième élément de L» ne sont pas définis. De plus, la contrainte a b n est même pas garantie dans tous les cas dans l algorithme lui-même! En effet, si x < L[a] et b = a + 1 alors on lancera devinette(l, x, a, a 1)! Essayez par exemple avec L = {2, 3}, x = 1, a = 1 et b = 2. Le plus simple serait donc d ajouter un test au début de l algorithme pour garantir 1 a b taille(l) et répondre 0 sinon. 8 Deviner l affichage Lorsque m = «3 :» et n = 3 : 3 :,3 3 :,2,1 3 :,1,2 3 :,1,1,1 Lorsque m = «4 :» et n = 4 : 4 :,4 4 :,3,1 4 :,2,2 4 :,2,1,1 4 :,1,3 4 :,1,2,1 4 :,1,1,2 4 :,1,1,1,1 L algorithme affiche toutes les permutations avec répétition de séquences de nombres entre 1 et n dont la somme est n. Pour le fun... P (1) est vraie, en effet. L erreur n est pas là. P (n) = P (n + 1) en effet si n 2 ; le problème n est pas là. 6

Le problème, c est la démonstration de P (1) = P (2) : en effet, «le crayon que l on a sorti est aussi de la même couleur que les autres restés dans la boîte, donc tous les 2 crayons sont bien tous de la même couleur,» est erroné car «les autres restés dans la boîte» est un ensemble vide... 7