Algoritmo di Knuth

Uno dei principali problemi che si riscontra nel calcolo degli indici da dati online, è il fatto che non si ha una conoscenza preliminare del numero di dati che verranno utilizzati. Un altro importante errore che potrebbe comportare un metodo “classico” è la Catastrophic Cancellation, ovvero la cancellazione di cifre significative. Questo comporta che per molti indici, fondamentali nelle analisi preliminari delle serie storiche (molto utilizzate nelle analisi finanziarie), quali ad esempio media e varianza, non è possibile utilizzare le classiche formule. Prendiamo in considerazione la media. La formula classica per calcolarla, infatti, richiede una conoscenza preliminare del numero di dati che si andrà ad analizzare:

\bar{x}_{n}=\frac{1}{n} \sum^{n}_{i = 1} x_{i}

In questi casi conviene usare degli algoritmi online. Con algoritmo online si intende un algoritmo, per la risoluzione di un problema, che deve fornire dei risultati pur non avendo a disposizione, inizialmente, alcuni dei dati in ingresso. L’algoritmo online più utilizzato è quello proposto dall’informatico statunitense Donald Knuth che, con semplici passaggi algebri, fornisce una differente fomulazione per il calcolo della media:

\bar{x}_{n} = \frac{1}{n} \sum^{n}_{i = 1} x_{i} = \frac{1}{n} \sum^{n-1}_{i = 1} x_{i} + \frac{x_{n}}{n} = \frac{n-1}{n} \cdot \frac{1}{n-1} \sum^{n-1}_{i = 1} x_{i} + \frac{x_{n}}{n} =
= \bar{x}_{n-1} + \frac{1}{n}(x_{n} - \bar{x}_{n-1})

Come è possibile notare, questo algoritmo permette il calcolo della media senza avere conoscenze preliminari sul numero di elementi da analizzare, ma andando ricorsivamente ad aggiornare la media ad ogni passaggio.

La sua implementazione in un linguaggio informatico è molto semplice. Di sotto è riportata la sua scrittura in VB.net.

        'Scelgo dei voti casuali, ma posso immettere quanti e quali voti voglio
        Dim Voti As Integer() = {1, 5, 9, 25}
        Dim Lista As New List(Of Integer)(Voti)
        Dim mean As Double = 0
        Dim count As Integer = 0

        For Each Voto As Integer In Lista
            count += 1
            mean = ((count - 1) * mean + Voto) / count
        Next
     

4 risposte a "Algoritmo di Knuth"

Lascia un commento