Informatique TD 3.3 On a stocké dans une pile un ensemble d’entiers : p1 = [ 10, 20, 30, 40, 50, 70, 50] On rappelle que les fonctions de pile disponibles sont : empiler(p,v), depiler (p), creer_pile(), sommet(p), taille(p) et est_vide(). Performances 1) La liste p1 est-elle compatible avec une pile bornée. Justifier votre réponse et proposer un type de pile compatible. Si p1 était une pile bornée, il faudrait que p1 ait au moins 11 valeurs (10 + le nombre de valeurs). Ici la pile ne contient que 7 valeurs, il ne peut donc s’agir que d’une pile non bornée. On rappelle l’algorithme de recherche d’un élément x dans une liste non triée L : def chercher(L,x) : n = len(L) s = False c=0 while c<n and s==False : if L[c]==x : s=c c=c+1 return s On donne les durées d’exécution des instructions suivantes (vraies à 20% près) : Opération Durée unitaire(1) Incrément boucle for Affectation s=10 Opération (+ –* /) Test 1==1 0.5 1 1 1 (1) la durée unitaire pour l’essai était de 0,1 Extraction d’un élément L[1] 0.5 L.append(10) L.pop() len(L) L : liste de n éléments 1 2 1 pour 1000 instructions. L’incrément i = i+1 est ainsi la somme d’une opération arithmétique et d’une affectation. 2) Quelle est la durée unitaire C(0) d’une boucle avec prise en compte de l’affectation. C(0) = 5.5 (3 tests + 2 affectations + une extraction + une opération) 3) Donner la complexité C(n) de la fonction chercher (C(n) représente la durée unitaire du traitement de la liste dans le cas d’une liste en entrée de taille n) : - donner la valeur de C(n) dans le pire des cas et proposer un appel de la fonction correspondant, - donner la valeur de C(n) dans le meilleur des cas et proposer un appel de la fonction correspondant. C(n) = 5.5* n +2.5 (initialisation) + 2 (dernier test) dans le pire des cas chercher(p1, 5) # valeur non présente C(n) = 9 dans le meilleur des cas chercher (p1,10) # valeur présente en 1er 4) Ecrire une fonction rechercher_pile construit sur le même algorithme que chercher mais en utilisant les fonctions de piles sur une entrée p : - prévoir un algorithme 1 qui dépile p dans une liste q puis rempile les valeurs dans p, - prévoir aussi un algorithme 2 qui casse le lien d’alias de p avec la liste appelé et dépile p sans la rempiler. Correction en dernière page Lycée Jules Ferry Cannes Page 1 sur 3 TSI2 Informatique TD 3.3 Performances Dans la question suivante on exprimera les complexités en nombre d’appels aux fonctions de pile qui pour simplifier seront supposées de durées d’exécution égales. 5) Donner la complexité de C1(n) et C2(n) dans le pire des cas et conclure sur la complexité de ces 2 algorithmes. C1(n) = 4 * n +2 C2(n) = n + 1 (le deuxième algorithme est donc 4 fois plus rapide ; la réaffectation initiale de p dans le deuxième algorithme peut avoir une durée qui amoindrit cet écart) 6) Ecrire la fonction récursive chercher_rec(L,x) de la fonction chercher (où L est la liste, x est la valeur cherchée. def rechercher_rec(L,x) : n = len(L) if n == 0 : return False elif L[-1]==x : return n-1 else : return rechercher (L[ :n-1 ],x) 7) Que renverra : - rechercher (p1, 50) : 4……….……………… - rechercher_rec (p1,50) : 6…………………………, 8) Déterminer la complexité dans le pire des cas sous forme récursive : Crec(n) = f(Crec(n-1)) en supposant que l’extraction de plusieurs éléments est similaire au temps pour un seul élément. Crec(n) = Crec(n-1) + 4.5 9) Déterminer la complexité C(0) et en déduire la complexité de la fonction récursive. Crec(0) = 2.5 10) Comparer les complexités dans le pire des cas pour les fonctions récursive et itérative. Crec(n) = 4.5*n+2.5 < 5.5 * n + 2.5 = C(n) 11) Montrer qu’en optimisant la fonction itérative (boucle for + return en milieu de boucle on peut atteindre une complexité de 3,5*n dans le pire des cas). def chercher(L,x) : for c in range (len(L)): if L[c]==x : return c return False Lycée Jules Ferry Cannes Page 2 sur 3 TSI2