Dans mon message précédent, j'ai été un peu rapide. J'aimerais me rectifier. Je voulais dire qu'on différencie, en plus des cas triviaux les deux cas générés par le test
Si cette inégalité est vérifiée, alors
Sinon
Ces conjectures sont établies à partir des constats suivants (faits par pseudocode) :
À d et i fixé, si on établie la relation f(d,i,j,k) en fonction de j et k, on s'aperçoit que pour une pseudo-moitié du tableau les valeurs sont facilement prédictibles. Exemple pour d=5 et i=3
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| d=5, i=3
k
j | 1 2 3
--+------
1 | 1 2 3
2 | 1 2 4
3 | 1 2 5
4 | 1 3
5 | 1 3
6 | 1 4
7 | 2
8 | 2
9 | 2
10| 3 |
Pour la colonne k=1, il y a C_2^4=6 '1', puis C_3^1=3 '2', et enfin C_2^0=1 '3'. Généralisions, dans la colonne k il y a C_{d-k}^{i-1} 'k', puis C_{d-k-1}^{i-1-1} 'k+1' ... jusqu'à ce que l'indice ou l'exposant du C soit nul.
Ainsi, si j est inférieur ou égal à la somme des C_{d-k-n+1}^{i-n}, alors f() est prédictible par cette méthode et vaut la somme de k-1 et du nombre maximum de "sauts de valeur" que l'on peut faire en restant inférieur ou égal à j.
Exemple, pour f(5,3,5,2), on vérifie notre condition de validité :
j=5 <= C_{d-k+1}^{i-k+1} = C_4^2 = 6
Combien faut-il de "sauts de valeur" pour dépasser j ?
on a C_{d-k-1+1}^{i-1} = C_3^2 = 3 '2', on continue car 3 <= j
suivi de C_{d-k-2+1}^{i-2} = C_2^1 = 2 '3', on continue car 3+2=5 <= j
suivi de C_{d-k-3+1}^{i-3} = C_1^0 = 1 '4', on stoppe car 3+2+1=6 > j
On a donc pu faire 2 "sauts de valeur", on a donc f(5,3,5,2) = 2-1 + 2=3
Mais cette méthode est très couteuse en calcul étant donné qu'il faut calculer beaucoup de combinaisons (il est possible d'établir le nombre moyen de combinaison que l'on calcul) contre c-1 combinaisons dans la version full-tail-récursive proposée ci-avant où c est la profondeur de la récursivité, qui ne dépasse pas 3 pour des "petites" valeurs de d (<=10).
Enfin, les informations que j'ai données dans ce messages n'ont pas été
vraiment vérifiées. Je te conseille quelque tests
Partager