4

我的语言是 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],但考虑到我正在使用的数字,从第一种形式转换为第二种形式效率很低。

计算上述数字的平均值的算法是什么?

4

3 回答 3

17

试试这个:

$total = 0;
$count = 0;
foreach($ratings as $number=>$frequency) {
  $total += $number * $frequency;
  $count += $frequency;
}
return $total / $count;
于 2009-01-29T03:10:44.807 回答
10

这不行吗?

$total = 0;
$sum = 0;
foreach ($ratings as $k => $v) {
  $total += $k * $v;
  $sum += $v;
}
echo $total / $sum;

编辑:好吧,我看起来很傻,因为有人打败了我。那好吧。

于 2009-01-29T03:13:19.213 回答
3

怀疑我可以击败公认的答案,但我发现内置循环函数比脚本循环运行得更快。不确定对 $multiply 的调用将如何优化。如果这真的很慢,那么我希望有人会在评论中指出。

function multiply( $k , $v ) { return $k * $v; }
return array_sum( array_map( 'multiply' , array_keys($ratings) , $ratings ) ) / array_sum( $ratings );
于 2009-01-29T04:04:56.567 回答