Quando si tratta di progettare algoritmi, si impiegano spesso le seguenti tecniche:
- Programmazione dinamica
- La strategia golosa
- Dividere e conquistare
Mentre per i primi due metodi ci sono basi teoriche ben note, vale a dire il principio di ottimalità di Bellman e la teoria matroid (resp. Greedoid), non sono riuscito a trovare un quadro così generale per gli algoritmi basati su D&C.
In primo luogo, sono consapevole di qualcosa che noi (o meglio, il prof) abbiamo introdotto in una classe di programmazione funzionale, chiamata "scheletro algoritmico", nata nel contesto dei combinatori. A titolo di esempio, abbiamo fornito uno scheletro per gli algoritmi D&C come segue:
Definizione : Sia un set non vuoto. Chiamiamo gli elementi delle soluzioni , e gli elementi di (cioè i sottoinsiemi di ) vengono definiti problemi . Quindi, uno scheletro D & C è una 4 tupla , dove:
- è un predicato sull'insieme dei problemi e diciamo che un problema è di base se valido.
- è una mappatura che assegna una soluzione a ciascun problema di base.
- è una mappatura che divide ogni problema in una serie di sottoproblemi.
- è una mappatura che unisce le soluzioni (a seconda del tipo di "problema pivot") dei sottoproblemi per produrre una soluzione.
Quindi, per un dato scheletro e un problema , la seguente funzione generica calcola una soluzione (nel formale senso) per :
dove nella seconda riga usiamo la notazione per i sottoinsiemi del codice di una mappatura .
Tuttavia, non abbiamo esaminato ulteriormente le proprietà "strutturali" sottostanti dei problemi che possono essere formulati in questo modo (come ho detto, era una classe di programmazione funzionale e questo era solo un piccolo esempio). Sfortunatamente, non sono riuscito a trovare ulteriori riferimenti su questo approccio. Quindi non penso che le definizioni di cui sopra siano abbastanza standard. Se qualcuno riconosce ciò che ho affermato sopra, sarei felice di articoli correlati.
In secondo luogo, per la strategia avida abbiamo il famoso risultato che un problema è correttamente risolto dall'algoritmo avido generale se e solo se le sue soluzioni costituiscono un matroid ponderato. Ci sono risultati simili per gli algoritmi D & C (non necessariamente basati sul metodo descritto sopra)?