Я знаю аналогичный вопрос, но я хочу попросить мнение людей о моем алгоритме как можно точнее суммировать числа с плавающей запятой с практическими затратами.
Вот мое первое решение:
put all numbers into a min-absolute-heap. // EDIT as told by comments below
pop the 2 smallest ones.
add them.
put the result back into the heap.
continue until there is only 1 number in the heap.
Это будет принимать O (n * logn) вместо нормального O (n). Это действительно стоит?
Второе решение исходит из характеристики данных, над которыми я работаю. Это огромный список положительных чисел с аналогичным порядком величины.
a[size]; // contains numbers, start at index 0
for(step = 1; step < size; step<<=1)
for(i = step-1; i+step<size; i+=2*step)
a[i+step] += a[i];
if(i < size-1)
a[size-1] += a[i];
Основная идея состоит в том, чтобы делать сумму в двоичном древе.
Примечание: это псевдо-код. step<<=1
означает умножить шаг на 2.
Это возьмет O (n).
Я чувствую, что может быть лучший подход. Можете ли вы порекомендовать/критиковать?