Задачи от речници, хеш-таблици и множества


24

Привет, колеги...реших да пост-на решенията на задачите, които съм направил дотук от тази тема (да продължа традицията на Венци, която е доста добра btw ;))..Та ето ги и задачите:

1.Write a program that counts in a given array of integers the number of occurrences of each integer. Use Dictionary<TKey,TValue>.

http://pastebin.com/4CV0w7hj

2.Write a program that extracts from a given sequence of strings all elements that present in it odd number of times.

http://pastebin.com/iJzUMMFF

3.Write a program that counts how many times each word from given text file words.txt appears in it. The character casing differences should be ignored. The result words should be ordered by their number of occurrences in the text. 

http://pastebin.com/akG0tnsW




Отговори



11
Много готини и добре струтурирани решения колега. Трябва да си призная, че току-що открих, че index-ерът на Dictionary може да вика автоматично Add метода...благодаря за което :D
Единствено аз лично бих извадил s.Trim().ToLower() в отделна променлива, защото в противен случай по няколко пъти се върши една и съща операция.

от LTsonov (4149 точки)


0
Имаш право! ;) Ще го поправя, мерси!

от timitev (961 точки)


11
btw, 3-та задача, ако не се решава с рег.изрази, а със Split функцията, вади ли ви, че има винаги 1 въпросителна(?) ???? независимо дали е в края на текста или някъде вътре?

от timitev (961 точки)


0
Ако си копирал текста от презентацията, ?-телната е тирето, защото е в различен encoding. Копирай текста във файл, смени вътрешно encoding-а на UTF-8 и ще видиш каква магия ще стане :)

от LTsonov (4149 точки)

0
niiiice :D ръчно писах, копирах, добавях, трих въпросителни, пак ги писах...ама тва е магията :D

от timitev (961 точки)



2
И при мен се получава същото с тая въпросителна. Аз затова си я отделих от текста, за да работи, защото иначе цялата дума е "text?" и няма как да я split-неш, освен ако не използваш регулярен израз (примерно).
Ако е някъде в текста и е отделена от останалите, не би трябвало да ти прави проблеми.

от stamo (1874 точки)


0
е то ти Split-ва стринг-а по дадени char-ове...т.е. ако му дадеш да ти ги сплитва по 't' , ще ти раздели стринг-а по тоя чар...

от timitev (961 точки)

0
Идеята ми е да split-неш първо по интервали, запетайки и т.н., след което през останалите думи да минеш с регулярен израз и да махнеш знаци в края на думите като '?', '!' и други.

от stamo (1874 точки)



9

    В повечето решения, които разгледах виждам, че за обхождане на даден масив и намиране на броя срещания на елементите му е използван този подход:

foreach (int item in array)
            {
                int occurs = 1;
                if (dict.ContainsKey(item))
                {
                    occurs = dict[item] + 1;
                }
                dict[item] = occurs;
            }​
 

и поради тази причина предлагам и начина, по който аз подхождам на такъв тип задачати. 

foreach(int integer in array)

{
    if (!occurrences.ContainsKey(integer))
    {
        occurrences[integer] = 1;
    }
    else
    {
        occurrences[integer]++;
    }
}
    Няма голяма разлика, но поне на мен така ми изглежда малко по лесно за четене. Надявам се на някой да му е полезно.

от NEVERMIND7 (167 точки)


14

Много полезна тема wink

Ето и моите решения:

Ex01 - http://ideone.com/5Pze2

Ex02 - http://ideone.com/q4FPP

Ex03 - http://ideone.com/SrDPK

Ex04 - Implement the data structure "hash table" in a class HashTable<K,T>. Keep the data in array of lists of key-value pairs (LinkedList<KeyValuePair<K,T>>[]) with initial capacity of 16. When the hash table load runs over 75%, perform resizing to 2 times larger capacity. Implement the following methods and properties: Add(key, value), Find(key)àvalue, Remove( key), Count, Clear(), this[], Keys. Try to make the hash table to support iterating over its elements with foreach.

HashTable Class: http://ideone.com/GKtIb

HashTable Test: http://ideone.com/vKVdG

Edit: Ex05 - Implement the data structure "set" in a class HashedSet<T> using your class HashTable<T,T> to hold the elements. Implement all standard set operations like Add(T), Find(T), Remove(T), Count, Clear(), union and intersect.

* HashSet Class: http://ideone.com/PotwX

*За HashSet класа ползвам класа HashTable от 4та задача като съм добавил към него един метод Contains.


от V.Shterev (1151 точки)


6

Привет,

Моето решение на 3-та задача:

http://pastebin.com/L4TzCNvt

Поздрави


от alek75 (405 точки)


0
Трябваше да добавя следното: Аз имам 2 решения на задачата, 1-вото ми се стори малко дървено и попитах Ники Костов за друг вариант. Това, което постнах тук е варианта, който Ники направи и за това мисля, че ще ви е интересно.

от alek75 (405 точки)


5

След големи мъки с 4-та и 5-та, успях и аз да ги завърша. smiley
На някой, ако му се гледат моите класове,
тестове и всичко - цък (барабар със *.sln-то).
 


от Ivaylo.Angelov (1890 точки)


2

Задача 1

Използвам речник и го попълвам по два начина за да сравня разликата във времената.

Задача 2

Отново по два начина, за да видя дали писането на дълги ламбда изрази е целесъобразно (не казвам, че са правилни дълги ламбда изрази :) )

Задача 3

Още при създаването на речника му задавам StringComparer.OrdinalIgnoreCase за да е case-insensitive.

Всеки прочетен ред го split-вам и всяка дума я Trim-вам за да махна всякакви знаци.

Пропускам думите от по една буква.


от dzhenko (3893 точки)