सी # में स्ट्रिंगबिल्डर द्वारा उपयोग किए जाने वाले आंतरिक बफर को विकसित करने के लिए उपयोग की जाने वाली रणनीति समय के साथ बदल गई है।
इस समस्या को हल करने के लिए तीन मूलभूत रणनीतियां हैं, और उनके पास विभिन्न प्रदर्शन विशेषताएं हैं।
पहले बुनियादी रणनीति है:
- , वर्ण
- आप कमरे समाप्त हो जाता है की एक सरणी बनाने कश्मीर अधिक अक्षर के साथ एक नई सरणी, कुछ निरंतर कश्मीर के लिए पैदा करते हैं।
- पुरानी सरणी को नई सरणी में कॉपी करें, और पुरानी सरणी अनाथ करें।
इस रणनीति यदि स्ट्रिंग निर्माण किया जा रहा बहुत बड़ी है समय में समस्याओं, जिनमें से सबसे स्पष्ट के एक नंबर यह हे है कि (एन) है। मान लें कि के हजारों वर्ण हैं और अंतिम स्ट्रिंग दस लाख वर्ण हैं। आप स्ट्रिंग को 1000, 2000, 3000, 4000, ... पर प्रतिलिपि बनाते हैं और इसलिए 1000 + 2000 + 3000 + 4000 + ... + 999000 वर्णों की प्रतिलिपि बनाते हैं, जो 500 बिलियन वर्णों की प्रतिलिपि के क्रम में बताते हैं!
इस रणनीति में अच्छी संपत्ति है कि "बर्बाद" स्मृति की मात्रा के द्वारा बाध्य है।
प्रैक्टिस में इस रणनीति का शायद ही कभी उस एन-स्क्वायर समस्या के कारण उपयोग किया जाता है।
दूसरी बुनियादी रणनीति
- आप कमरे समाप्त हो जाता है एक सरणी
- बनाओ, कश्मीर% अधिक अक्षर के साथ एक नई सरणी, कुछ निरंतर कश्मीर के लिए पैदा करते हैं।
- पुरानी सरणी को नई सरणी में कॉपी करें, और पुरानी सरणी अनाथ करें।
के% आमतौर पर 100% है; यदि ऐसा है तो इसे "डबल पूर्ण" रणनीति कहा जाता है।
इस रणनीति में अच्छी संपत्ति है कि इसकी amortized लागत ओ (एन) है। मान लीजिए कि अंतिम स्ट्रिंग दस लाख वर्ण है और आप हजारों से शुरू करते हैं। आप 1000, 2000, 4000, 8000, पर प्रतियां बनाते हैं ... और 1000 + 2000 + 4000 + 8000 ... + 512000 वर्णों की प्रतिलिपि बनाते हैं, जो लगभग दस लाख वर्णों की प्रतिलिपि बनाते हैं; काफी बेहतर।
रणनीति में संपत्ति है कि अमूर्त लागत रैखिक कोई फर्क नहीं पड़ता कि आप किस प्रतिशत का चयन करते हैं।
इस रणनीति नकारात्मक पक्ष यह है कि कभी कभी एक प्रति आपरेशन बेहद महंगे है की एक संख्या है, और आप अप्रयुक्त स्मृति में अंतिम स्ट्रिंग की लंबाई की% k अप करने के लिए बर्बाद कर जा सकता है।
तीसरी रणनीति एरे की एक लिंक्ड सूची बनाने के लिए है, आकार के प्रत्येक सरणी के। जब आप किसी मौजूदा सरणी को ओवरफ़्लो करते हैं, तो एक नया आवंटित किया जाता है और सूची के अंत में जोड़ा जाता है।
इस रणनीति अच्छा संपत्ति है कि कोई आपरेशन विशेष रूप से महंगा है, कुल व्यर्थ स्मृति कश्मीर से घिरा है, और आप एक नियमित आधार पर ढेर में बड़े ब्लॉकों का पता लगाने के लिए सक्षम हो की जरूरत नहीं है है। यह नकारात्मकता है कि आखिर में चीज को एक स्ट्रिंग में बदलना महंगा हो सकता है क्योंकि लिंक्ड सूची में सरणी खराब इलाके में हो सकती है।
.NET ढांचे में स्ट्रिंग बिल्डर एक डबल-पूर्ण-पूर्ण रणनीति का उपयोग करने के लिए उपयोग किया जाता है; अब यह एक लिंक-सूची-ऑफ-ब्लॉक रणनीति का उपयोग करता है।
आईआईआरसी, .NET स्ट्रिंगबिल्डर कम से कम अपने वर्तमान बफर आकार को दोगुना कर देगा यदि आप कुछ ऐसा करने की कोशिश करते हैं जिसमें आकार वृद्धि की आवश्यकता होगी। –
मेटामैटिकल राशि 1.618033 9 887 है ...: सुनहरा अनुपात, * लेकिन केवल 2 * – pmg
@ChrisFarmer का उपयोग करें: वह अतीत में रणनीति थी; वर्तमान संस्करण एक अलग रणनीति का उपयोग करता है। –