En matière de conception d'algorithmes, on utilise souvent les techniques suivantes:
- Programmation dynamique
- La stratégie gourmande
- Diviser et conquérir
Alors que pour les deux premières méthodes, il existe des fondements théoriques bien connus, à savoir le principe de l'optimalité de Bellman et la théorie matroïde (resp. Greedoid), je n'ai pas pu trouver un tel cadre général pour les algorithmes basés sur D&C.
Tout d'abord, je suis conscient de quelque chose que nous (ou plutôt, le prof) avons introduit dans une classe de programmation fonctionnelle, appelée "squelette algorithmique", qui est apparu dans le contexte des combinateurs. À titre d'exemple, nous avons donné un tel squelette pour les algorithmes D&C comme suit:
Définition : Soit des ensembles non vides. Nous appelons les éléments des solutions , et les éléments de (c'est-à-dire les sous-ensembles de ) sont appelés problèmes . Ensuite, un squelette D&C est un quadruple , où:S P : = P ( A ) A ( P β , β , D , C )
- p P β ( p ) est un prédicat sur l'ensemble des problèmes et nous disons qu'un problème est basique si est vrai .
- P β → S est un mapping qui attribue une solution à chaque problème de base.
- P → P ( P ) est un mapping qui divise chaque problème en un ensemble de sous-problèmes.
- P × P ( S ) → S est un mappage qui joint les solutions (selon le type de "problème pivot") des sous-problèmes pour produire une solution.
Ensuite, pour un squelette donné et un problème , la fonction générique calcule une solution (au formel sens) pour :p f s : P → S p
où dans la deuxième ligne, nous utilisons la notation pour les sous-ensembles du domaine de codage d'un mappage .X f
Cependant, nous n'avons pas examiné plus en détail les propriétés "structurelles" sous-jacentes des problèmes qui peuvent être formulés de cette façon (comme je l'ai dit, il s'agissait d'une classe de programmation fonctionnelle et ce n'était qu'un petit exemple). Malheureusement, je n'ai pas pu trouver de référence supplémentaire sur cette approche même. Par conséquent, je ne pense pas que les définitions ci-dessus soient tout à fait standard. Si quelqu'un reconnaît ce que j'ai déclaré ci-dessus, je serais ravi des articles connexes.
Deuxièmement, pour la stratégie gourmande, nous avons le fameux résultat qu'un problème est correctement résolu par l'algorithme gourmand général si et seulement si ses solutions constituent un matroïde pondéré. Existe-t-il des résultats similaires pour les algorithmes D & C (pas nécessairement basés sur la méthode décrite ci-dessus)?