Ci sono un sacco di suggested algorithms per il calcolo della popolarità in base all'età di un articolo e il numero di voti, clic o acquisti ricevuti da un articolo. Tuttavia, i metodi più robusti che ho visto richiedono spesso calcoli eccessivamente complessi e più valori memorizzati che ingombrano il database. Stavo pensando ad un algoritmo estremamente semplice che non richiede la memorizzazione di variabili (oltre al valore di popolarità stesso) e richiede solo un semplice calcolo. E 'ridicolmente semplice:Algoritmo di semplice popolarità
p = (p + t)/2
Qui, p è il valore di popolarità memorizzato nel database e t è il timestamp corrente. Quando viene creato per la prima volta un articolo, è necessario inizializzare p. Ci sono due possibili metodi di inizializzazione:
- Inizializza p con il timestamp corrente t
- Inizializza p con la media di tutti p valori nel database
Note quel metodo di inizializzazione (1) dà agli articoli aggiunti di recente un chiaro vantaggio rispetto agli articoli storici, aggiungendo così un elemento di relevan ce. D'altra parte, il metodo di inizializzazione (2) tratta i nuovi elementi come uguali rispetto agli elementi storici.
Supponiamo di utilizzare il metodo di inizializzazione (1) e di inizializzare p con il timestamp corrente. Quando l'elemento riceve il suo primo voto, p diventa la media del tempo di creazione e del tempo di votazione. Pertanto, il valore di popolarità p rappresenta ancora un timestamp valido (assumendo il numero intero più vicino), ma il tempo effettivo che rappresenta è astratto.
Con questo metodo, è richiesto solo un semplice calcolo e nel database deve essere memorizzato solo un valore (p). Questo metodo impedisce anche i valori di fuga, dal momento che la popolarità di un dato oggetto non può mai superare l'ora corrente.
Un esempio dell'algoritmo sul posto di lavoro per un periodo di 1 giorno: http://jsfiddle.net/q2UCn/
Un esempio dell'algoritmo sul posto di lavoro per un periodo di 1 anno: http://jsfiddle.net/tWU9y/
Se vi aspettate voti a flusso costantemente nel livello sub -secondi intervalli, quindi sarà necessario utilizzare un timestamp di microsecondi, ad esempio la funzione PHP microtime()
. In caso contrario, funzionerà un timestamp UNIX standard, ad esempio la funzione PHP time()
.
Ora per la mia domanda: vedi qualche grave difetto con questo approccio?
Se si consente alle persone di "diversamente" elementi, questo non richiede * solo * la memorizzazione di p nel database. Devi anche archiviare un record di ogni Mi piace che sia mai stato fatto. Altrimenti, un utente può "Mi piace", "Unlike", "Mi piace" e "Unlike", ancora e ancora, per gonfiare il proprio voto. Come hai detto, vuoi solo cambiare l'elemento p quando riceve il suo primo voto. Significa che devi tenere traccia di tutti i voti. –
@AlSweigart buon punto. Questo algoritmo è probabilmente appropriato solo per i sistemi di votazione unidirezionale (ad esempio, una visualizzazione di pagina è un "voto" nella direzione positiva ). Probabilmente è meno compatibile con i sistemi di voto bidirezionale. –