Der absolut optimale Weg ist, eine Prioritätswarteschlange zu verwenden, in der folgenden Art und Weise:
PriorityQueue<Float> q = new PriorityQueue<Float>();
for(float x : list) q.add(x);
while(q.size() > 1) q.add(q.pop() + q.pop());
return q.pop();
(Dieser Code übernimmt die Zahlen positiv sind, im allgemeinen der Warteschlange sollte durch absoluten Wert bestellt werden)
Erklärung: Angesichts einer Liste von Zahlen, um sie so genau wie möglich zu addieren, sollten Sie danach streben, die Zahlen zu schließen, ti eliminiere den Unterschied zwischen kleinen und großen. Deshalb wollen Sie die beiden kleinsten Zahlen addieren und so den Minimalwert der Liste erhöhen, den Unterschied zwischen dem Minimum und Maximum in der Liste verringern und die Problemgröße um 1 reduzieren.
Leider habe ich keine Ahnung Wie kann dies vektorisiert werden, wenn man bedenkt, dass Sie OpenCL verwenden. Aber ich bin mir fast sicher, dass es so sein kann. Sie können sich das Buch über Vektoralgorithmen ansehen, es ist überraschend, wie mächtig sie tatsächlich sind: Vector Models for Data-Parallel Computing
Warum erwarten Sie, dass das Ergebnis kleiner als 1 ist? Ich bin verwirrt! – lexu
Ich denke, er sagt, dass * sobald * das Ergebnis 1,0 überschreitet, beginnen die Probleme zu entstehen. * Was * Probleme ich nicht kenne, aber so habe ich es genommen. –
Verwenden Sie in Python 'math.fsum' (http://docs.python.org/library/math.html#math.fsum). – kennytm