La combinatoria svolge un ruolo importante nell'informatica. Utilizziamo frequentemente metodi combinatori sia in analisi che in progettazione in algoritmi. Ad esempio, un metodo per trovare un set di copertine -vertex in un grafico potrebbe semplicemente ispezionare tutti i possibili sottoinsiemi . Mentre le funzioni binomiali crescono in modo esponenziale, se è una costante fissa, finiamo con un algoritmo temporale polinomiale mediante analisi asintotica.
Spesso i problemi della vita reale richiedono meccanismi combinatori più complessi che possiamo definire in termini di recidive. Un esempio famoso è la sequenza di fibonacci (ingenuamente) definita come:
Ora calcolare il valore del esimo termine cresce esponenzialmente con questa ricorrenza, ma grazie alla programmazione dinamica, possiamo calcolare in tempo lineare. Ora, non tutte le ricorrenze si prestano a DP (fuori mano, la funzione fattoriale), ma è una proprietà potenzialmente sfruttabile quando si definisce un conteggio come una ricorrenza piuttosto che una funzione generatrice.
La generazione di funzioni è un modo elegante per formalizzare un certo conteggio per una determinata struttura. Forse la più famosa è la funzione di generazione binomiale definita come:
Fortunatamente questo ha una soluzione a forma chiusa. Non tutte le funzioni di generazione consentono una descrizione così compatta.
Ora la mia domanda è questa: con quale frequenza vengono generate le funzioni utilizzate nella progettazione di algoritmi? È facile vedere come possono essere sfruttati per comprendere il tasso di crescita richiesto da un algoritmo tramite analisi, ma cosa possono dirci di un problema durante la creazione di un metodo per risolverlo?
Se molte volte lo stesso conteggio può essere riformulato come ricorrenza, può prestarsi alla programmazione dinamica, ma forse la stessa funzione generatrice ha una forma chiusa. Quindi non è così uniformemente tagliato.