Soit le problème suivant à résoudre (trouver le principe de codage permettant de dire que SEND+MORE= MONEY.
S E N D M O R E --------- M O N E YIl s'agit de trouver une bijection entre les lettres et des chiffres (S et M ne pouvant être nuls) pour que l'addition soit correcte en base 10. Le seul algorithme que je connaisse consiste à faire 8 boucles imbriquées de 0 à 9 pour essayer toutes les valeurs possibles pour chacune des lettres : il est typiquement exponentiel. Mais, grace à mes connaissances, je vais résoudre ce problème en temps linéaire :
D + E = Y + 10r1 r1 + N + R = E + 10r2 r2 + E + O = N + 10r3 r3 + S + M = O + 10r4 r4 = M S # 0 M # 0
D + E = Y + 10r1 r1 + N + R = E + 10r2 r2 + E + O = N + 10r3 r3 + S + M = O + 10*1 r4 = M M = 1 r4 = 1 S # 0 M # 0
D + E = Y + 10r1 r1 + N + R = E + 10r2 r2 + E + O = N + 10r3 r3 + S = O + 9 M = 1 S # 0
D + E = Y + 10r1 r1 + N + R = E + 10r2 r2 + E = N + 10r3 r3 + S = 9 O = 0 M = 1
D + E = Y + 10r1 r1 + N + R = E + 10r2 r2 + E = N S = 9 O = 0 M = 1
D + E = Y + 10r1 r1 + N + R = E + 10 1 + E = N S = 9 O = 0 M = 1
r1 + 1 + E + R = E + 10, ou r1 + R = 9R ne peut pas valoir 9 (valeur de S), donc R = 8 et r1 = 1.
D + E = Y + 10 1 + E = N R = 8 S = 9 O = 0 M = 1
J'ai donc résolu en temps quasi-linéaire un problème pour lequel le seul algorithme
connu est exponentiel. Miracle? Non :
algorithme | heuristiques | |
temps de calcul | 10^n | n + epsilonn |
taille du programme | 3*n | ? |
La taille du "programme " que j'ai utilisé se mesure probablement en téra-octets, puisque j'ai fait appel à des heuristiques (connaissances) extrèmement nombreuses, variées, complexes à mettre en oeuvre, issues de ma formation, de mon expérience, etc.
Peut-on écrire, et maintenir, un tel programme? Non, en général.
Si je veux avoir une chance de pouvoir résoudre ce type de problème, il