ฉันมีอาร์เรย์ของลอยเรียงจากที่เล็กที่สุดไปหามากที่สุดและต้องสามารถเลือกลอยที่ใกล้ที่สุดที่มากกว่าหรือน้อยกว่าค่าอินพุตที่ผ่าน ค่าอินพุตนี้ไม่จำเป็นต้องแสดงเป็นค่าในอาร์เรย์
แนวทางที่ไร้เดียงสาคือการค้นหาเชิงเส้นอย่างง่ายผ่านอาร์เรย์ ที่อาจมีลักษณะเช่นนี้:
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];
}
}
}
แต่เห็นได้ชัดว่าเมื่ออาร์เรย์มีขนาดใหญ่ขึ้นสิ่งนี้จะช้าลงเรื่อย ๆ
ใครบ้างมีความคิดเกี่ยวกับอัลกอริทึมที่จะให้ฉันค้นหาข้อมูลนี้ได้อย่างเหมาะสมที่สุด? ฉันได้เปลี่ยนไปใช้การค้นหาแบบไบนารีแล้วซึ่งมีการปรับปรุงเรื่องบ้าง แต่ก็ยังช้ากว่าที่ฉันต้องการและเนื่องจากฉันไม่ได้มองหาค่าเฉพาะที่มีอยู่ในอาร์เรย์จึงไม่สามารถยุติได้ ตอนต้น
ข้อมูลเพิ่มเติม: ค่าทศนิยมในอาร์เรย์ไม่จำเป็นต้องกระจายอย่างสม่ำเสมอ (นั่นคืออาร์เรย์อาจประกอบด้วยค่า "1.f, 2.f, 3.f, 4.f, 100.f, 1200.f , 1203.f, 1400.f "
ฉันใช้การดำเนินการนี้หลายร้อยหลายพันครั้ง แต่ฉันสามารถทำการประมวลผลล่วงหน้าจำนวนมากในอาร์เรย์ของโฟลตถ้ามันจะปรับปรุงเวลาการค้นหา ฉันสามารถเปลี่ยนไปใช้บางอย่างที่ไม่ใช่เวกเตอร์เพื่อจัดเก็บได้หากมันจะช่วยได้