Tôi có một mảng các số float, được sắp xếp từ nhỏ nhất đến lớn nhất và cần có thể chọn ra số float gần nhất lớn hơn hoặc nhỏ hơn một giá trị đầu vào được truyền. Giá trị đầu vào này không nhất thiết phải là một giá trị trong mảng.
Một cách tiếp cận ngây thơ sẽ là thực hiện một tìm kiếm tuyến tính đơn giản thông qua mảng. Điều đó có thể trông như thế này:
void FindClosestFloatsInArray( float input, std::vector<float> array,
float *min_out, float *max_out )
{
assert( input >= array[0] && input < array[ array.size()-1 ] );
for( int i = 1; i < array.size(); i++ )
{
if ( array[i] >= input )
{
*min = array[i-1];
*max = array[i];
}
}
}
Nhưng rõ ràng là khi mảng trở nên lớn hơn, điều này sẽ trở nên chậm hơn và chậm hơn.
Có ai có ý tưởng về một thuật toán cho phép tôi tìm dữ liệu này tối ưu hơn không? Tôi đã chuyển sang tìm kiếm nhị phân, điều này đã cải thiện phần nào vấn đề, nhưng nó vẫn chậm hơn rất nhiều so với tôi muốn và vì tôi không thực sự tìm kiếm một giá trị cụ thể tồn tại trong mảng, nên nó không bao giờ có thể chấm dứt sớm.
Thông tin thêm: Các giá trị dấu phẩy động trong mảng không nhất thiết phải được phân phối đồng đều (nghĩa là mảng có thể bao gồm các giá trị "1.f, 2.f, 3.f, 4.f, 100.f, 1200.f , 1203.f, 1400.f ".
Tôi đang thực hiện thao tác này hàng trăm ngàn lần, nhưng tôi có thể thực hiện bất kỳ số lượng tiền xử lý nào trên mảng phao, nếu nó sẽ cải thiện thời gian tra cứu. Tôi hoàn toàn có thể thay đổi để sử dụng một cái gì đó ngoài một vectơ để lưu trữ chúng, nếu điều đó sẽ giúp ích.