Przy projektowaniu algorytmów często stosuje się następujące techniki:
- Programowanie dynamiczne
- Chciwa strategia
- Dziel i rządź
Podczas gdy w przypadku dwóch pierwszych metod istnieją dobrze znane podstawy teoretyczne, a mianowicie zasada optymalności Bellmana i teoria matroidów (odpowiednio greedoid), nie mogłem znaleźć takiej ogólnej struktury algorytmów opartych na D&C.
Po pierwsze, zdaję sobie sprawę z czegoś, co my (a raczej prof) wprowadziliśmy do funkcjonalnej klasy programowania, zwanej „szkieletem algorytmicznym”, która powstała w kontekście kombinatorów. Jako przykład podaliśmy taki szkielet algorytmów D&C w następujący sposób:
Definicja : Niech będą niepustymi zbiorami. Nazywamy elementy rozwiązań , a elementy (to znaczy podzbiory ) są nazywane problemami . Następnie szkielet D & C to 4-krotka , gdzie:S. A
- jest predykatem w stosunku do zestawu problemów i mówimy, że problem jest podstawowy iff utrzymuje.
- to mapowanie które przypisuje rozwiązanie każdego podstawowego problemu.
- to mapowanie które dzieli każdy problem na zestaw podproblemów.
- jest mapowaniem który łączy rozwiązania (w zależności od rodzaju „problemu przestawnego”) podproblemów w celu uzyskania rozwiązania.
Następnie dla danego szkieletu i problemu , następująca funkcja ogólna oblicza rozwiązanie (w formalnym sens) dla :p f s : P → S p
gdzie w drugim wierszu używamy zapisu dla podzbiorów kodomainy odwzorowania .X f
Jednak nie zbadaliśmy dalej podstawowych „strukturalnych” właściwości problemów, które można sformułować w ten sposób (jak powiedziałem, była to funkcjonalna klasa programowania i to był tylko mały przykład). Niestety nie mogłem znaleźć dalszych odniesień do tego właśnie podejścia. Dlatego nie sądzę, aby powyższe definicje były dość standardowe. Jeśli ktoś rozpozna to, co powiedziałem powyżej, byłbym zadowolony z powiązanych artykułów.
Po drugie, w przypadku chciwej strategii mamy słynny wynik, że ogólny algorytm zachłanności poprawnie rozwiązuje problem tylko wtedy, gdy jego rozwiązania stanowią ważoną matroidę. Czy istnieją podobne wyniki dla algorytmów D i C (niekoniecznie oparte na metodzie opisanej powyżej)?