Привет!
Я размышляю на тему нестандартного алгоритма сортировки постов в ленте. Сейчас я использую алгоритм на примере Reddit:
package main
import (
"fmt"
"math"
)
/**
* Округление числа "x" точностью "precision"
*/
func Round(x float64, precision int) float64 {
shift := math.Pow(10, float64(precision))
return math.Floor((x * shift) + 0.5) / shift;
}
/**
* Расчет "жары" по голосам и времени публикации
*/
func Hotness(upvoices int, downvoices int, timestamp int) float64 {
score := upvoices - downvoices
order := math.Log10(math.Max(math.Abs(float64(score)), 1.0))
sign := 0.0
if score > 0 {
sign = 1.0
} else if score < 0 {
sign = -1.0
}
damping := float64(60 * 60 * 48)
seconds := float64(timestamp - 1433102400)
return Round((order * sign) + (seconds / damping), 7)
}
func main() {
fmt.Println("1) 0: ", Hotness(0,0, 1433416040), "time start")
fmt.Println("2) -5: ", Hotness(0,5, 1433412440), "+1 hour")
fmt.Println("3) +5: ", Hotness(5,0, 1433408840), "+2 hour")
fmt.Println("4) +10:", Hotness(10,0, 1433405240), "+3 hour")
fmt.Println("5) 0: ", Hotness(0,0, 1433401640), "+4 hour")
}
Он хорошо подходит, если ваша лента состоит только из горячих постов, скажем постов набравших определенный рейтинг.
Мне бы хотелось иметь более универсальную ленту, в которой новые посты держатся наверху и если за них никто не голосует, они потихоньку опускаются вниз, освобождая место более рейтинговым постам.
Другими словами, например, новый пост держится наверху ленты 15 минут, если он никому не интересен, то он опускается вниз и потихоньку уходит в глубину ленты.
Может у вас есть соображения на эту тему?