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.

806 Въведение в програмирането със C#<br />

друга хеш-таблица, която по град връща списък от телефони? Това би<br />

трябвало да работи. Нещо подобно правихме в предходната задача, нали?<br />

Може ли да ни хрумне нещо още по-умно? Не може ли в основната хештаблица<br />

за телефонния указател да сложим под ключ "Петър от Варна"<br />

телефоните на всички, които се казват Петър и са от Варна? Изглежда това<br />

ще реши проблема и ще можем да използваме само една хеш-таблица за<br />

всички търсения.<br />

Използвайки последната идея стигаме до следния алгоритъм: четем ред по<br />

ред телефонния указател и за всяка дума от името на човека d 1, d 2, ..., d k и<br />

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

ключове: d 1, d 2, ..., d k, "d 1 от t", "d 2 от t", …, "d k от t". Така си гарантираме,<br />

че ще можем да търсим по всяко от имената на съответния човек и по всяка<br />

двойка име + град. За да можем да търсим без значение на регистъра<br />

(главни или малки букви), можем да направим предварително всички букви<br />

малки. След това търсенето е тривиално – просто търсим в хеш-таблицата<br />

подадената дума d или ако ни подадат дума d и град t, търсим по ключ "d<br />

от t". Понеже за един и същ ключ може да има много телефони, ползваме<br />

за стойност в хеш-таблицата списък от символни низове (List).<br />

Нека разгледаме една имплементация на описания алгоритъм:<br />

class Phone<strong>Book</strong>Finder<br />

{<br />

const string Phone<strong>Book</strong>FileName = "Phone<strong>Book</strong>.txt";<br />

const string QueriesFileName = "Queries.txt";<br />

static Dictionary phone<strong>Book</strong> =<br />

new Dictionary();<br />

static void Main()<br />

{<br />

ReadPhone<strong>Book</strong>();<br />

ProcessQueries();<br />

}<br />

static void ReadPhone<strong>Book</strong>()<br />

{<br />

StreamReader reader = new StreamReader(<br />

Phone<strong>Book</strong>FileName, Encoding.GetEncoding("windows-1251"));<br />

using (reader)<br />

{<br />

while (true)<br />

{<br />

string line = reader.ReadLine();<br />

if (line == null)<br />

{<br />

break;<br />

}

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

Saved successfully!

Ooh no, something went wrong!