Réduction de problèmes
Une méthode classique de résoudre un problème algorithmique ($P_1$) est de le transformer en un autre problème ($P_1$) que l'on sait résoudre ($S_2$) puis de transformer sa solution en une solution du problème initial ($S_1$) :
La formalisation de cette opération s'appelle une réduction et peut prendre plusieurs formes, que nous expliciterons. Outre ses applications pratiques évidentes pour le design d'algorithme et la résolution de problèmes, la réduction est est un outil fondamental permettant de comparer et de classer les problèmes algorithmiques.
Nous ne parlerons pas ici de la Réduction de Turing, trop générale et demandant des connaissances comme les machines à oracles dont nous ne parlerons pas dans ce cours d'algorithmie.
Définitions
Définition
Soient $P_1$ et $P_2$ deux problèmes algorithmiques. Une réduction de $P_2$ en $P_1$ est un couple d'algorithmes $A_1$ et $A_2$ tels que :
- Si $E_1$ est une entrée du problème $P_1$ alors $A_1(E_1)$ est une entrée de du problème $P_2$
- Si $S_2$ est une solution au problème $P_2$ avec $A_1(E_1)$ comme entrée alors $A_2(S_2)$ est une solution au problème $P_1$ d'entrée $E_1$.
Les réductions forment un ordre sur les problèmes algorithmiques : s'il existe une réduction de $P_2$ en $P_1$ on notera $P_1 \leq P_2$.
Cette définition, très générale, permet de montrer qu'un problème est plus général qu'un autre : $A \leq B$ signifie que $A$ est un cas particulier de $B$, que résoudre $B$ permet de résoudre $A$. De là, la complexité du problème $B$ ne peut être plus petite que celle du problème $A$. Par exemple :
Montrez que le problème de recherche du minimum dans un tableau d'entiers est plus simple que le problème de recherche du maximum dans un tableau d'entiers.
corrigé
corrigé
Pour cela, On crée le tableau $T'$ tel que $T'[x] = \max(T)-T[x]$ et on cherche $\max(T')$. Le min est alors : $\min(T) = \max(T) - \max(T')$.
Si l'on veut utiliser la réduction pour résoudre notre problème réduit, on cherche le couple d'algorithmes avec la complexité la plus faible, si possible linéaire (comme dans l'exercice précédent) et au mieux polynomiale :
Définition
Soient $P_1$ et $P_2$ deux problèmes algorithmiques. Une réduction polynomiale de $P_2$ en $P_1$ est une réduction ou les deux algorithmes $A_1$ et $A_2$ sont de complexité polynomiale.
Les réductions polynomiales sont les seules utilisées en algorithmie, c'est pourquoi on considérera souvent que réduction et réduction polynomiale comme équivalent, une réduction devant être polynomiale.
Une réduction polynomiale nous permettra d'utiliser effectivement l'algorithme résolvant $P_2$ pour résoudre $P_1$.
Enfin :
Définition
On dira que deux problèmes $P_1$ et $P_2$ sont équivalents s'il existe deux réductions polynomiales $P_1 \leq P_2$ et $P_2 \leq P_1$.
Par exemple :
Montrez que le problèmes de recherche du minimum dans un tableau d'entiers relatifs est le problème de recherche du maximum dans un tableau d'entiers relatifs sont équivalent et que la réduction est linéaire.
corrigé
corrigé
Pour des entiers relatifs, il suffit de faire $T'[x] = -T[x]$.
Exemples et exercices
Tris
Trier un tableau d'entier va souvent rendre les problèmes bien plus facile. ce qui fait que c'est souvent utile de faire une réduction au tri.
Montrez que le problème de recherche du maximum dans un tableau d'entiers est plus simple que le problème du tri d'un tableau d'entiers.
corrigé
corrigé
On trie puis on prend le max.
Montrez que le problème de la recherche de doublon dans un tableau d'entiers est plus simple que le problème du tri d'un tableau d'entiers.
corrigé
corrigé
On trie puis on parcourt le tableau jusqu'à trouver deux éléments successifs égaux.
Produit et carré
Montrer que le problème d'élever un entier au carré est équivalent au problème de multiplier deux entiers entres eux.
corrigé
corrigé
Soit $C(x)$ un algorithme qui rend $x^2$ et $M(x, y)$ un algorithme qui rend $xy$.
Comme $C(x) = M(x, x)$ on a clairement $C \leq M$.
La réciproque vient du produit remarquable $(x + y)^2 = x^2 + y^2 + 2xy$ et donc $M(x, y) = \frac{1}{2}(C(x+y) - C(x) - C(y))$.
{2, 3}-SUM
Nous allons voir ici une chaîne de réductions, qui nous serons utiles plus tard.
2-SUM ≤ ÉGAL
Commençons par le problème 2-SUM que nous avons déjà vu :
Problème
- nom : 2-SUM
- données :
- T : un tableau de $n$ entiers relatifs
- question : existe-t-il 2 indices (pouvant être égaux) tels que $T[i] + T[j] = 0$
Regardons un problème qui lui ressemble :
Problème
- nom : ÉGAL
- données :
- $T$, $T'$ : deux tableaux d'entiers relatifs
- question : existe-t-il 2 indices tels que $T[i] = T'[j]$
Montrez que :
Montrer que 2-SUM ≤ ÉGAL
corrigé
corrigé
On prend $T'$ le tableau tel que $T'[k] = -T[k]$ pour tout indice $k$
3-SUM ≤ 3-SUM'
Reprenons le problème 3-SUM que nous avons déjà vu :
Problème
- nom : 3-SUM
- données :
- T : un tableau de $n$ entiers relatifs
- question : existe-t-il 3 indices (pouvant être égaux) tels que $T[i] + T[j] + T[k] = 0$
Continuons sur notre lancée en considérant le problème suivant :
Problème
- nom : 3-SUM'
- données :
- $T$, $T'$ et $T''$ : trois tableaux d'entiers relatifs
- question : existe-t-il 3 indices tels que $T[i] + T'[j] = T''[k]$
Qui, selon toute logique doit être plus général que 3-SUM. Montrez le : Prouvez le :
Montrer que 3-SUM ≤ 3-SUM'
corrigé
corrigé
On prend $T = T'$ et $T''[x] = -T[x]$
ÉGAL ≤ 3-SUM
Montrons que 3-SUM est plus général que ÉGAL, cette réduction est un peu plus dure que les précédentes :
Montrer que ÉGAL ≤ 3-SUM
corrigé
corrigé
Soit $T$ et $T'$ une instance du problème ÉGAL telle que $T.\mbox{\small longueur} = n$ et $T'.\mbox{\small longueur} = n'$.
L'idée est de créer un grand tableau $T''$ de taille $n + n' + 1$ De telle sorte que s'il existe $i$, $j$ et $k$ avec $T''[i] + T''[j] + T''[k] = 0$ alors :
- $0 \leq i < n$ et est lié au tableau $T$
- $n \leq j < n + n'$ et est lié au tableau $T'$
- $k = n + n'$
Par exemple on prend $T''$ tel que :
- $T''[i] = T[i] + K$ pour tout $0 \leq i < n$
- $T''[i + n] = -T'[i] + K'$ pour tout $0 \leq i < n'$
- $T''[n+n'] = -K-K'$
En prenant $K = \max(T) + 1$ et $K'= K + 2 \cdot (\max(T) + 2\cdot \max(T')) + 1$ on a bien que si $T''[i] + T''[j] + T''[k] = 0$ :
- $k = n+n'$ sinon on ne peut avoir de somme égale à 0
- avec $k = n+n'$ comme $2K + 2\cdot\max(T) < K + K'$ on ne peut avoir $0 \leq i, j < n$
- avec $k = n+n'$ comme $2K' - 2\cdot\max(T') > K + K'$ on ne peut avoir $n \leq i, j < n + n'$
Problèmes équivalents ?
S'il semble impossible de montrer que 3-SUM ≤ 2-SUM, on peut en revanche montrer que les problèmes prim sont équivalents à leur pendant non prim. Prouvez le :
Montrer que ÉGAL ≤ 2-SUM
corrigé
corrigé
TBD
Montrer que 3-SUM' ≤ 3-SUM
corrigé
corrigé
On prend $A = 3(\sum \vert T[i]\vert + \sum \vert T'[i]\vert + \sum \vert T''[i]\vert) + 1$ et on crée un tableau $[T[i] + A \;\vert\; i] + [T'[i] + 3A \;\vert\; i] + [-T''[i] - 4A \;\vert\; i]$.
Soient $i, j, k$ tels que T[i] + T[j] + T[k] = 0$.
Pour que la somme fasse 0 il faut que les $A$ ajoutés s'annulent : donc obligatoirement 1 élément de chaque tableau initial $T$, $T'$ et $T''$.