TP : Dichotomie 1 Recherche dans un tableau

publicité
Lycée Faidherbe de Lille
Informatique pour tous - MPSI et PCSI
TP : Dichotomie
1
Recherche dans un tableau
Dans ce TP, les listes ne contiennent que des nombres entiers ou réels. Elles peuvent contenir plusieurs
appartions ou occurences d’une même quantité.
1. Écrire une fonction chercheIndice(l,x) qui parcourt terme à terme la liste ` et qui retourne la liste
des indices i tel que `[i] = x.
Justifier que le nombre de comparaisons effectuées est de l’ordre de n, la longueur de `.
2. Écrire une fonction estDans(l,x) qui parcourt terme à terme la liste ` ou une partie de ` et qui
retourne True si x est un élément de ` et False sinon. Justifier que nombre de comparaisons effectuées
est dominé par n, la longueur de `.
Dans la suite, on donne une méthode pour améliorer l’efficacité de la fonction estDans, le prix à payer
est de chercher dans une liste triée dans l’ordre croissant.
3. Écrire une fonction verifie(l) qui retourne True si la liste ` est triée dans l’ordre croissant et False
sinon.
4. Soit ` une liste triée dans l’ordre croissant et x un nombre. On note n la longueur de `. La recherche
dichotomique se propose de retourner True si x est un élément de ` et False sinon et cela avec un
nombre de comparaisons de l’ordre de ln(n) ce qui est mieux que la recherche naı̈ve qui est de l’ordre
de n.
Pour tout 0 ≤ a < b ≤ n, on note `[a : b] la tranche [`[a], · · · , `[b − 1]] de `. On procède ainsi :
On cherche x dans la tranche `[a : b] :
estdans est initialisé à False.
Tant que a < b et not(estdans), on pose m =
b−1+a
2 ,
# le milieu de [a,b-1]
si x = `[m] alors on donne la valeur True à estdans
sinon si x < `[m], alors on pose b = m
sinon on a `[m] < x et on pose a = m + 1.
Fin du tant que.
Retourner(estdans)
(a) Justifier que l’algorithme est correct et qu’il se termine, c’est-à-dire qu’il donne une bonne réponse
à la question posée et cela avec un nombre fini d’étapes. On distinguera les cas où x est dans `
et le cas contraire.
(b) Écrire une fonction chercheDicho(l,x) qui détermine avec cette méthode s’il existe dans une
liste croissante ` un indice i tel que `[i] = x. Le retour est donc un booléen.
5. Écrire une fonction chercheIndice2(l,x) qui retourne la liste des indices i tel que `[i] = x. On
utilisera une méthode dichotomique pour trouver un indice i0 tel que `[i0 ] = x. Puis on construira la
liste voulue à partir de cette position i0 .
Donner un exemple, où le nombre de comparaisons est de l’ordre de la taille de la liste.
6. Écrire une fonction chercheNegatif(l,x) qui détermine dans une liste croissante ` l’indice i tel que
`[i] ≤ 0 < `[i + 1]. On suppose que `[0] ≤ 0 < `[n − 1] où n est la longueur de `. On utilisera une
méthode dichotomique (en temps ln(n))
1
7. BONUS : La dichotomie s’appuie sur la comparaison entre x et la médiane de `[a : b]. La connaissance
de la médiane peut donc rendre de grands services. On donne ici une méthode pour calculer une
pseudo-médiane (pour les détails voir le sujet d’option informatique de Centrale 2012) sur un tableau
non trié.
Pour un tableau de taille n = 3k , on utilisera l’algorithme de recherche d’une pseudo médiane suivant:
• si k = 0, on retourne directement le seul élément considéré ;
• sinon, on regroupe les éléments du tableau par 3, on calcule les 3k−1 médianes de ces groupes,
puis on itère le processus sur ces 3k−1 médianes. On obtient 3k−2 nouvelles médianes. De proche
en proche, il ne reste qu’un seul nombre que l’on retourne.
(a) Écrire une fonction mediane(t,i,j,k) prenant en entrée un tableau t et trois indices distincts
i, j, k et retournant un indice de la médiane, parmi les trois éléments t[i], t[j], t[k].
(b) Pour appliquer la méthode, on pourra supposer le tableau de taille 3k , placer dans une première
étape les médianes de blocs de trois en positions 3i, puis prendre les médianes de ces médianes et
les placer en position 9i, etc. Appliquer la méthode sur [7, 1, 4, 9, 8, 5, 3, 2, 6] et justifier que l’on
obtient 4.
(c) Écrire une fonction calculant une pseudo médiane. Cette fonction travaillera obligatoirement dans
le tableau initial, sans en créer de nouveau, et en maintenant globalement invariant l’ensemble
des valeurs présentes dans le tableau de taille 3k .
Donner en fonction de k, un ordre de grandeur du nombres de comparaisons.
2
Recherche de racine d’une fonction
2.1
Exercice : Dichotomie et suites adjacentes.
Une banque propose ce placement : la 1ère année, le capital augmente de t %, la 2ème année de t % et la 3ème
année de (t + 1) %. L’augmentation de capital est de 8 % au bout des trois ans. On souhaite connaı̂tre une
valeur approchée de t. Le banquier dit que t vaut environ 2, 4%. Peut-on lui faire confiance ?
1. Justifier que t vérifie l’équation t3 + 301t2 + 30200t − 70000 = 0.
On définit l’application g par
g : [0; +∞[ → R
x
7→ x3 + 301x2 + 30200x − 70000
2. Écrire une fonction g(x) qui retourne la valeur de g(x).
3. Justifier mathématiquement que l’équation g(x) = 0 admet une unique solution, notée α, sur l’intervalle
[0; +∞[ et que g est strictement croissante sur [0, 3]. Donner les valeurs de g(0) et g(3).
On construit deux suites (un )n∈N et (vn )n∈N telles que u0 = 1, v0 = 3 et pour tout entier naturel n on
a:
n
n
Si g( un +v
) > 0, alors un+1 = un et vn+1 = un +v
.
2
2
un +vn
un +vn
Si g( 2 ) ≤ 0, alors un+1 = 2 et vn+1 = vn .
4. Montrer que les suites (un )n∈N et (vn )n∈N sont à termes positifs, qu’elles sont adjacentes et qu’elles
convergent vers α.
5. Écrire une fonction rechercheRacine(eps) qui retourne une valeur de α à ε près. Il suffit de calculer
n
un et vn tels que |vn − un | < ε et de retourner un +v
. En effet, on sait que, pour tout n ∈ N, α est
2
encadré par un et vn .
2
6. Montrer que, pour tout entier naturel n, on a vn − un =
1
.
2n−1
7. En déduire le nombre d’opérations induites par rechercheRacine(eps) en fonction de ε.
3
Téléchargement