Intereting Posts
динамический запрос на вставку SQL Выбор из нескольких таблиц, огромный результат Тип «application / json» предотвращает отправку почтовых переменных move_uploaded_file (…): не удалось открыть поток: разрешение отклонено в … Использование Mac OS X Mountain Lion SFTP из PHP – неопределенные константы CURLOPT_PROTOCOLS и CURLPROTO_SFTP? Каков правильный способ проверить, включено ли поле бит в php Autoload php-классы из подпапок с использованием символа подчеркивания (стиль PEAR) Статус 21002 При проверке получения транзакции Система обмена сообщениями с PHP / MySQL Запретить вход в браузер кнопки «Назад» после выхода в Laravel 5 Как преобразовать строку SVG в jpg с помощью Inkscape Могу ли я индексировать переменную массива внутри строки с двойными кавычками PHP? субдомен laravel 5 перенаправлен на главную страницу вставить запрос с использованием приема петли foreach. Ошибка неактивности: вызов функции-члена execute () в булевом Почему не работает моя проверка кода CodeIgniter?

Как рассчитать взвешенное среднее?

Мой язык – это 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] , но с учетом числа, с которым я работаю, было бы совершенно неэффективно преобразовывать из первой формы во вторую.

Каким будет алгоритм вычисления среднего числа вышеуказанных чисел?

Попробуй это:

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

Разве это не сработало бы?

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

EDIT: Ну, я выгляжу глупо, так как кто-то избил меня. Ну что ж.

Сомневаюсь, что я могу победить принятый ответ, но считаю, что встроенные функции цикла выполняются быстрее, чем скрипты. Не уверен, насколько хорошо будут оптимизированы вызовы $ multiply. Если это действительно медленно, я ожидаю, что кто-то укажет на это в комментарии.

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