Ağırlıklı ortalamayı hesaplamak için nasıl?

3 Cevap php

Benim dil PHP, ancak algoritma oldukça evrensel olmalıdır.

Ben yorumu ve kaç kez bu reyting verildi (diyelim) bir ilişkisel dizi var.

$ratings = array(
    1 => 1,
    2 => 3,
    3 => 6,
    4 => 3,
    5 => 3
);

Bu eşdeğerdir: [1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5], ama ben çalışıyorum numaraları verilmiş, bu ikinci ilk forma dönüştürmek için oldukça verimsiz olacaktır.

Ne Yukarıdaki sayıların ortalamasını hesaplamak için algoritma olurdu?

3 Cevap

Bu deneyin:

$total = 0;
$count = 0;
foreach($ratings as $number=>$frequency) {
  $total += $number * $frequency;
  $count += $frequency;
}
return $total / $count;

Bu işe değil misiniz?

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

EDIT: biri beni dövdü beri Eh, ben, aptal görünüyorsun. Oh iyi.

Şüphesiz ben kabul cevabını yenebilir, ama ben daha hızlı senaryosunu döngüler daha fonksiyonları döngü içinde çalışacaktır inşa bulabilirsiniz. Değil çarpma $ için aramalar optimize olacak kadar iyi olduğundan emin. Bu gerçekten yavaş ise o zaman birisi bir yorumda onu işaret bekliyoruz.

function multiply( $k , $v ) { return $k * $v; }
return array_sum( array_map( 'multiply' , array_keys($ratings) , $ratings ) ) / array_sum( $ratings );