sort bubble best algorithms algorithm sorting ranking

algorithm - bubble - Algoritmo de contenido caliente/puntuación con decaimiento del tiempo



sorting algorithms comparison (1)

Fórmula antigua de Reddits y un pequeño drop off.

Básicamente puedes usar la fórmula de Reddit. Ya que su sistema solo soporta upvotes, puede ponderarlos, resultando en algo como esto:

def hotness(track) s = track.playedCount s = s + 2*track.downloadCount s = s + 3*track.likeCount s = s + 4*track.favCount baseScore = log(max(s,1)) timeDiff = (now - track.uploaded).toWeeks if(timeDiff > 1) x = timeDiff - 1 baseScore = baseScore * exp(-8*x*x) return baseScore

El factor exp(-8*x*x) le dará su entrega deseada:

Los fundamentos detrás

Puedes usar cualquier función que vaya a cero más rápido de lo que tu puntaje aumenta. Como utilizamos el log en nuestra puntuación, incluso una función lineal puede multiplicarse (siempre que su puntuación no crezca exponencialmente).

Entonces, todo lo que necesita es una función que devuelva 1 siempre y cuando no desee modificar la puntuación, y luego se reduzca. Nuestro ejemplo anterior forma esa función:

multiplier(x) = x > 1 ? exp(-8*x*x) : 1

Puedes variar el multiplicador si quieres curvas menos pronunciadas.

Ejemplo en C ++

Digamos que la probabilidad de que una pista determinada se reproduzca en una hora determinada es del 50%, descargue el 10%, como el 1% y el 0,1% favorito. Luego, el siguiente programa de C ++ le dará una estimación del comportamiento de sus puntuaciones:

#include <iostream> #include <fstream> #include <random> #include <ctime> #include <cmath> struct track{ track() : uploadTime(0),playCount(0),downCount(0),likeCount(0),faveCount(0){} std::time_t uploadTime; unsigned int playCount; unsigned int downCount; unsigned int likeCount; unsigned int faveCount; void addPlay(unsigned int n = 1){ playCount += n;} void addDown(unsigned int n = 1){ downCount += n;} void addLike(unsigned int n = 1){ likeCount += n;} void addFave(unsigned int n = 1){ faveCount += n;} unsigned int baseScore(){ return playCount + 2 * downCount + 3 * likeCount + 4 * faveCount; } }; int main(){ track test; const unsigned int dayLength = 24 * 3600; const unsigned int weekLength = dayLength * 7; std::mt19937 gen(std::time(0)); std::bernoulli_distribution playProb(0.5); std::bernoulli_distribution downProb(0.1); std::bernoulli_distribution likeProb(0.01); std::bernoulli_distribution faveProb(0.001); std::ofstream fakeRecord("fakeRecord.dat"); std::ofstream fakeRecordDecay("fakeRecordDecay.dat"); for(unsigned int i = 0; i < weekLength * 3; i += 3600){ test.addPlay(playProb(gen)); test.addDown(downProb(gen)); test.addLike(likeProb(gen)); test.addFave(faveProb(gen)); double baseScore = std::log(std::max<unsigned int>(1,test.baseScore())); double timePoint = static_cast<double>(i)/weekLength; fakeRecord << timePoint << " " << baseScore << std::endl; if(timePoint > 1){ double x = timePoint - 1; fakeRecordDecay << timePoint << " " << (baseScore * std::exp(-8*x*x)) << std::endl; } else fakeRecordDecay << timePoint << " " << baseScore << std::endl; } return 0; }

Resultado:

Esto debería ser suficiente para ti.

He estado leyendo + investigando en algoritmos y fórmulas para elaborar una puntuación para el contenido enviado por mi usuario para mostrar los artículos actuales más destacados de la lista, sin embargo, debo admitir que estoy un poco por encima de mi cabeza aquí.

Daré algunos antecedentes sobre lo que busco ... los usuarios cargan audio a mi sitio, los audios tienen varias acciones:

  • Jugó
  • Descargado
  • Gustó
  • Favorecido

Lo ideal es que quiera un algoritmo donde pueda actualizar la puntuación de un audio cada vez que se registre una nueva actividad (reproducido, descargado, etc.). También una acción de descarga vale más que un juego, como más que una descarga y un favorito más que a me gusta

Si es posible, me gustaría que los audios de más de 1 semana salgan bastante de la lista para dar al contenido más reciente la posibilidad de tendencias.

He leído sobre el algoritmo de reddits que se veía bien, pero no sé cómo modificarlo para usar mis múltiples variables y dejar los artículos más antiguos después de unos 7 días.

Algunos artículos que nos interesan:

Cualquier ayuda es apreciada!

Pablo