arrays - What happens when Data.Vector.unfoldr doesn't fuse? -
मान लीजिए कि मैं vector
का उपयोग करके unfoldr
बना रहा हूँ, Code> unfoldrN , और यह नहीं फ्यूज, इसलिए वेक्टर को वास्तव में बनाया जाना चाहिए। सिस्टम कैसे तय करता है कि यह कैसे बड़ा होगा? मैं दस्तावेज़ीकरण में इसके बारे में कुछ भी नहीं पा पाया हूं। स्रोत कोड से पता चलता है कि यह unstream
को कॉल करता है, जिसमें बहुत अधिक जटिल कोड है जो मैं सिर या पूंछ नहीं कर सकता।
मुझे पूरी तरह से यकीन नहीं है, लेकिन मैंने unfoldr
से Data.Vector.Generic.Mutable.unstream
से स्रोत कोड का पीछा किया । इसका प्रलेखन कहता है:
एक नया अस्थायी वेक्टर बनाएं और इसे 'स्ट्रीम' से तत्वों से भरें। वेक्टर तेजी से बढ़ेगा यदि 'स्ट्रीम' का अधिकतम आकार अज्ञात है।
तो, मेरा अनुमान है कि यह एक छोटे आकार (जैसे 10 या तो) के साथ शुरू होता है और वेक्टर। जैसे ही सदिश पूर्ण हो जाता है, यह उसके आकार को दुगुना करता है (या इसके आकार का 50% बड़ा होता है, या किसी दूसरे अनुपात से इसके आकार में वृद्धि) और पुराने तत्वों को नए सदिश में प्रतिलिपि बनाता है। घातीय वृद्धि यह सुनिश्चित करती है कि यदि आप n तत्वों के साथ सदिश को भरते हैं तो आप अधिकतम (ओ (लॉग) (एन)) प्रतियां करेंगे, इसलिए समग्र जटिलता ओ (एन लॉग (एन)) होगी, जो रैखिक समय के लिए "करीब पर्याप्त" है ।
वास्तविक अनुपात 2, जैसा कि enlarge_delta फ़ंक्शन के अनुसार होता है, जो अभी
अधिकतम 1 (लंबाई वी)
देता है, जिसे पारित किया जाता है हो जाना
जो वेक्टर को कई तत्व जोड़ता है।
नोट्स के रूप में, घातीय नकल हे (एन) है, न केवल हे (n लॉग (एन))। वास्तव में, अनुपात = 2 का उपयोग करके, प्रतिलिपि हुए तत्वों की संख्या 2 ^ 0 + 2 ^ 1 + ... + 2 ^ (लॉग (एन)) = 2 ^ (लॉग (एन) +1) -1 = 2 एन -1, इसलिए ओ (एन)।
Comments
Post a Comment