वें फाइबोनैचि संख्या की गणना करने के लिए कुशल एल्गोरिदम


11

वें फिबोनैकी संख्या रैखिक समय निम्न पुनरावृत्ति का उपयोग करने में गणना की जा सकती:n

def fib(n):
    i, j = 1, 1
    for k in {1...n-1}:
        i, j = j, i+j
    return i

वें फिबोनैकी संख्या के रूप में भी की जा सकती है । हालांकि, इसके लिए अपेक्षाकृत छोटे लिए गोल मुद्दों के साथ समस्या है । वहाँ शायद इस के आसपास तरीके हैं, लेकिन मैं ऐसा नहीं करूँगा।[ φ n / nएन[φn/5]n

वहाँ एक कुशल (मूल्य में लघुगणक है एल्गोरिथ्म या बेहतर) की गणना करने के वें फिबोनैकी संख्या कि चल बिन्दु गणित पर निर्भर नहीं करता? मान लें कि पूर्ण समय में पूर्णांक संचालन ( , , , ) किया जा सकता है।n + - × /nn+×/


5
एक सुझाव के रूप में, फाइबोनैचि संख्याओं पर विकिपीडिया लेख में बहुत सारे तरीके हैं।
छद्म नाम

सीएफ stackoverflow.com/questions/14661633/… और उसके और आसपास के लिंक।
विल नेस

जवाबों:


14

आप मैट्रिक्स उपयोग कर सकते हैं और पहचान यदि आप पॉवरिंग को लागू करने के लिए बार-बार स्क्वेरिंग का उपयोग करते हैं, तो कम्प्यूटेशन के आपके मॉडल में यह एल्गोरिथ्म है।O(लॉगएन)

[1110]n=[Fn+1FnFnFn1].
O(logn)

1
यह एक क्लासिक है।
dfeuer

8
आप इस पहचान का उपयोग पुनरावृत्ति और । एफ 2 एन = एफ 2 एन + 2 एफ एन - 1 एफ एनF2n1=Fn2+Fn12F2n=Fn2+2Fn1Fn
अगुनार

4

आप इस गणितीय लेख को पढ़ सकते हैं: बड़ी फाइबोनैचि संख्या (डाइसुके ताकाहाशी) की गणना के लिए एक तेज़ एल्गोरिथम : पीडीएफ

अधिक सरल, मैंने C ++ (बिना जीएमपी के) और पायथन में कई फाइबोनैचि के एल्गोरिदम लागू किए। Bitbucket पर पूर्ण स्रोत । मुख्य पृष्ठ से आप निम्न लिंक का भी अनुसरण कर सकते हैं:

  • C ++ HTML ऑनलाइन प्रलेखन।
  • थोड़ा गणितीय दस्तावेज: फाइबोनैचि संख्या - अच्छे एल्गोरिदम को लागू करने के लिए कई संबंध

सबसे उपयोगी सूत्र हैं:

  • F2n=Fn+12Fn12=2FnFn1+Fn2
  • F2n+1=Fn+12+Fn2

एल्गोरिथ्म पर सावधान रहें। आपको कई बार समान मूल्य की गणना नहीं करनी चाहिए। एक सरल पुनरावर्ती एल्गोरिथ्म (पायथन में):

def fibonacci_pair(n):
    """Return (F_{n-1}, F_n)"""
    if n != 0:
        f_k_1, f_k = fibonacci_pair(n//2)  # F_{k-1},F_k with k = n/2

        return ((f_k**2 + f_k_1**2,
                 ((f_k*f_k_1)*2) + f_k**2) if n & 1 == 0  # even
                else (((f_k*f_k_1)*2) + f_k**2,
                      (f_k + f_k_1)**2 + f_k**2))
    else:
        return (1, 0)

इसकी जटिलता लॉगरिदमिक है (यदि मूल संचालन निरंतर समय में है): ।O(logn)


2
कंप्यूटर विज्ञान में आपका स्वागत है । क्या आप अपने उत्तर में अधिक जानकारी जोड़ सकते हैं? फिलहाल, यह दो लिंक से अधिक कुछ भी नहीं है, इसलिए यदि आपका लिंक बेकार हो जाता है या जो सर्वर चालू हैं, उनका उत्तर अनुपलब्ध हो जाएगा। अधिक जानकारी के लिंक ठीक हैं, लेकिन यहां लिंक केवल जानकारी है। इसके अलावा, कृपया ध्यान दें कि प्रश्न निश्चित रूप से एल्गोरिदम के बारे में है, न कि सी ++ कार्यान्वयन के बारे में। कार्यान्वयन भाषा-विशिष्ट विवरण के पीछे एल्गोरिदम को अस्पष्ट करते हैं।
डेविड रिचेर्बी

डेविड, पहली कड़ी एक गणितीय लेख की एक कड़ी है। शीर्षक A फ़ास्ट अल्गोरिथम [...] प्रश्न का उत्तर है "क्या एक कुशल (मूल्य n या बेहतर में लघुगणक) एल्गोरिथ्म है [...]?" दूसरा लिंक मेरे विभिन्न कार्यान्वयन का एक लिंक है, सी ++ और पायथन में, और कई सूत्रों के साथ थोड़ा गणितीय दस्तावेज़।
ओलिवियर पिरसन

2
नहीं, लेख का शीर्षक , जो आपके उत्तर में है, वह उत्तर कुछ भी नहीं है। पाठ लेख है, जो अपने जवाब की तरह यह शायद इस सवाल का जवाब होता है की लगभग कोई भी, लगता है शामिल की। लेकिन स्टैक एक्सचेंज एक प्रश्न और उत्तर साइट है, लिंक फ़ार्म नहीं। (और, नहीं, मैं सुझाव नहीं दे रहा हूं कि आप लेख को अपने उत्तर में कॉपी-पेस्ट करें। लेकिन एक सारांश की आवश्यकता है।)
डेविड रिचरबी

यदि आप एक सारांश चाहते हैं, तो इसे लिखें!
ओलिवियर पिरसन

0

बुनियादी सिद्धांत और में लगातार गुणांक के साथ रैखिक पुनरावृत्ति के लिए कोड http://www.jjj.de/ से उपलब्ध है ।O(log2n)

मुफ्त पुस्तक मामलों की कम्प्यूटेशनल और pari / gp कोड की जाँच करें।


5
लिंक पोस्ट करने के बजाय विचारों को संक्षेप में प्रस्तुत करना बेहतर है।
अगुरार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.