برنامه نویسی
بررسي روش‌هاي مختلف برعکس‌کردن رشته‌ها
آش‌رشته مايکروسافت
اين هفته قصد داريم 4 روش براي معکوس کردن رشته در #C را بررسي کرده و درنهايت روش بهينه‌ را انتخاب کنيم. روش اول استفاده از کلاس Array است، در اين روش ابتدا يک رشته را درون يک شي از کلاس Array مي‌ريزيم و سپس با استفاده از متد Reverse عناصر رشته را که همان کاراکترهاي يک آرايه هستند را معکوس مي‌کنيم. اين روش را با استفاده از کد زير انجام مي‌دهيم.


public static string ReverseArray(string text){

char[] array = text.ToCharArray();

Array.Reverse(array);

return (new string(array));}

روش دوم: در اين روش رشته را با استفاده از کلاس StringBuilder معکوس مي‌کنيم. در اين عناصر رشته را به‌صورت معکوس با استفاده از انديس آنها را در يک کلاس StringBuilder ريخته و مقدار رشته ذخيره شده در شي ساخته شده از StringBuilder را بر مي‌گردانيم. کد مربوط به اين روش در زير آورده شده است.

public static string ReverseSB(string text){

StringBuilder builder = new StringBuilder(text.Length);{

builder.Append(text[i]);}

return builder.ToString();

}

بسيار خب يک سوالي ممکن است که در اينجا به‌وجود بيايد، اين است که چرا از کلاس StringBuilder استفاده کرديم در صورتي که مي‌توانستيم از يک متغير رشته‌اي استفاده کنيم؟ به فرض کنيد يک رشته را به يک متغير رشته‌اي وصل کنيم. در اين حالت 3 رشته در حافظه داريم: نخست رشته اول، رشته‌اي که مي‌خواهيم به رشته اصلي بچسبانيم و در نهايت رشته حاصل از عمل وصل شدن. دليل اين اتفاق اين است که کلاس رشته در #C يک کلاس Imutable‌ است، اينکه کلاس Imutable چيست، خودش بحثي جداست که از حوصله اين مطلب خارج است. روش سوم استفاده از اشاره‌گر است، در اين روش ابتدا کاراکتر اول را در متغيير pStart که يک اشاره‌گر به يک کاراکتر است، ذخيره مي‌کنيم. وکاراکتر آخر را در pEnd ذخيره مي‌کنيم و سپس در يک حلقه که به نصف اندازه يک رشته اجرا مي‌شود، خانه آخر را با خانه ابتدايي عوض مي‌کنيم و سپس رشته را بر مي‌گردانيم.

public static unsafe string

ReverseUnsafe(string text){

fixed (char* pText = text){

char* pStart = pText;

char* pEnd = pText + text.Length - 1;

for (int i = text.Length / 2; i »= 0; i--){

char temp = *pStart;

*pStart++ = *pEnd;

*pEnd-- = temp;}

return text;}

}

در روش چهارم با استفاده از عملگر Xor رشته را معکوس مي‌کنيم. خانه آخر را با خانه اول Xor مي‌کنيم و نتيجه را در خانه اول قرار مي‌دهيم و سپس خانه اول را با خانه آخر Xor مي‌کنيم و نتيجه را در خانه آخر قرار مي‌دهيم و سپس خانه اول را دوباره با خانه آخر XOR مي‌کنيم و نتيجه را در خانه اول قرار مي‌دهيم اين عمل را تا از ابتداي رشته تا آخر آن انجام مي‌دهيم.

public static string ReverseXor(string s){

char[] charArray = s.ToCharArray();

int len = s.Length - 1;

for (int i = 0; i « len; i++, len--){

charArray[i] ^= charArray[len];

charArray[len] ^= charArray[i];

charArray[i] ^= charArray[len];}

return new string(charArray);

}

بسيار خب حال 4 روش داريم که با آنها مي توانيم يک رشته را برعکس کنيم حال بررسي کنيم که کدام روش بهتر و بهينه‌تر است.

براي تست‌کردن اينکه کدام روش بهتر است از کد زير استفاده مي‌کنيم:

static void Benchmark (string description, StringDelegate d, int times, string text){

Stopwatch sw = new Stopwatch();

sw.Start();

for (int j = 0; j « times; j++){

d(text);}

sw.Stop();

Console.WriteLine(«{0} Ticks {1} : called {2} times.», sw.ElapsedMilliseconds, description, times);

}

بعد از مقايسه نتايج بدست آمده از آزمايش به اين نتيجه مي‌رسيم که براي رشته‌هاي متني کوچک مثلا شامل 1000 کاراکتر استفاده از کلاس Array سودمند‌تر است و زمان کمتري طول مي‌کشد که يک رشته را برعکس کند. بعد از آن استفاده از يک روش اشاره‌گر براي رشته‌هاي متني بزرگ مثلا شامل 10000 کاراکتر استفاده از اشاره‌گر مفيد است و سپس استفاده از کلاس Array بهتر است. نتيجه‌اي که از اين مقايسه حاصل مي‌شود استفاده از کلاس Array بهينه‌تر است. دليل اينکار اين است که استفاده از اشاره‌گر‌ها خطرناک است و ممکن است بعدها و در سيستم‌هاي مختلف مشکل ايجاد شود. ولي اگر به عنوان برنامه‌نويس تضمين مي‌کنيد که کد شما بدون خطا اجرا مي‌شود و مي‌توانيد درست از آن استفاده کنيد، استفاده از روش اشاره‌گر خيلي بهتر و به صرفه‌تر است.

سورس کد اين مقاله از آدرس زير قابل دريافت است:

http://dotnetdeveloper.persiangig.com/Code%20Snippet/ReverseString.cs

+ نوشته شده در  دوشنبه سی ام فروردین ۱۳۸۹ساعت 13:45  توسط ابراری |