0Pricing
Competitive Programming Academy · Leçon

Diviser pour mieux régner au milieu

Réduire l’exposant de moitié en divisant la recherche

Diviser pour mieux régner au milieu est une leçon Competitive Programming Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Competitive Programming Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Competitive Programming Academy comprend 4 leçons au total.

Quand la force brute est trop lente

Certains problèmes ont un N proche de 40, et essayer les 2^N sous-ensembles est irréalisable. La méthode des deux moitiés permet de résoudre ces cas de taille intermédiaire. 🤝

L’idée essentielle

Divisez l’entrée en deux moitiés. Résolvez chaque moitié par force brute, puis combinez astucieusement les deux résultats partiels.

Réduire l’exposant de moitié

Deux moitiés de taille N/2 coûtent chacune 2^(N/2), au lieu de 2^N au total. Cette réduction par racine carrée transforme 2^40 en une valeur raisonnable de 2^20.

Une cible classique : la somme de sous-ensemble

Déterminez si un sous-ensemble a une somme égale à une cible T. La somme de sous-ensemble avec un N proche de 40 est le problème classique de la méthode des deux moitiés.

Énumérer la première moitié

Énumérez toutes les sommes de sous-ensembles de la moitié gauche et stockez-les. Avec N/2 éléments, cela représente simplement 2^(N/2) sommes.

from itertools import combinations
left = arr[:len(arr)//2]
sums_l = []

Énumérer la seconde moitié

Faites de même pour la moitié droite et construisez la liste complète de ses sommes de sous-ensembles. Vous disposez maintenant de deux listes faciles à gérer.

Combiner avec une recherche

Pour chaque somme droite r, vous avez besoin d’une somme gauche égale à T moins r. Un ensemble ou une liste triée permet de vérifier cela rapidement.

need = T - r
found = need in left_set

Deux façons de faire correspondre les sommes

Pour des cibles exactes, utilisez un ensemble de hachage. Pour compter ou trouver les sommes les plus proches, triez une moitié et effectuez une recherche dichotomique.

Le coût temporel

Le travail total est d’environ 2^(N/2) multiplié par un facteur logarithmique pour la recherche ou le tri. C’est cette complexité qui rend un N proche de 40 réalisable.

La mémoire est le compromis

Vous stockez une moitié complète, donc la mémoire augmente jusqu’à 2^(N/2). Ne conservez que ce qui est nécessaire pour respecter la limite.

D’autres applications

Au-delà de la somme de sous-ensembles, utilisez cette méthode pour le sous-ensemble maximal sous une limite, le comptage de paires et les problèmes de type logarithme discret. Elle apprécie une séparation bien choisie.

Vérification rapide

Vous appliquez la méthode des deux moitiés à un problème de sous-ensemble contenant N éléments. Quel est le coût temporel approximatif ?

Récapitulatif

Divisez en deux moitiés, effectuez une recherche exhaustive dans chacune, puis faites correspondre les sommes gauche et droite. Vous avez échangé un peu de mémoire contre une énorme accélération. 🚀

Questions Fréquemment Posées

La leçon « Diviser pour mieux régner au milieu » est-elle gratuite ?

Oui — le texte complet de « Diviser pour mieux régner au milieu » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Competitive Programming Academy, passe à CoddyKit PRO. Le cours Competitive Programming Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Diviser pour mieux régner au milieu » ?

Réduire l’exposant de moitié en divisant la recherche Tu pratiques Competitive Programming Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Competitive Programming Academy ?

Aucune expérience préalable n'est requise. Competitive Programming Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Diviser pour mieux régner au milieu » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Competitive Programming Academy ?

Oui. Chaque leçon Competitive Programming Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. États gagnants et perdants dans les jeux
  2. Nim et le nombre de Grundy
  3. Diviser pour mieux régner au milieu
  4. Déboguer rapidement : tests de contrainte et triage
← Retour à Competitive Programming Academy