Meet-in-the-middle
Meet-in-the-middle
– un moyen d'optimiser solutions, qui consiste à diviser le problème d'origine en deux moitiés, à résoudre chacune indépendamment, puis à obtenir une solution au problème d'origine en combinant les solutions des moitiés.
Par conséquent, il est logique d'utiliser
meet-in-the-middle
si deux conditions sont remplies.
1) Le temps nécessaire pour résoudre la moitié du problème est asymptotiquement inférieur au temps nécessaire pour résoudre l'ensemble du problème.
2) En résolvant des demi-problèmes, on peut obtenir des solutions à l'ensemble du problème d'origine et, en même temps, asymptotiquement plus rapidement qu'en résolvant simplement l'ensemble du problème.
Exemple
Soit quatre tableaux d'entiers
A
,
B
,
C
et
D
. Il est nécessaire de sélectionner exactement un nombre dans chaque tableau pour que la somme de ces nombres soit égale à zéro. Vous pouvez utiliser une solution naïve, à savoir simplement énumérer toutes les options possibles. Cela fonctionnera pour
O(n4)
.
Cependant, nous pouvons utiliser
meet-in-the-middle
.
Notez que
a + b + c + d = 0
est équivalent à
(a + b) = -(c + d)
.
Divisons la tâche en deux moitiés, à savoir, dans la première moitié, nous n'utiliserons que les tableaux
A
et
B
, et dans la seconde moitié seulement
C
et
D
.
Parcourons toutes les options
(a + b)
possibles dans la première moitié et stockons toutes les valeurs dans une table de hachage (
unordered_map
,
HashMap code> ou similaire. ). Cela fonctionne en O(n2)
.
Nous allons maintenant parcourir toutes les options possibles (c + d)
dans la seconde moitié. Lors de l'examen d'une certaine option, nous vérifierons s'il existe une valeur dans la table de hachage associée à la somme actuelle du signe opposé (nous avons ensuite trouvé deux inverses qui s'additionnent à zéro). Cette partie fonctionne également en O(n2)
.
Nous n'avons pas de phase de "fusion de réponses" séparée ici ; dans l'un, nous l'avons fait au cours de la résolution de chacune des moitiés. La plupart des tâches auront une situation similaire.
Nous avons abouti à une solution en O(n2)
en utilisant meet-in-the-middle
.
Il convient de noter que meet-in-the-middle
est le plus souvent utilisé lors de l'optimisation de solutions exponentielles, ce qui affecte considérablement le temps d'exécution.