Załóżmy, że mamy N liczb (liczb całkowitych, pływaków, cokolwiek chcesz) i chcesz znaleźć ich średnią arytmetyczną. Najprostszą metodą jest zsumowanie wszystkich wartości i podzielenie przez liczbę wartości:Czy istnieje sposób na znalezienie średniej arytmetycznej "lepszej" niż suma()/N?
def simple_mean(array[N]): # pseudocode
sum = 0
for i = 1 to N
sum += array[i]
return sum/N
Działa dobrze, ale wymaga dużych liczb całkowitych. Jeśli nie chcemy dużych liczb całkowitych i mamy problemy z błędami zaokrąglania, a N jest potęgą dwóch, możemy użyć "dziel i rządź": ((a+b)/2 + (c+d)/2)/2 = (a+b+c+d)/4
, ((a+b+c+d)/4 + (e+f+g+h)/4)/2 = (a+b+c+d+e+f+g+h)/8
, i tak dalej.
def bisection_average(array[N]):
if N == 1: return array[1]
return (bisection_average(array[:N/2])+bisection_average(array[N/2:]))/2
Jakieś inne sposoby?
Interesujące, ale to trochę o "porządku z błędami zaokrągleń" martwi mnie. Wolałbym metodę bez ŻADNYCH błędów. – pavium
W drugiej chwili, wrócę do tego rano i rozwiążę moją odpowiedź, jeśli nadal jestem szczęśliwy, że to nie jest bardzo źle ... –
@pavium: jeśli chcesz metodę bez ŻADNYCH błędów, musisz obliczyć to ręcznie. – MusiGenesis