Przeglądałem swoje notatki i natknąłem się na implementację różnych algorytmów sortowania.
Kiedy próbowałem zrozumieć implementację QuickSort i MergeSort, przyszło mi do głowy, że chociaż programuję na życie i uważam się za przyzwoitego w tym, co robię, nie mam ani pamięci fotograficznej, ani siły mózgowej do wdrożenia tych algorytmów bez opierając się na moich notatkach. Pamiętam tylko, że niektóre z tych algorytmów są stabilne, a niektóre nie. Niektóre wymagają czasu O (nlog (n)) lub O (n ^ 2). Niektóre wykorzystują więcej pamięci niż inne ...
Czułbym się, jakbym nie zasługiwał na tego rodzaju pracę, gdyby tak nie było, ponieważ moja pozycja nie wymaga użycia żadnego algorytmu sortowania innego niż te, które można znaleźć w standardowych interfejsach API. Mam na myśli, ilu z was ma pozycję programistyczną, w której jest tak naprawdę ważne, abyście mogli samodzielnie zapamiętać lub wymyślić tego rodzaju rzeczy?
źródło
Odpowiedzi:
Zapytajmy Alberta i zobaczmy, co ma do powiedzenia na ten temat:
Amen, brat Albert, Amen.
Po dokładnym przeanalizowaniu podstawowych algorytmów w dowolnej dyscyplinie (sortowanie, wyszukiwanie, cokolwiek) możesz zapomnieć o szczegółach implementacji, dopóki faktycznie nie potrzebujesz algo, w którym to przypadku przejrzysz go lub użyjesz istniejąca lib. 25 lat temu zbudowałem główny system wyszukiwania za pomocą drzewek B *, ale dziś musiałbym RTFM, aby dobrze z nich korzystać.
źródło
O(n log n)
, ale jeśli dostaniesz dużo braków pamięci podręcznej lub (Boże, nie trafisz) trafisz na dysk, ton log n
będzie tylko miłe wspomnienie.To naprawdę nie jest kwestia zapamiętywania. Jest to kwestia głębokiego zrozumienia ogólnych klas algorytmów, takich jak dzielenie i podbijanie. Jeśli naprawdę rozumiesz dziel i zwyciężaj, nie musisz zapamiętywać szybkiego sortowania. W razie potrzeby możesz go odzyskać na miejscu. Co więcej, prawdziwa wypłata nie polega nawet na samodzielnym odzyskaniu szybkiego sortowania, lecz na rozpoznaniu, kiedy nowy problem jest podatny na rozwiązanie typu dziel i zwycięż.
Nie wszystkie zadania programistyczne są takie same. Niektóre prace wymagają dogłębnej znajomości algorytmów, niektóre potrzebują ludzi, którzy rozumieją teorię typów, a niektórzy potrzebują ludzi, którzy mogą zeskrobać dane z formularza internetowego i przenieść go do bazy danych. Niektóre prace wymagają nawet tych wszystkich umiejętności naraz. W jakiej pracy chcesz pracować?
źródło
Myślę, że jedynym czasem, o którym musisz pamiętać, jest ubieganie się o pracę, kiedy musisz udzielić odpowiedzi na miejscu i nie masz zewnętrznych zasobów.
Miałem współpracowników, którzy przepisywali szybkie sortowanie i tak dalej, ale powtarzam im, aby wrócili do korzystania z wbudowanych funkcji sortowania w języku. Wiem, że w zależności od typów projektów, nad którymi pracujemy, musimy pamiętać inne algorytmy, ponieważ zwykle nie są one zawarte w standardowych bibliotekach, ale sortowanie nie jest takie, które pojawia się, ponieważ zwykle jest wbudowane w język.
Kiedy jednak musimy pamiętać o tych algorytmach, zwykle zwracamy się do Google'a lub książki i zazwyczaj nie szukamy konkretnej implementacji, ale jaka byłaby najlepsza implementacja dla naszego problemu.
źródło
Samo zapamiętanie, który algorytm jest użyteczny w jakich scenariuszach, byłoby więcej niż wystarczające, aby pomóc w pracy. W rzeczywistości większość zadań programistycznych nie wymaga zapamiętywania podejścia, a raczej interesuje ich sposób rozpoznawania wzorca algorytmicznego w obliczu problemu .
W rzeczywistości w większości blogów / artykułów programistycznych na temat algorytmów jest mnóstwo informacji. Zatem zapamiętanie dokładnej implementacji nie ma znaczenia. Najbardziej wartościową informacją byłoby uzyskanie podstawowego pojęcia o tym, jaki rodzaj algorytmu jest dostępny i jaki konkretny problem są dobre w rozwiązywaniu . Wyszukiwanie dokładnej implementacji, gdy wiesz, czego szukasz, jest dość szybkie.
Podsumowując, zawsze lepiej jest wiedzieć, czego szukasz i gdzie są odniesienia - które poprowadzą cię do źródła.
źródło
Dokładne wdrożenie nie jest bardzo ważne. Ale zasada łączenia / szybkiego sortowania - rekurencja, partycjonowanie itp. Są bardzo podstawowe i każdy programista powinien to zrozumieć. Algorytmy te są w rzeczywistości bardzo proste do opisania słowami, gdy zrozumiesz.
Nie jest tak naprawdę problemem, czy możesz to sprawdzić, czy możesz google, to jest, czy programista rozumie te techniki rozwiązywania problemów i może zastosować się do innych sytuacji.
źródło
Mam dwa zdania na ten temat. Znam wielu programistów, którzy nie wiedzą, czym jest algorytm sortowania, ale wykonują swoją pracę dość dobrze. Wierzę również w zrozumienie zasad, aby naprawdę zrozumieć dziedzinę.
Trudno mi uzyskać bezstronną odpowiedź na ten temat, ponieważ programuję tak długo, że prawdopodobnie zapomniałem więcej algorytmów, które obecnie znam - ale nadal znam sortujące wymienione w tym pytaniu. Myślę, że myślący przywódcy Agile (np. Ron Jeffries, Alistair Cockburn) mają dobre pomysły na ten pomysł (np. Shu-Ha-Ri).
Podsumowując tę wędrującą odpowiedź: zdecydowanie skorzystaj z API (NIH jest oznaką niedojrzałości programisty), ale zawsze rozumiem podstawowe zasady. Mam nadzieję, że to pomoże.
źródło
Sortowanie i wyszukiwanie są niezwykle ważne, bez względu na to, czy jesteś fanem Donalda Knutha, czy chcesz zostać kolejną Larry Page. W zależności od branży, w której prowadzisz działalność, oraz poziomu konkurencji, jaką możesz kierować wśród swoich kandydatów, zalecam uwzględnienie w rozmowie niektórych z poniższych koncepcji.
Sortowanie
Badawczy
Niektórzy mogą powiedzieć, że wymaganie kodu dla tych algorytmów to przesada, chyba że praca jest na bezludnej wyspie bez połączenia z Internetem. Inną kwestią jest to, że jeśli masz 30 minut i chcesz zapytać o cokolwiek innego, dla wielu kandydatów wdrożenie tego typu może zająć sporo czasu.
źródło