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.

Глава 18. Речници, хеш-таблици и множества 775<br />

GetEnumerator() да връщате съответния метод GetEnumerator()на<br />

масива от списъци. Можете да използвате и оператора yield.<br />

9. Един вариант да решите задачата е, да използвате за ключ в хештаблицата<br />

елемента от множеството, а за стойност винаги true.<br />

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

на едното множество и проверка дали в едното множество има<br />

(съответно няма) елемента от другото множество.<br />

10. Намерете всички членове на трите редици в посочения интервал и след<br />

това използвайки HashSet реализирайте обединение и сечение на<br />

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

11. Класът TreeMultiSet можем да реализираме чрез<br />

SortedDictionary, който пази броя срещания на всеки от<br />

ключовете.<br />

12. Очевидното решение е да проверим всеки от автобусите дали пристига<br />

и си тръгва в посочения интервал. Според условието на задачата,<br />

обаче, трябва да ползваме класа HashSet.<br />

Решението е такова: Можем да намерим множествата на всички<br />

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

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

търсените автобуси. Ако TimeInterval е клас който съхранява<br />

разписанието на един автобус, сечението можем да намерим с HashSet<<br />

TimeInterval> при подходящо дефинирани GetHashCode() и Equals().<br />

13. Първата идея за решаване на задачата е проста: с два вложени цикъла<br />

намираме всички щастливи под-редици на редицата P, след което ги<br />

сортираме по дължината им и накрая извеждаме първите 10. Това,<br />

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

милиони.<br />

Ще опишем една идея за по-ефективно решение. Ще използваме класа<br />

TreeMultiSet. В него ще съхраняваме първите 10 под-редици от S,<br />

т.е. мулти-множество от щастливите под-редици на P, подредени по<br />

дължина в намаляващ ред. Когато имаме 10 под-редици в мулти-множеството<br />

и добавим нова 11-та под-редица, тя ще застане на мястото си<br />

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

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

е сред първите 10. Така във всеки един момент ще пазим текущите 10<br />

най-дълги под-редици. По този начин ще консумираме много по-малко<br />

памет и ще избегнем сортирането накрая. Имплементацията няма да е<br />

лесна, така че отделете достатъчно време!

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

Saved successfully!

Ooh no, something went wrong!