आप रिकर्सिव विधियों के बड़े ओ को खोजने के लिए मास्टर प्रमेय को संदर्भित करना चाहेंगे। यहां विकिपीडिया आलेख है: http://en.wikipedia.org/wiki/Master_theorem
आप पेड़ की तरह एक पुनरावर्ती समस्या के बारे में सोचना चाहते हैं। फिर, पेड़ के प्रत्येक स्तर और आवश्यक काम की मात्रा पर विचार करें। समस्याएं आम तौर पर 3 श्रेणियों में गिरती हैं, जड़ भारी (पहली पुनरावृत्ति >> पेड़ के बाकी), संतुलित (प्रत्येक स्तर में समान मात्रा में काम होता है), पत्ता भारी (अंतिम पुनरावृत्ति >> पेड़ के बाकी)। एक उदाहरण के रूप
लेने मर्ज प्रकार:
define mergeSort(list toSort):
if(length of toSort <= 1):
return toSort
list left = toSort from [0, length of toSort/2)
list right = toSort from [length of toSort/2, length of toSort)
merge(mergeSort(left), mergeSort(right))
आपको लगता है कि बदले में mergeSort की प्रत्येक कॉल 1/2 मूल लंबाई के 2 अधिक mergeSorts कॉल देख सकते हैं। हम जानते हैं कि विलय प्रक्रिया में विलय किए जाने वाले मूल्यों की संख्या के अनुपात में आनुपातिक समय लगेगा।
पुनरावृत्ति संबंध तब टी (एन) = 2 * टी (एन/2) + ओ (एन) है। दोनों 2 कॉल से आते हैं और एन/2 प्रत्येक कॉल से होता है जिसमें तत्वों की केवल आधा संख्या होती है। हालांकि, प्रत्येक स्तर पर तत्वों की संख्या समान होती है जिसे विलय करने की आवश्यकता होती है, इसलिए प्रत्येक स्तर पर निरंतर कार्य ओ (एन) होता है।
हम जानते हैं कि काम समान रूप से वितरित किया जाता है (ओ (एन) प्रत्येक गहराई) और पेड़ log_2 (n) गहरा है, इसलिए रिकर्सिव फ़ंक्शन का बड़ा ओ ओ (एन * लॉग (एन)) है।
स्रोत
2012-07-31 23:15:08
यह वास्तव में रिकर्सन के साथ बहुत कम नहीं है, और बड़े ओ नोटेशन के साथ सब कुछ करने के लिए है। यदि आप इसे बार-बार लिख सकते हैं, तो आप इसे – MStodd
@MStodd लिख सकते हैं जरूरी नहीं। एक बाइनरी पेड़ को क्रमशः ट्रैवर्स करने का प्रयास करें। – Drise
@ ड्रिस आपको एक ढेर की आवश्यकता होगी, लेकिन यह संभव है। रिकर्सन केवल कॉल स्टैक के अंदर ढेर को छुपाता है। –