Tôi cần một thuật toán tìm kiếm nhị phân được tối ưu hóa trên một dãy số được sắp xếp. Tôi đã làm điều này và thấy rằng việc sử dụng phao đến các số cửa hàng là nhanh hơn so với sử dụng nguyên, bởi vì cuối cùng tôi phải tính toánSo sánh mảng nổi với mảng int
(frameNumber-this->frameNumber[imin])/(this->frameNumber[imax]-this->frameNumber[imin])
this->frameNumber[imin]
là frameNumber lớn nhất ít bình đẳng mà frameNumber
và this->frameNumber[imax]
là nhỏ nhất lớn hơn bình đẳng hơn cái đó. Mã đó là để tính toán tiến độ giữa hai khung hình chính đó. mảng frameNumber là tĩnh. Tôi chỉ phải sắp xếp nó một lần. Nhưng truy cập nó nhiều lần với tìm kiếm nhị phân và mã trên để tính toán tiến độ.
Chuyển đổi từ int sang float đã dành một số chu kỳ. Sau đó, tôi phát hiện ra rằng trong asm có rất nhiều hướng dẫn fpu. Tôi lo rằng chúng có thể chậm hơn số nguyên.
Vì vậy, đây là câu hỏi. Tôi có thể chuyển đổi một mảng các số dấu chấm động đã sắp xếp thành một int * và chạy tìm kiếm nhị phân trên nó không?
Điều đó có nghĩa:
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,...);
}
Hoặc kết luận trên của tôi là sai? (Chẳng hạn như đúc int nổi không phải là quá costy, hoặc so sánh giữa các điểm nổi là như nhau nhanh như số nguyên?
Thanks a lot!
Câu hỏi của bạn không rõ ràng, nhưng câu trả lời thẳng là không, bạn không thể chuyển đổi một mảng như thế này. – Amit
Thông thường, điều này sẽ không hoạt động - nó sẽ giải thích các bit của mỗi phần tử dưới dạng int thay vì phao. Tuy nhiên, có một quirk thú vị với điểm nổi IEEE mà chúng giữ nguyên thứ tự nếu được hiểu là các số nguyên có cùng độ dài. Vì vậy, tìm kiếm nhị phân của bạn có thể thực sự hoạt động nếu 'sizeof (int) == sizeof (float)' trên hệ thống của bạn và không có giá trị nào là NaN. Nhưng nó không được đảm bảo bởi các tiêu chuẩn C hoặc C++. – rlbond
Nó cũng không hoạt động với số âm. – fangzhangmnm