सामान्य उपयोग के लिए, StringBuilder वर्ग से जुड़े समाधान बहु-वर्ण स्ट्रिंग्स को दोहराने के लिए सर्वोत्तम हैं। यह बड़ी संख्या में तार के संयोजन को इस तरह से संभालने के लिए अनुकूलित है कि सरल संयोजन नहीं हो सकता है और यह हाथ से अधिक कुशलता से करना मुश्किल या असंभव होगा। यहां दिखाए गए StringBuilder समाधान O (N) का उपयोग करते हैं पुनरावृत्तियों को पूरा करने के लिए , एक सपाट दर जो बार-बार दोहराई जाती है।
हालांकि, बहुत बड़ी संख्या में दोहराए जाने के लिए, या जहां दक्षता के उच्च स्तर से बाहर निचोड़ा जाना चाहिए, एक बेहतर तरीका है स्ट्रिंगब्यूलर की बुनियादी कार्यक्षमता के समान कुछ करना लेकिन मूल स्ट्रिंग के बजाय गंतव्य से अतिरिक्त प्रतियां तैयार करना, नीचे के अनुसार।
public static string Repeat_CharArray_LogN(this string str, int times)
{
int limit = (int)Math.Log(times, 2);
char[] buffer = new char[str.Length * times];
int width = str.Length;
Array.Copy(str.ToCharArray(), buffer, width);
for (int index = 0; index < limit; index++)
{
Array.Copy(buffer, 0, buffer, width, width);
width *= 2;
}
Array.Copy(buffer, 0, buffer, width, str.Length * times - width);
return new string(buffer);
}
यह प्रत्येक पुनरावृत्ति के साथ स्रोत / गंतव्य स्ट्रिंग की लंबाई को दोगुना कर देता है, जो हर बार जब यह मूल स्ट्रिंग से गुजरता है, तो काउंटर को रीसेट करने के ओवरहेड को बचाता है, बजाय सुचारू रूप से पढ़ने और अब लंबे स्ट्रिंग को कॉपी करने के, आधुनिक प्रोसेसर बहुत कुछ कर सकते हैं अधिक कुशलता से।
यह एक बेस -2 लॉगरिदम का उपयोग करता है ताकि यह पता लगाया जा सके कि स्ट्रिंग की लंबाई को दोगुना करने के लिए कितनी बार जरूरत है और फिर ऐसा करने के लिए आगे बढ़ता है। चूँकि नकल की जाने वाली शेष राशि अब उस कुल लंबाई से कम है जिसकी वह नकल कर रहा है, इसलिए यह केवल पहले से उत्पन्न एक उपसमूह की प्रतिलिपि बना सकता है।
मैंने StringBuilder के उपयोग पर Array.Copy () पद्धति का उपयोग किया है, StringBuilder की सामग्री की प्रतिलिपि बनाने के रूप में अपने आप में प्रत्येक पुनरावृत्ति के साथ उस सामग्री के साथ एक नया स्ट्रिंग बनाने का ओवरहेड होगा। Array.Copy () इस से बचा जाता है, जबकि अभी भी दक्षता की अत्यधिक उच्च दर के साथ काम कर रहा है।
यह समाधान पूरा करने के लिए O (1 + log N) पुनरावृत्तियों को लेता है , एक दर जो दोहराव की संख्या के साथ तार्किक रूप से बढ़ती है (दोहराए जाने की संख्या एक अतिरिक्त पुनरावृत्ति के बराबर होती है), अन्य तरीकों पर पर्याप्त बचत, जो आनुपातिक रूप से होती है।