我的语言是PHP,但算法应该相当普遍。
我有一个关联数组(比方说)评级和给出评分的次数。
$ratings = array(
1 => 1,
2 => 3,
3 => 6,
4 => 3,
5 => 3
);
这相当于:[1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5]
,但考虑到我正在使用的数字,从第一种形式转换为第二种形式是非常低效的。
计算上述数字平均值的算法是什么?
答案 0 :(得分:17)
试试这个:
$total = 0;
$count = 0;
foreach($ratings as $number=>$frequency) {
$total += $number * $frequency;
$count += $frequency;
}
return $total / $count;
答案 1 :(得分:10)
这不会起作用吗?
$total = 0;
$sum = 0;
foreach ($ratings as $k => $v) {
$total += $k * $v;
$sum += $v;
}
echo $total / $sum;
编辑:嗯,我看起来很傻,因为有人打败了我。哦,好吧。
答案 2 :(得分:3)
怀疑我可以击败接受的答案,但我发现内置循环函数比脚本循环运行得更快。不确定对$ multiply的调用将如何优化。如果这真的很慢,那么我希望有人会在评论中指出它。
function multiply( $k , $v ) { return $k * $v; }
return array_sum( array_map( 'multiply' , array_keys($ratings) , $ratings ) ) / array_sum( $ratings );