Genel kullanım için, StringBuilder sınıfını içeren çözümler çok karakterli dizeleri yinelemek için en iyisidir. Çok sayıda dizenin birleşimini, basit birleştirme işleminin yapamayacağı ve elle daha verimli bir şekilde yapılması zor veya imkansız olacak şekilde işlemek için optimize edilmiştir. Burada gösterilen StringBuilder çözümleri tamamlamak için O (N) yinelemelerini kullanır, bu yineleme sayısı ile orantılı sabit bir orandır.
Bununla birlikte, çok sayıda tekrar için veya yüksek verimlilik seviyelerinin ortadan kaldırılması gerektiğinde, StringBuilder'in temel işlevine benzer bir şey yapmak, ancak orijinal dizeden ziyade hedeften ek kopyalar üretmek, aşağıda olduğu gibi.
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);
}
Bu, her bir yinelemeyle kaynak / hedef dizginin uzunluğunu iki katına çıkarır, bu da orijinal dizeden her geçtiğinde sıfırlama sayaçlarının yükünü azaltır, bunun yerine modern işlemcilerin yapabileceği çok daha uzun dizeyi düzgün bir şekilde okumak ve kopyalamak daha verimli.
Dizenin uzunluğunu iki katına çıkarmak için kaç kez ihtiyaç duyduğunu bulmak için bir base-2 logaritması kullanır ve bunu birçok kez yapmaya devam eder. Kopyalanacak geri kalan artık kopyalandığı toplam uzunluktan daha az olduğundan, daha önce oluşturduğu şeyin bir alt kümesini kopyalayabilir.
StringBuilder içeriğinin bir kopyasını kendi içine her yineleme ile bu içerik ile yeni bir dize üreten yükü olurdu gibi StringBuilder kullanımı üzerinde Array.Copy () yöntemini kullandım. Array.Copy () bunu önler ve yine de son derece yüksek bir verimlilik oranıyla çalışır.
Bu çözüm , tekrar sayısı ile logaritmik olarak artan bir oran olan O (1 + log N) iterasyonlarını alır ( tekrarlama sayısının iki katına çıkarılması bir ek iterasyona eşittir), orantılı olarak artan diğer yöntemlere göre önemli bir tasarruf.