2010-04-11 14 views
6

मैं एक merge समारोह जो एक में दो पेड़ों गठबंधन करने के लिए समय O(log n) लेता है, और एक listToTree समारोह जो सिंगलटन पेड़ों के लिए तत्वों का एक प्रारंभिक सूची में कनवर्ट करता है और बार बार प्रत्येक अगली जोड़ी पर merge कॉल पेड़ के पेड़ तक केवल एक पेड़ बना रहता है।सूची करने के लिए पेड़ समारोह के लिए Asymptotic क्रम

समारोह हस्ताक्षर और प्रासंगिक कार्यान्वयन इस प्रकार हैं:

merge :: Tree a -> Tree a -> Tree a --// O(log n) where n is size of input trees 
singleton :: a -> Tree a   --// O(1) 
empty :: Tree a      --// O(1) 
listToTree :: [a] -> Tree a   --// Supposedly O(n) 

listToTree = listToTreeR . (map singleton) 

listToTreeR :: [Tree a] -> Tree a 
listToTreeR []  = empty 
listToTreeR (x:[]) = x 
listToTreeR xs  = listToTreeR (mergePairs xs) 

mergePairs :: [Tree a] -> [Tree a] 
mergePairs []  = [] 
mergePairs (x:[]) = [x] 
mergePairs (x:y:xs) = merge x y : mergePairs xs 

यह एक थोड़ा सरलीकृत क्रिस ओकासाकी द्वारा पूरी तरह कार्यात्मक डेटा स्ट्रक्चर में व्यायाम 3.3 का संस्करण है।

अभ्यास के अनुसार, अब मैं दिखाऊंगा कि listToTreeO(n) समय लेता है। जो मैं नहीं कर सकता :-(

वहाँ तुच्छता listToTreeR करने के लिए ceil(log n) पुनरावर्ती कॉल, mergePairs करने के लिए ceil(log n) कॉल अर्थ हैं।

mergePairs का चलने का समय सूची की लंबाई, और पेड़ों की आकार। की लंबाई पर निर्भर है सूची 2^h-1 है, और पेड़ों की आकार log(n/(2^h)), जहां h=log n पहले पुनरावर्ती कदम है कर रहे हैं, और h=1 पिछले पुनरावर्ती कदम है। mergePairs को प्रत्येक कॉल इस प्रकार समय लगता है (2^h-1) * log(n/(2^h))

मैं मुसीबत तक आ रही है इस विश्लेषण को आगे बढ़ाएं। क्या कोई मुझे सही दिशा में संकेत दे सकता है?

उत्तर

6

यह लगभग वहां है। आप पहले से ही पता अभिव्यक्ति

इसलिए केवल समस्या यह राशि का मूल्यांकन करने के है। लॉग (एबी) का उपयोग करते हुए = लॉग ऑन ए + बी लॉग इन करें और 2 एन लॉग इन करें = एन हम

With help of calculators, हम पा सकते हैं कि एक्स = हे है (2 मीटर) = ओ (एन), जो उम्मीद की जाती है।

(यदि आप इसे स्वयं गणना करना चाहते हैं, तो "ज्यामितीय श्रृंखला" की खोज करें, या एक अभिन्न का उपयोग करके योग का अनुमान लगाएं।)

संबंधित मुद्दे