फाइबोनैचि खोज तकनीक

कंप्यूटर विज्ञान में, फाइबोनैचि खोज तकनीक एक विभाजन और जीत एल्गोरिदम का उपयोग करके क्रमबद्ध सरणी को खोजने की एक विधि है जो फाइबोनैचि संख्याओं की सहायता से संभावित स्थानों को सीमित करती है। बाइनरी खोज एल्गोरिदम की तुलना में जहां क्रमबद्ध सरणी को दो समान आकार के भागों में विभाजित किया जाता है, जिनमें से एक की आगे जांच की जाती है, फाइबोनैचि खोज सरणी को दो भागों में विभाजित करती है जिनके आकार लगातार फाइबोनैचि संख्या होते हैं। औसतन, इससे लगभग 4% अधिक तुलनाएँ क्रियान्वित की जाती हैं, लेकिन इसका फायदा यह है कि किसी को एक्सेस किए गए सरणी तत्वों के सूचकांकों की गणना करने के लिए केवल जोड़ और घटाव की आवश्यकता होती है, जबकि शास्त्रीय बाइनरी खोज के लिए बिट-शिफ्ट (बिटवाइज़ ऑपरेशन देखें), विभाजन या गुणा की आवश्यकता होती है। फाइबोनैचि खोज के पहली बार प्रकाशित होने के समय जो ऑपरेशन कम आम थे। फाइबोनैचि खोज में O(लॉग एन) की औसत और सबसे खराब स्थिति वाली जटिलता है ( बिग ओ अंकन देखें)।

फाइबोनैचि अनुक्रम में यह गुण होता है कि एक संख्या अपने दो पूर्ववर्तियों का योग होती है। इसलिए अनुक्रम की गणना बार-बार जोड़कर की जा सकती है। दो लगातार संख्याओं का अनुपात स्वर्णिम अनुपात, 1.618 के करीब पहुंचता है... बाइनरी खोज खोज क्षेत्र को समान भागों (1:1) में विभाजित करके काम करती है। फाइबोनैचि खोज सरल ऑपरेशनों का उपयोग करते हुए इसे 1:1.618 तक पहुंचने वाले भागों में विभाजित कर सकती है।

यदि खोजे जा रहे तत्वों में गैर-समान एक्सेस मेमोरी स्टोरेज है (यानी, स्टोरेज स्थान तक पहुंचने के लिए आवश्यक समय एक्सेस किए गए स्थान के आधार पर भिन्न होता है), तो फाइबोनैचि खोज को एक्सेस करने के लिए आवश्यक औसत समय को थोड़ा कम करने में बाइनरी खोज पर लाभ हो सकता है एक भंडारण स्थान. यदि खोज निष्पादित करने वाली मशीन में सीधे मैप किया गया सीपीयू कैश है, तो बाइनरी खोज से अधिक कैश मिस हो सकता है क्योंकि जिन तत्वों तक पहुंच होती है वे अक्सर केवल कुछ कैश लाइनों में एकत्रित होते हैं; इसे सरणी को ऐसे भागों में विभाजित करके कम किया जाता है जिनमें दो की शक्तियाँ नहीं होती हैं। यदि डेटा को चुंबकीय टेप डेटा स्टोरेज पर संग्रहीत किया जाता है, जहां खोज समय वर्तमान प्रमुख स्थिति पर निर्भर करता है, तो लंबे समय तक खोज समय और अधिक तुलनाओं के बीच एक ट्रेडऑफ एक खोज एल्गोरिदम को जन्म दे सकता है जो फाइबोनैचि खोज के समान ही तिरछा है।

फाइबोनैचि खोज स्वर्ण खंड खोज  से ली गई है, जो एक अंतराल में एक यूनिमॉडल फ़ंक्शन के अधिकतम या न्यूनतम की खोज के लिए जैक किफ़र (सांख्यिकीविद्) (1953) द्वारा एक एल्गोरिदम है।

एल्गोरिदम
मान लीजिए कि k को फाइबोनैचि संख्याओं की सारणी F में एक तत्व के रूप में परिभाषित किया गया है। एन = एफmसरणी का आकार है. यदि n एक फाइबोनैचि संख्या नहीं है, तो मान लीजिए FmF में वह सबसे छोटी संख्या हो जो n से बड़ी हो।

फाइबोनैचि संख्याओं की सारणी को परिभाषित किया गया है जहां एफk+2 = एफk+1+ एफk, जब k ≥ 0, F1 = 1, और एफ0= 1.

यह जांचने के लिए कि कोई आइटम क्रमित संख्याओं की सूची में है या नहीं, इन चरणों का पालन करें:


 * 1) सेट के = एम.
 * 2) यदि k = 0 है, तो रुकें। कोई मेल नहीं है; आइटम सरणी में नहीं है.
 * 3) एफ में तत्व के साथ आइटम की तुलना करेंk−1.
 * 4) यदि आइटम मेल खाता है, तो रुकें।
 * 5) यदि आइटम प्रविष्टि F से कम हैk−1, स्थिति F से तत्वों को हटा देंk−1+ 1 से एन. k = k −1 सेट करें और चरण 2 पर वापस लौटें।
 * 6) यदि आइटम प्रविष्टि F से बड़ा हैk−1, स्थिति 1 से F तक के तत्वों को हटा देंk−1. शेष तत्वों को 1 से F तक पुनः क्रमांकित करेंk−2, k = k − 2 सेट करें, और चरण 2 पर वापस लौटें।

वैकल्पिक कार्यान्वयन (नुथ द्वारा सॉर्टिंग और सर्चिंग से)। ):

अभिलेखों की एक तालिका दी गई आर1, आर2, ..., आरNजिनकी कुंजियाँ बढ़ते क्रम में K हैं1< के2< ... < केN, एल्गोरिथम किसी दिए गए तर्क K की खोज करता है। मान लें N+1 = Fk+1 चरण 1. [आरंभ करें] i ← Fk, पी ← एफk-1, क्यू ← एफk-2 (पूरे एल्गोरिथम में, पी और क्यू लगातार फाइबोनैचि संख्याएं होंगी)

'चरण दो।' [तुलना करें] यदि K < Ki, चरण 3 पर जाएँ; यदि K > Kiचरण 4 पर जाएँ; और यदि K = Ki, एल्गोरिथम सफलतापूर्वक समाप्त हो जाता है।

'चरण 3।' [कमी करें i] यदि q=0, एल्गोरिथ्म असफल रूप से समाप्त हो जाता है। अन्यथा सेट करें (i, p, q) ← (i - q, q, p - q) (जो p और q को फाइबोनैचि अनुक्रम में एक स्थान पीछे ले जाता है); फिर चरण 2 पर वापस लौटें

'चरण 4।' [I बढ़ाएँ] यदि p=1, एल्गोरिथ्म असफल रूप से समाप्त हो जाता है। अन्यथा सेट करें (i,p,q) ← (i + q, p - q, 2q - p) (जो फाइबोनैचि अनुक्रम में p और q को दो स्थान पीछे ले जाता है); और चरण 2 पर वापस लौटें

ऊपर प्रस्तुत एल्गोरिदम के दो प्रकार हमेशा वर्तमान अंतराल को बड़े और छोटे उपअंतराल में विभाजित करते हैं। मूल एल्गोरिथ्म, हालाँकि, चरण 4 में नए अंतराल को छोटे और बड़े उपअंतराल में विभाजित किया जाएगा। इसका फायदा यह है कि नया i पुराने i के करीब है और चुंबकीय टेप पर खोज को तेज करने के लिए अधिक उपयुक्त है।

यह भी देखें

 * खोज एल्गोरिदम

संदर्भ

 * Implements the above algorithm (not Ferguson's original one).