Ich brauche einen optimierten binären Suchalgorithmus auf einem Array von sortierten Zahlen. Ich tat dies und stellte fest, dass zum Speichern von Zahlen mit Schwimmer ist schneller als ganze Zahl verwenden, weil am Ende iVergleichen Float-Array als int-Array
(frameNumber-this->frameNumber[imin])/(this->frameNumber[imax]-this->frameNumber[imin])
this->frameNumber[imin]
berechnen muss, ist der größte framenumber weniger gleich, dass frameNumber
und this->frameNumber[imax]
ist die kleinste größer gleich als Das. Dieser Code soll den Fortschritt zwischen diesen beiden Keyframes berechnen. Das frameNumber-Array ist statisch. Ich muss es nur einmal sortieren. Aber greifen Sie mehrmals darauf mit einer binären Suche und dem obigen Code zu, um den Fortschritt zu berechnen.
Die Konvertierung von int nach float verbrachte einige Zyklen. Dann entdeckte ich, dass in der asm eine Menge von fpu Anweisungen. Ich mache mir Sorgen, dass sie langsamer als Integer sind.
Also hier ist die Frage. Kann ich ein Array von sortierten Fließkommazahlen in ein int * umwandeln und eine binäre Suche darauf ausführen?
Das heißt:
void binary_search(float key,float* array,...)
{
int key_integer=*(int*)&key;
int* array_intege(int*)array;
binary_search_for_integers(key_integer,array_integer,...);
}
Oder meine obige Schlussfolgerung falsch sind? (Wie Gießen int zu schwimmen ist nicht so costy oder Vergleich zwischen floating Punkten ist das gleiche schnell wie ganze Zahlen?
Vielen Dank!
Ihre Frage ist nicht klar, aber die direkte Antwort ist nein, Sie können ein Array nicht so konvertieren. – Amit
Normalerweise wird dies nicht funktionieren - es wird die Bits jedes Elements als Ints anstelle von Floats interpretieren. Es gibt jedoch eine interessante Eigenart mit IEEE Fließkomma, dass sie die Reihenfolge beibehalten, wenn sie als Ganzzahlen gleicher Länge interpretiert werden. Ihre binäre Suche könnte also funktionieren, wenn 'sizeof (int) == sizeof (float)' auf Ihrem System und keiner der Werte NaN ist. Aber es ist nicht durch die C oder C++ Standards garantiert. – rlbond
Es funktioniert auch nicht für negative Zahlen. – fangzhangmnm