Редактировать: Поскольку кажется, что никто не читает первоначальный вопрос, на который он ссылается, позвольте мне привести его краткий обзор здесь.
Первоначальная проблема, заданная кем-то другим, заключалась в том, что, учитывая большое количество значений, где сумма будет превышать то, что будет иметь тип данных Double
, как можно вычислить среднее значение этих значений.
Было несколько ответов, в которых говорилось, что нужно вычислять в наборах, например, взять 50 и 50 чисел и вычислить среднее значение внутри этих наборов, а затем, наконец, взять среднее из всех этих наборов и объединить их, чтобы получить окончательное среднее значение.
Моя позиция заключалась в том, что, если вы не можете гарантировать, что все эти значения могут быть разбиты на несколько наборов одинакового размера , вы не сможете использовать этот подход. Кто-то посмел мне задать вопрос здесь, чтобы дать ответ, вот он.
В основном, при произвольном количестве значений, где:
- Я знаю количество значений заранее (но опять же, как бы изменился ваш ответ, если бы вы этого не сделали? `)
- Я не могу собрать все числа и не могу их сложить (сумма будет слишком большой для обычного типа данных на вашем языке программирования)
как рассчитать среднее?
Остальная часть вопроса здесь описывает, как и проблемы с подходом к разделению на наборы одинакового размера, но мне бы очень хотелось узнать, как вы можете это сделать.
Обратите внимание, что я достаточно хорошо знаю математику, чтобы знать, что в терминах математической теории вычисление суммы A[1..N]/N
даст мне среднее значение, давайте предположим, что есть причины, по которым это не так просто, и мне нужно разделить рабочую нагрузку, и что число значений не обязательно будет делиться на 3, 7, 50, 1000 или что-то еще.
Другими словами, решение, которое я ищу, должно быть общим.
Из этого вопроса:
Моя позиция заключалась в том, что разбивать рабочую нагрузку на наборы бесполезно, если только вы не можете гарантировать, что размер этих наборов равен.
Редактировать : Первоначальный вопрос касался верхнего предела, который мог содержать конкретный тип данных, и поскольку он суммировал много чисел (в качестве примера было приведено 10 ^ 9), тип данных не может содержать сумму. Поскольку это было проблемой в исходном решении, я предполагаю (и это является обязательным условием для моего вопроса, извините, что пропустил это), что цифры слишком велики, чтобы давать какие-либо значимые ответы.
Итак, деление на общее количество значений напрямую отсутствует. Первоначальная причина, по которой было выбрано нормальное решение SUM / COUNT, заключалась в том, что SUM переполняется, но давайте предположим, что для этого вопроса SET-SET / SET-SIZE будет недопустимым, или что-то еще.
Важной частью является то, что я не могу просто сложить, я не могу просто разделить на количество общих значений. Если я не могу этого сделать, сработает ли мой подход или нет, и что я могу сделать, чтобы это исправить?
Позвольте мне изложить проблему.
Предположим, вы собираетесь вычислить среднее число от 1 до 6, но вы не можете (по какой-либо причине) сделать это путем суммирования чисел, подсчета чисел, а затем деления суммы на количество. Другими словами, вы не можете просто сделать (1 + 2 + 3 + 4 + 5 + 6) /6.
Другими словами, SUM(1..6)/COUNT(1..6)
отсутствует. Мы не рассматриваем NULL (как в базе данных NULL) здесь.
Некоторые из ответов на этот вопрос ссылались на возможность разбить усредняемые числа на наборы, скажем, 3 или 50 или 1000 чисел, затем вычислить некоторое число для этого и затем, наконец, объединить эти значения, чтобы получить окончательное среднее.
Моя позиция заключается в том, что это невозможно в общем случае, так как это приведет к тому, что некоторые числа, появившиеся в последнем наборе, будут более или менее ценными, чем все в предыдущих наборах, если только вы не сможете разделить все числа в наборы одинакового размера.
Например, чтобы вычислить среднее значение 1-6, вы можете разделить его на наборы из 3 чисел, например:
/ 1 2 3 \ / 4 5 6 \
| - + - + - | + | - + - + - |
\ 3 3 3 / \ 3 3 3 / <-- 3 because 3 numbers in the set
---------- -----------
2 2 <-- 2 because 2 equally sized groups
Что дает вам это:
2 5
- + - = 3.5
2 2
(примечание: (1 + 2 + 3 + 4 + 5 + 6) / 6 = 3,5, так что здесь все правильно)
Однако, я хочу сказать, что если число значений не может быть разделено на множество наборов одинакового размера, этот метод не работает. Например, как насчет последовательности 1-7, которая содержит простое число значений.
Может ли подобный подход, который не будет суммировать все значений и считать все значений, за один раз, сработает?
Так есть ли такой подход? Как рассчитать среднее для произвольного числа значений, в которых выполняется следующее:
- По какой-то причине я не могу использовать нормальный метод суммирования / подсчета
- Я заранее знаю количество значений (что, если я не знаю, изменит ли это ответ?)