sobota, 5 marca 2016

Powtórzenie z algorytmów

Jakiś czas temu, postanowiłem się doszkolić ze znajomości algorytmów. Częściowo było to spowodowane tym, że na studiach miałem dosyć okrojone algorytmy (mieliśmy różne sortowania, różne sposoby podziału, ale do grafów już nie doszliśmy) i o ile przez długi czas ta wiedza była wystarczająca, z czasem jednak codility rosło w popularność. O ile obecnie swój "peak" zapewne ma już za sobą, to podczas przykładowej rozmowy kwalifikacyjnej lub zgłaszania swojego uczestnictwa do darmowego szkolenia lub hakatonu zawsze możemy zostać poproszeni o zakodowanie czegoś "na szybko".

Ten temat miałem w tyle głowy jako "TODO" już od wiosny 2015r, jednak wziąłem się za niego dopiero jesienią 2015. Na pocz. sygnałem był temat z tagiem #zadaniaBartosza na popularnym portalu społecznościowym wykop.pl. Jeden z użytkowników wziął przykładową książkę do algorytów i raz w tyg. publikował zadanie, które nast. pozostali użytkownicy rozwiązywali. Po kilku zadaniach użytkownikowi znudziła się cała zabawa, a i algorytmy jakie rozwiązywaliśmy pozostawiały nieco do życzenia. Ważne jest to, że dała mi impuls do tego, aby wreszcie wziąć się za ten temat.

Nast. postanowiłem wziąć się za algorytmy sam. I wziąć się za nie w dwójnasób, tj. za pomocą strony z algorytmami jaką znałem, tj. projecteuler.net oraz kupując książkę teoretyczną. Przy wyborze książki swój wybór oparłem na tym opisie: książki do nauki algorytmów, a ost. wybór padł na Wprowadzenie do algorytów.

Co mogę napisać o tych dwóch sposobach uczenia?
- project Euler to już jest bardzo stara strona, która posiada multum zagadek (ponad 200), jednak wiele z nich to problemy czysto matematyczne. Zaletą natomiast jest to, że istnieje wiele gotowych rozwiązań, wraz z zwyjaśnieniami zadań, tzn. najpierw możemy sami spróbować, a później znaleźć lepsze rozwiązanie z wytłumaczeniem dlaczego tak, a nie inaczej
- książka wyjaśnia pewne podstawy, wyjaśnia również coraz bardziej zaawansowane rzeczy, jednak jest strasznie duża (gruba) i pisana językiem matematycznym. Widać, że jest to podręcznik akademicki, co ma swoje zalety jak i wady.

Jeżeli ktoś nie chce wydawać pieniędzy aby kupować książkę, to po wykonaniu danego zadania, polecam mu zajrzeć np. na http://www.mathblog.dk/project-euler-solutions/, w którym autor dosyć dobrze opisuje dane zagadnienie, zarówno w kwestii podstaw teoretycznych, jak i dostarcza działający kod. Zazwyczaj dostarcza kilka rozwiązań, tłumaczy czym one się różnią oraz wyjaśnia brakujące podstawy teoretyczne. Polecam do nauki.

Uczyłem się z tego, aż do pewnej rozmowy z Michał Franc, która nieco odświeżyła moją wiedzę. Z tej rozmowy były dwa wnioski:
- algorytmy to tylko jeden z bardzo wielu elementów wymaganych wobec programisty i wcale nie trzeba ich mieć obcykanych na tip top, aby móc powiedzieć o sobie, że jesteśmy "pro"
- pokazał mi, że istnieje lepsza strona z zadaniami od projektu Euler, czyli https://leetcode.com/

Ost. strona, tj. leetcode.com, mimo iż spędziłem przy niej najmniej czasu ze wszystkich wymienionych tutaj projektów, wydaje mi się obecnie najlepsza do nauki. Problemy wydają się bardziej życiowe, choć mogło to być spowodowane tym, że Eulera brałem "od początku", a LeetCode losowo ze środka, a dodatkowo dostajemy do tego masę testów jednostkowych, które podają nam wynik. To właśnie te jawne testy mają największą przewagę ze wszystkich wymienionych tutaj rozwiązań.
Gdybym obecnie ponownie stawał do zadania "naucz się algorytmów" to uczył bym się ich z https://leetcode.com/

Ciekawostki:
- w trakcie pracy nad tym zadaniem, udało mi się też zostać kontrybutorem (współautorem) jednego z zadań w projekcie rosettacode.org, a dokładniej wersji C# problemu  sumy największej ścieżki wewnątrz trójkąta Maximum_triangle_path_sum#C.23
- niektóre z rozwiązanych przezemnie zadań umieściłem na githubie. Wyjątkiem jest "leetcode", który posiada własny system pamiętania rozwiązań.

Brak komentarzy:

Prześlij komentarz