• Aucun résultat trouvé

Méthode « diviser pour régner » Exercices sur les tableaux Notation

N/A
N/A
Protected

Academic year: 2022

Partager "Méthode « diviser pour régner » Exercices sur les tableaux Notation"

Copied!
2
0
0

Texte intégral

(1)

Méthode « diviser pour régner » Exercices sur les tableaux

Notation

Étant donné un tableau T et deux entiers naturels a et b inférieurs à len(T), on note T[a:b[ le sous-tableau [T[a], T[a+1], …, T[b-1]] si a < b

le sous-tableau vide [] dans le cas contraire.

En Python, le tableau T[a:b[ est noté T[a:b] (hors-programme).

Exercice 1 - Recherche du couple (minimum, maximum) dans un tableau

L’objectif est d’écrire une fonction récursive d’entête def min_et_max(T, a, b): renvoyant le couple (minimum, maximum) du tableau T[a:b[.

Un algorithme du type « diviser pour régner » permet de déterminer ce couple en exploitant le fait qu’une seule comparaison suffit pour obtenir à la fois le minimum et le maximum d’un tableau de taille 2.

Cet algorithme est le suivant :

si T[a:b[ ne contient qu’un élément : Renvoyer (T[a], T[a])

sinon si T[a:b[ contient deux éléments :

Renvoyer (T[a], T[b]) ou (T[b], T[a]) dans l’ordre (minimum, maximum) sinon :

On pose c = (a + b)//2.

On calcule récursivement les couples (minimum, maximum) dans T[a:c[ et dans T[c:b[.

On compare les résultats obtenus et on renvoie le couple (minimum, maximum) sur T[a:b[

1. Écrire la fonction d’entête def min_et_max(T, a, b):.

2. Complexité

a. Combien de comparaisons faut-il effectuer pour rechercher la maximum et le minimum dans une liste de 10 nombres de manière classique ?

b. Combien de comparaisons faut-il effectuer pour rechercher la maximum et le minimum dans une liste de 10 nombres avec l’algorithme diviser pour régner ?

c. Et avec un tableau de 20 nombres ? 40 nombres ?

(2)

Exercice 2 Partie A

On considère la fonction Python suivante, dans laquelle tab est un tableau contenant des nombres positifs et des nombres négatifs.

def tranche(tab):

n = len(tab) smax = tab[0]

imax = jmax = 0 for i in range(n):

s = 0

for j in range(i, n):

s += tab[j]

if s > smax:

smax = s imax = i jmax = j

return copie_partielle(tab, imax, jmax) # renvoie une copie du sous-tableau tab[imax:jmax+1[

1. Écrire la fonction d’entête def copie_partielle(tab, imax, jmax): qui renvoie une copie du sous-tableau tab[imax:jmax+1[.

2. Afin de documenter la fonction tranche, indiquer son rôle en une ou deux lignes.

3. Que renvoie l’instruction tranche([3, -4, 2, -1, 5, -3]) ? 4. Quelle est la complexité de la fonction tranche ?

5. Proposer une modification à la fonction tranche pour qu’entre plusieurs résultats possibles, elle renvoie celui de plus petite taille.

Partie B

1. Proposer un algorithme du type diviser pour régner résolvant le même problème que la fonction tranche.

2. Récupérer les fichiers tranche.py et tabletest.py. Écrire la fonction d’entête def tranche_dpr_(tab, a, b):

permettant d’implémenter cet algorithme.

Exécuter la fonction test_tranche_dpr() pour tester votre script.

Références

Documents relatifs

.Try to imagine all life as you know it stopping instantaneously and every molecule in your body exploding at the speed of light.

C'est d'ailleu rs pour cette rai- son que Sophie est parmi nous, son papa travaille dans un groupement de coopératives vinicoles (à la Noël, Sophie m'offrira

o Parcourir le tableau depuis la gauche(de gauche à droite) jusqu’à rencontrer un élément ≥

(Tri rapide) Dans l'algorithme de tri rapide, on choisit récursivement un pivot, dans cet exercice le premier élément de la liste, et on place à sa gauche les éléments qui lui

Pour trier une liste lst par tri fusion, si elle contient un seul élément, elle est déjà triée, sinon on la divise en deux listes que l’on trie par tri fusion avant de les

En effet, s’il y avait deux points (ou plus) dans un carré, alors ces points seraient du même côté de la ligne rouge, donc tous les deux dans A ou dans B, et à une

Ce nom risque de vous induire en erreur : si le tri par pivot est effecti- vement très rapide en pratique dans les meilleurs cas, il est en pratique délicat à mettre en œuvre si on

La figure 7 illustre les trois premiers appels récursifs de la fonction récursive multiply dont le code est présenté figure 2, avec pour paramètres x = 105 et y = 253 (pour des