25.07.2017 Views

Intro-CSharp-Book-v2015

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Глава 25. Практически изпит по програмиране (тема 2) 1057<br />

}<br />

}<br />

private static void TestCountWords()<br />

{<br />

List testData = GetTestData();<br />

foreach (string testCase in testData)<br />

{<br />

Console.WriteLine("Test Case:{0}{1}",<br />

Environment.NewLine, testCase);<br />

Console.WriteLine("Result:");<br />

CountWords(ExtractWords(testCase));<br />

}<br />

}<br />

Дискусия за производителността<br />

Тъй като въпросът за производителността в тази задача не е явно поставен,<br />

само ще дадем идея как бихме могли да реагираме, ако евентуално се<br />

окаже, че нашият алгоритъм е бавен. Понеже разделянето на текста по<br />

разделящите символи предполага, че целият текст трябва да бъде прочетен<br />

в паметта и думите, получени при разделянето също трябва да се запишат<br />

в паметта, то програмата ще консумира голямо количество памет, ако<br />

входният текст е голям. Например, ако входът е 200 MB текст, програмата<br />

ще изразходва най-малко 800 MB памет, тъй като всяка дума се пази два<br />

пъти по 2 байта за всеки символ.<br />

Ако искаме да избегнем консумацията на голямо количество памет, трябва<br />

да не пазим всички думи едновременно в паметта. Можем да измислим<br />

друг алгоритъм: сканираме текста символ по символ и натрупваме буквите<br />

в някакъв буфер (например StringBuilder). Ако срещнем в даден момент<br />

разделител, то в буфера би трябвало да стои поредната дума. Можем да я<br />

анализираме дали е с малки или главни букви и да зачистим буфера. Това<br />

можем да повтаряме до достигане на края на файла. Изглежда по-ефективно,<br />

нали?<br />

За по-ефективно проверяване за главни/малки букви можем да направим<br />

цикъл по буквите и проверка на всяка буква. Така ще си спестим<br />

преобразуването в горен/долен регистър, което заделя излишно памет за<br />

всяка проверена дума, която след това се освобождава, и в крайна сметка<br />

това отнема процесорно време.<br />

Очевидно второто решение е по-ефективно. Възниква въпросът дали<br />

трябва, след като сме написали първото решение, да го изхвърлим и да<br />

напишем съвсем друго. Всичко зависи от изискванията за ефективност. В<br />

условието на задачата няма предпоставки да смятаме, че ще ни подадат<br />

като вход стотици мегабайти. Следователно сегашното решение, макар и<br />

не оптимално, също е коректно и ще ни свърши работа.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!