Algorithmique Info-sup S1 td Algo 4 Déc. 2016 Epita Lists Liste Itérative → Python 1 Type abstrait : Liste itérative λ λ← Python : type list type(L) = list : Liste L = [] liste-vide len(L) λ longueur ( ) L[k] λ k) ième ( , Exercice 1.1 ( Algo 7→ Python) Traduire les deux algorithmes suivants en Python. fonction compte(Element x, Liste λ) : entier variables 1. debut entier i, cpt cpt ← 0 pour i ← 1 jusqu'a longueur (λ) faire si x = ieme (λ, i) alors cpt ← cpt + 1 n n pour retourne cpt fonction est-present(Element x, Liste λ) : booleen variables 2. debut entier i i ← 1 tant que (i <= longueur (λ)) et (x <> ieme (λ, i)) faire i ← i + 1 n n tant que retourne (i <= longueur (λ)) 3. Modier la fonction précédente : elle retourne la position du premier x trouvé et la liste en paramètre est triée (en ordre croissant) Exercice 1.2 (Type abstrait → Python P1 - 2016 ) Soit l'opération change dénie pour le type abstrait Liste itérative de la manière suivante : opérations axiomes change : Liste × Élément λ 1 ≤ i ≤ longueur(λ) 1 ≤ i ≤ longueur(λ) × Élément → Liste λ x = ième(λ, i) ⇒ ième(change(λ, x, y), i) = y x 6= ième(λ, i) ⇒ ième(change(λ, x, y), i) = ième(λ, i) longueur (change ( , x, y)) = longueur ( ) avec & & λ : Liste i : Entier x, y : Élément Implémenter cette opération à l'aide d'une fonction Python. La fonction doit modier la liste en place (la liste en paramètre est modiée, aucune autre liste ne doit être créée). 1 Algorithmique Info-sup S1 td Algo 4 Déc. 2016 Epita Exercice 1.3 (Construire une liste) 1 2 3 4 5 6 7 8 9 10 >>> help ( list . append ) Help on method_descriptor : append (...) L . append ( object ) -> None -- append object to end >>> L = [] >>> L . append (1) >>> L . append (2) >>> L . append (3) >>> L [1 , 2 , 3] Écrire une fonction qui retourne une nouvelle liste de n valeurs val. Exercice 1.4 (Type abstrait 7→ Python) Implémenter les opérations suivantes en Python. 1. L'opération supprimer opérations préconditions λ k axiomes supprimer : Liste supprimer ( , ) × Entier → Liste est-déni-ssi 1 ≤ k ≤ longueur(λ) λ 6= liste-vide & 1 ≤ k ≤ longueur(λ) ⇒ longueur(supprimer(λ, k)) = longueur(λ)− 1 λ 6= liste-vide & 1 ≤ k ≤ longueur(λ) & 1 ≤ i < k ⇒ ième(supprimer(λ, k), i) = ième(λ, i) λ 6= liste-vide & 1 ≤ k ≤ longueur(λ) & k ≤ i ≤ longueur(λ) − 1 ⇒ ième(supprimer(λ, k), i) = ième(λ, i + 1) avec λ : Liste k, i : Entier 2. L'opération insérer opérations × × → préconditions λ est-déni-ssi 1 ≤ k ≤ longueur(λ) + 1 axiomes insérer : Liste Entier Élément Liste insérer( , k, e) 1≤k 1≤k 1≤k 1≤k avec ≤ longueur(λ) + 1 ⇒ longueur(insérer(λ, k, e)) = longueur(λ) + 1 ≤ longueur(λ) + 1 & 1 ≤ i < k ⇒ ième(insérer(λ, k, e), i) = ième(λ, i) ≤ longueur(λ) + 1 & k = i ⇒ ième(insérer(λ, k, e), i) = e ≤ longueur(λ) + 1 & k < i ≤ longueur(λ) + 1 ⇒ ième(insérer(λ, k, e), i) = ième(λ, i − 1) λ : Liste k, i : Entier e : Élément Comment implémenter ces opérations "en place" ? 2 Algorithmique Info-sup S1 td Algo 4 Déc. 2016 2 Epita Une impression de déjà vu Exercice 2.1 (Histogramme) 1. Écrire une fonction qui donne un histogramme des caractères présents dans une chaîne de caractères : une liste de longueur 256 qui donne pour chaque caractère son nombre d'occurences dans la chaîne. 2. Écrire une fonction qui compte le nombre de caractères diérents dans une chaînes de caractères. 3. Écrire une fonction qui retourne le caractère le plus fréquent d'une chaîne, ainsi que son nombre d'occurrences. Exercice 2.2 (Ératosthène) Écrire une fonction qui donne la liste de tous les nombres premiers jusqu'à une valeur n donnée. Utiliser la méthode du crible d'Eratosthène (voir wikipedia). 3 Ordre et tris Exercice 3.1 ( Algo → Python P1 - 2016 ) Soit la fonction test, qui utilise les opérations du type abstrait Liste itérative : fonction test(Liste L) : booleen variables entier i booleen b debut b ← vrai i ← 1 tant que i < longueur(L) faire si ieme(L, i) > ieme(L, i+1) alors b ← faux n si i ← i + 1 n n tant que retourne b test ? Écrire une version Python de cette fonction, si possible plus optimale que la version Algo présentée 1. Que fait la fonction 2. ci-dessus. Exercice 3.2 (Tri par sélection (Select Sort)) 1. Écrire la fonction minimum qui détermine la position de la valeur minimum dans une liste. 2. Utiliser la fonction précédente (en la modiant si nécessaire) pour écrire une fonction qui trie une liste en ordre croissant. Exercice 3.3 (Tri par insertion (Insertion Sort)) 1. Écrire une fonction qui insère un élément x à sa place dans une liste L triée. 2. Utiliser la fonction précédente pour écrire une fonction qui trie une liste. 3 Algorithmique Info-sup S1 td Algo 4 Déc. 2016 4 Epita Diviser pour régner (Divide and Conquer) Exercice 4.1 (Dichotomie (Binary Search)) 1. Écrire une version plus optimale de la fonction qui recherche un élément elle retourne la position de x s'il est présent dans L, x dans une liste triée L : la position où il devrait être sinon. 2. Avec cette nouvelle version de la recherche, l'insertion dans une liste triée est-elle plus optimale ? Exercice 4.2 (Tri fusion (Merge sort) 1. Écrire la fonction partition P1 - 2016 ) qui sépare une liste en deux listes de longueurs quasi identiques (à 1 près) : une moitié dans chaque liste. Exemples d'application : >>> partition ([15 , 2 , 0 , 4 , 5 , 8, 2 , 3 , 12 , 25]) ([15 , 2 , 0 , 4 , 5] , [8 , 2 , 3 , 12 , 25]) >>> partition ([5 ,3 ,2 ,8 ,7 ,1 ,5 ,4 ,0 ,6 ,1]) ([5 , 3 , 2 , 8 , 7] , [1 , 5 , 4 , 0 , 6 , 1]) 1 2 3 4 2. Écrire la fonction merge qui fusionne deux listes triées en ordre croissant en une seule liste triée. Exemple d'application : >>> merge ([1 ,5 ,8] , [2 ,3 ,4 ,8]) [1 , 2 , 3 , 4 , 5, 8 , 8] 1 2 3. Pour trier une liste . . L, on procède (récursivement) de la façon suivante : Une liste de longueur < 2 est triée. Une liste de longueur ≥2: L en on partitionne la liste deux sous-listes on trie récursivement les deux listes enn, on fusionne les listes L1 et L2 L1 et L1 et L2 de longueurs quasi identiques (à 1 près) ; L2 ; en une liste triée. Utiliser les deux fonctions précédentes (quelles soient écrites ou non) pour écrire la fonction mergesort qui trie en ordre croissant une liste (pas en place : la fonction construit une nouvelle liste qu'elle retourne). Exemple d'application : 1 2 >>> mergesort ([5 ,3 ,2 ,8 ,7 ,1 ,5 ,4 ,0 ,6 ,1]) [0 , 1 , 1 , 2 , 3, 4 , 5 , 5 , 6 , 7 , 8] 4