मेरे पास फ्लोट्स की एक सरणी है, जो सबसे छोटी से लेकर सबसे बड़ी क्रमबद्ध है, और पास किए गए इनपुट मान से अधिक या उससे कम निकटतम फ़्लोट को चुनने में सक्षम होने की आवश्यकता है। यह इनपुट मान आवश्यक रूप से सरणी में मान के रूप में मौजूद नहीं है।
एक भोली दृष्टिकोण सरणी के माध्यम से एक सरल रैखिक खोज करना होगा। यह इस तरह लग सकता है:
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 "।
मैं इस ऑपरेशन को सैकड़ों हजारों बार कर रहा हूं, लेकिन मैं फ्लोट्स की सरणी पर किसी भी पूर्व-प्रसंस्करण की मात्रा कर सकता हूं, अगर यह लुकअप समय में सुधार करेगा। मैं बिल्कुल उन्हें स्टोर करने के लिए एक वेक्टर के अलावा किसी अन्य चीज़ का उपयोग करने के लिए बदल सकता हूं, अगर वह मदद करेगा।