Dlaczego struktury danych są tak ważne w wywiadach? [Zamknięte]


106

Muszę wyznać, że nie byłem tak silny w strukturach danych, kiedy skończyłem studia. Podczas stażu w kampusie byłem świadkiem, że większość dużych firm technologicznych, takich jak Amazon, Microsoft itp., Koncentruje się głównie na strukturach danych. Wygląda na to, że struktury danych są jedyną rzeczą, jakiej oczekują od absolwenta.

Szczerze mówiąc, czułem się z tym źle. Piszę dobry kod. Postępuję zgodnie ze standardowymi wzorcami projektowymi kodowania, używam struktur danych, ale na powierzchownym poziomie, tak jak w interfejsach API eksponowanych w Javie, takich jak ArrayList, LinkedList itp. Ale firmy zwykle koncentrują się na skomplikowanych aspektach struktur danych, takich jak manipulacja pamięcią opartą na wskaźnikach i złożoność czasu.

Prawdopodobnie z powodu mojego środowiska Java, wtedy rozumiałem wydajność kodu i logikę tylko wtedy, gdy mówiłem o programowaniu obiektowym, takim jak obiekty, instancje itp., Ale nigdy nie zagłębiałem się w poziom bitów i bajtów. Nie chciałem, żeby ludzie patrzyli na mnie z góry z powodu mojego deficytu wiedzy w strukturach danych.

Tak naprawdę, dlaczego cały ten nacisk na struktury danych?


36
Naprawdę nie rozumiem twojego pytania. Mówisz „Piszę dobry kod” - w jaki sposób struktury danych mogą nie być częścią dobrego kodu. I wątpię, by jakikolwiek szczery ankieter miałby na ich punkcie obsesję.
treecoder

6
@greengit: Istnieje różnica między implementacją mapy skrótu a użyciem jej interfejsu API. W rozmowie ceniłbym to, gdyby opisali mi aplikację, a następnie poprosili mnie o zbudowanie centralnych struktur danych i wyjaśnienie moich wyborów.
György Andrasek

7
O co wolałbyś być pytany?
temptar

13
@Jurily - Aby dowiedzieć się, kiedy użyć biblioteki kontenerów, warto mieć wiedzę na temat działania podstawowej struktury danych. Trudno zaakceptować fakt, że wiesz o wydajności kodu, jeśli nie znasz złożoności bibliotek czasowych i przestrzennych używanych bibliotek - tylko dlatego, że działa on dobrze na małych zestawach danych testowych, nie oznacza, że ​​będzie dobrze skalowany do większych zestawów danych w prawdziwym świecie. IMO, rozumienie złożoności czasu i przestrzeni jest tak samo częścią zrozumienia API, jak znajomości nazw klas i metod - być może tym bardziej, że inteligencja nie powie ci o złożoności.
Steve314,

2
Dobra struktura danych daje czysty, prosty kod. Zła struktura danych daje złożony kod. Ważne jest, aby zrobić dobrze.

Odpowiedzi:


121

większość dużych firm technologicznych, takich jak Microsoft, koncentruje się głównie na strukturach danych. Wygląda na to, że struktury danych są jedyną rzeczą, jakiej oczekują od absolwenta.

Nie, jest więcej. Na przykład, możemy również spodziewać się, że będzie szybko uczący się, którzy mogą uczyć się nowych ram Apis lub języków programowania nawet w krótkim czasie. To czysty minimalny pasek. Ktoś, kto nauczy się dużo nowego frameworku, interfejsu API lub języka, nie odniesie sukcesu w większości zespołów Microsoft.

I oczywiście jest wiele innych aspektów, na których skupiamy się w wywiadach, poza zwykłą znajomością struktur danych. Na przykład umiejętność radzenia sobie z niejednoznacznymi specyfikacjami lub rozpoznawanie wzorców kodowania, które wytwarzają niepewny kod, lub tuzin innych rzeczy. Ale umiejętność zrozumienia struktur danych jest z pewnością bardzo duża.

Jest to szczególnie przypadku, że wywiady są dociskane do testowania znajomości struktur danych dla absolwentów CS. Niedawni absolwenci, z których większość nie ma dużego doświadczenia w świecie rzeczywistym, nie powinni być dobrzy w tych samych sprawach, w których ktoś z piętnastoletnim doświadczeniem w branży byłby dobry.

Muszę wyznać, że nie byłem tak silny w strukturach danych

Dobrze, że wiesz o sobie. Jeśli nie możesz lub nie chcesz tego zmienić o sobie, zalecam, abyś nie ubiegał się o pracę wymagającą ułatwienia ze strukturami danych.

istnieje ogólna perspektywa, że ​​dobry programista musi koniecznie mieć dobrą wiedzę na temat struktur danych.

To jest tautologiczne, że dobry programista to programista, który jest dobry w budowaniu programów, które trzeba zbudować. Wielu programistów pracuje nad zadaniami, które nie wymagają głębokiej znajomości struktur danych. Niektóre z nich pracują np. Nad zadaniami wymagającymi dogłębnej znajomości projektowania interfejsu użytkownika. Lub normalizacja bazy danych. Lub cokolwiek. Ci ludzie nadal mogą być „dobrymi programistami” w swoich domenach.

dlaczego cały ten nacisk na struktury danych?

Zadaję pytania dotyczące wywiadu dotyczące struktur danych, ponieważ w moim zespole programiści projektują, wdrażają i manipulują złożonymi strukturami danych przez cały dzień każdego dnia. Wczoraj mieliśmy cztery godziny spotkań, podczas których pół tuzina programistów dyskutowało o zaletach i wadach dodawania pojedynczego pola logicznego do konkretnego węzła drzewa. Prawdopodobnie w moim zespole nie ma umiejętności ważniejszych niż umiejętność zrozumienia struktur danych na głębokim poziomie. Byłoby głupotą nie zadawać pytań na ten temat, ponieważ to właśnie robimy.

Czy brak wiedzy na temat struktur danych naprawdę nie wpływa na karierę programisty?

Cóż, to z pewnością uniemożliwi ci znalezienie pracy w moim zespole. Ale jak powiedziałem wcześniej, programowanie jest ogromną dziedziną. Istnieje wiele rodzajów programowania komputerowego, które nie wymagają znajomości struktur danych.

czy wiedza z tego przedmiotu jest naprawdę wystarczającą podstawą do odróżnienia dobrego i złego programisty?

Nie. Ale prawie zawsze wystarcza wykrycie programistów, którzy raczej nie odniosą sukcesu w Microsoft. Ponieważ to przede wszystkim interesuje mnie wykrywanie, znajomość struktur danych jest jednym z czynników, które sprawdzam w wywiadach.


10
Dzięki za tonę, Eric! To jest najmniej demotywująca odpowiedź, jaką mam na moje pytanie. :-)
Vamsi Emani,

2
@EricLippert, dziękuję za tę doskonałą odpowiedź. Jako samouk, programista, który nie został jeszcze ugryziony przez brak formalnej wiedzy o strukturach danych, czy polecasz książkę, która mogłaby pokazać mi to, czego mi brakowało?
Zamknięcie Cowboy

5
@Closure Cowboy: Dla podstaw struktur danych i algorytmów „Wprowadzenie do algorytmów” Cormena, Leiesersona i Rivesta jest standardowym podręcznikiem. Jeśli interesują Cię funkcjonalne struktury danych, książka Chrisa Okasakiego jest bardzo dobra, ale dość zaawansowana.
Eric Lippert,

2
@ClosureCowboy Sprawdź kurs Coursera „Algorytmy I” oferowany przez Princeton. Jestem również programistą-samoukiem i robi wiele, aby wypełnić luki w wiedzy z zakresu teorii CS.
Evan Plaice,

133

Ważną kwestią dotyczącą struktur danych jest to, że są one uniwersalne i ponadczasowe, przynajmniej do celów praktycznych. Każdy, kto był programistą w ciągu ostatnich 30 lat, powinien znać podstawowe struktury danych, takie jak pojedyncze / podwójnie połączone listy, drzewa binarne lub wykresy. Jeśli zapytasz o nie dwóch programistów, możesz porównać wiedzę programistów według ich odpowiedzi. Trudno powiedzieć o frameworkach, a nawet językach: jeśli zapytasz dwóch programistów o Rails, a jeden wie o wiele więcej niż drugi, co to tak naprawdę mówi? Jak mówisz w pytaniu, inteligentny programista może nauczyć się nowego frameworka wystarczająco szybko, więc testowanie jego obecnej wiedzy nie ma większego sensu.

Czy brak wiedzy o strukturach danych naprawdę wpływa na karierę programistyczną?

Tak. Zdecydowanie. Chyba że chcesz spędzić całe życie na pisaniu aplikacji CRUD.

Czy wiedza na ten temat jest naprawdę wystarczającą podstawą do odróżnienia dobrego i złego programisty?

Nie, to nie wystarczy. Ale jest kilka rzeczy, o które możesz zapytać podczas rozmowy kwalifikacyjnej, które są wystarczające. Powiedziałbym, że znajomość algorytmów jest jednym z lepszych wskaźników, przynajmniej dla osób świeżo po szkole, gdzie nie można pytać o doświadczenia zawodowe.


Trochę nitpick, nie powiedziałbym, że struktury danych są ponadczasowe per se. Wiele struktur jest modelowanych do rozwiązywania problemów z dzisiejszym sprzętem. Na przykład korzystamy z drzewa B +, aby zoptymalizować wyszukiwanie stron plików, ale podstawowy sprzęt się zmienia. Być może dyski SSD mogą wymagać różnych algorytmów, a może bardziej w kierunku dostępu do pamięci RAM niż dysku io. Choć więc sam algorytm może być „ponadczasowy”, jego miejsce i cel nie są
Homde

3
@konrad: Właśnie to miałem na myśli mówiąc „dla celów praktycznych”. Nie mogę wymyślić struktury danych ani algorytmu, który stał się „przestarzały” i wątpię, byś natknął się na jedną podczas rozmowy o pracę. A ponieważ większość algorytmów / struktur danych została opracowana na długo przed naszym obecnym sprzętem i nadal jest przydatna, sądzę nawet, że dzieje się coś w rodzaju koewolucji, w której nowe rozwiązania sprzętowe kierują się znanymi strukturami danych.
nikie

Jeśli / Kiedy współbieżność stanie się de facto obowiązkowa, mogę pomyśleć o wielu strukturach danych, które stają się przestarzałe :)
Homde

9
@konrad: A jeśli / kiedy komputery kwantowe staną się standardem, mogę wymyślić jeszcze kilka. Ale zakładam, że OP nie chce do tego czasu czekać na rozmowy kwalifikacyjne ;-)
nikie

3
... lub kiedy nasi nowi władcy AI powodują, że
mizerni

45

Jestem szybkim uczniem i mogę nauczyć się nowych ram, interfejsów API, a nawet języków programowania w stosunkowo krótkim czasie.

Nie brzmi to zbyt ostro, ale każdy na wpół przyzwoity programista będzie w stanie wybrać nowy język lub framework w stosunkowo krótkim czasie.

Struktury danych są uniwersalne, stanowią podstawowy element informatyki - czerwono-czarne drzewo jest w zasadzie takie samo, niezależnie od tego, czy jest implementowane w Javie, Pythonie, PHP, czy cokolwiek innego. Zamiast więc testować określone języki lub określone ramy, pracodawca (przynajmniej pracodawca poszukujący wyróżniających się programistów) przetestuje, czy znasz podstawy informatyki, a nie tylko jakikolwiek smak miesiąca ” ponownie używam.

(przynajmniej powinni przetestować podstawy oprócz tego, czego obecnie używają ... nie ma sensu zatrudniać kreatora informatyki, jeśli nigdy nie napisał linii kodu w swoim życiu)


1
Informatyka jest tutaj jednym ze słów kluczowych. Struktury danych są zwykle postrzegane dogłębnie w pracach magisterskich i są najwyraźniej ważnym przedmiotem.
James P.

1
Struktury danych są uniwersalne, dopóki nie uzależnisz się od czysto funkcjonalnego programowania: P.
Tikhon Jelvis

30

Czy wierzysz, że kierowcy F1 po prostu jeżdżą szybkimi samochodami? Nie, rozumieją samochód, którym jeżdżą i współpracują z mechanikami / inżynierami, aby go dostroić. Oczywiście normalny kierowca po prostu jeździ.

Możesz być normalnym / przeciętnym programistą, który po prostu pisze kod. Nie rozumiesz, co jest za tobą. Zrobisz wszystko. To wszystko, do zobaczenia następnego dnia.

Ale wiele firm szuka programistów F1. Ludzie, którzy będą się rozwijać, wiedząc, co kryje się za ich kodem. Ludzie, którzy pomogą firmie zbudować coś lepszego.

Dobrze jest znać struktury danych nie tylko dlatego, że będziesz ich często używać w formie „gotowej”. Jest to również dobre, ponieważ stworzysz coś, co wywodzi się z ich pomysłu.



Więc czekaj, czy mówisz, że istnieje korelacja między tym, że jestem programistą, a moim dziwnym nawykiem bliższego poznawania samochodu, nim jeżdżę?
Robbie

@Robbie: +1 LOL Czy lubisz demontować rzeczy?
graffic

2
Tak. Mój tata nauczył mnie rozbierać wszystko na części . Zaniedbał mnie uczyć, jak złożyć wszystko w całość, zastanawiając się nad tym przez całe życie.
Robbie

17

W mojej klasie na temat struktur danych pierwszą rzeczą, o której powiedział profesor, było: W tej klasie nie chodzi o to, by móc wyszukiwać naprawdę szybko. Następnie spędziliśmy pół roku, szukając najlepszych możliwych struktur danych i algorytmów, aby wyszukiwać naprawdę szybko.

Nadal jednak miał rację. Możliwość analizowania struktur danych, zastosowania odpowiedniej struktury danych do danego problemu, a nawet wymyślenia nowych struktur danych wymaga wielu cech inżyniera:

  • Znalezienie abstrakcji do modelowania konkretnego problemu
  • Zdolność do rozkładania problemów
  • Umiejętność logicznego / formalnego rozumowania
  • Kreatywność
  • itp.

Kiedy Amazon i Microsoft zatrudniają ludzi, nie zadają pytań o struktury danych, ponieważ mają nadzieję na wynalezienie kolejnej szybkiej dystrybucji . Chcą upewnić się, że zatrudniają kogoś o wyżej wymienionych cechach.

Oczywiście możliwe jest posiadanie dużego zestawu tych cech i wciąż ssanie struktur danych. Ale jeśli tak jest, nie zajmie ci dużo czasu, aby stać się ekspertem w dziedzinie struktur danych.


To powiedziawszy, wciąż istnieje problem, który ArrayListpo prostu nie do końca się skaluje. Kiedy systemy stają się duże, do wykonania zadania potrzebne są lepiej dostosowane rozwiązania. Bez dobrego zrozumienia struktur danych nie będziesz w stanie znaleźć i skomponować struktur i algorytmów, które w dużej skali są skalowane w konkretnym scenariuszu.


3
A jeśli chodzi o to ArrayList, że bez dobrego zrozumienia struktur danych możesz nawet nie zdawać sobie sprawy, że ArrayListnie do końca się skaluje i musisz znaleźć i skomponować struktury i algorytmy o takiej skali.
phoog,

12

Zasadniczo algorytmy i struktury danych są uważane za dwa najbardziej „twarde” tematy w programowaniu. Jest tak, ponieważ istnieje ogrom pracy i badań dotyczących ich w informatyce. Przyciągają również typowych programistów „lewych płatów”, którzy lubią matematykę i naukę ścisłą (czyli wielu programistów)

Biorąc to pod uwagę, znajomość tych zagadnień może wpłynąć na twoją karierę w zakresie przeprowadzania wywiadów, szczególnie jeśli przeprowadzasz wywiad w miejscach pracy zorientowanych na inżynierię, takich jak google. Inne firmy mogą teraz jednak w ogóle dbać o ten aspekt.

Z mojego doświadczenia wynika, że ​​wymagania algorytmów / struktury danych mogą czasem być postrzegane jako „elitarność programisty”, w której maniacy alfa walczą, by pokazać, kto jest najmądrzejszy. Zawsze dobrze jest wiedzieć, co tam jest, ale istnieje wiele różnych zadań programistycznych, w których nigdy nie będziesz musiał wiedzieć, jak korzystać z czerwonego / czarnego drzewa lub kodować wyszukiwanie boyer-moore.

Poleciłbym dowiedzieć się więcej na te tematy, jeśli uważasz, że są interesujące i masz jakiś osobisty projekt, w którym możesz majstrować przy nich, w przeciwnym razie prawdopodobnie poradzisz sobie bez nich

PS. Znajomość podstawowych struktur danych (powiązane listy, słowniki, tabele itp.) Powinna być obowiązkową wiedzą dla każdego programisty DS.


7

Tak naprawdę, dlaczego cały ten nacisk na struktury danych?

Dwa powody.

Po pierwsze, pokazuje, że możesz myśleć o problemie w sposób abstrakcyjny, a nie w odniesieniu do konkretnego języka programowania. Czy wiesz, dlaczego tabela skrótów może być lepszym lub gorszym wyborem niż czerwono-czarne drzewo w danej sytuacji, niezależnie od podstawowej implementacji?

Po drugie, istnieje przerażająca liczba osób przeprowadzających rozmowy kwalifikacyjne w sprawie pracy, które po prostu kłamią na temat swojego doświadczenia i mają bardzo mało, jeśli w ogóle, zdolności programistyczne; pytania dotyczące struktur danych to szybki sposób na wyeliminowanie tych osób.


Przedstawię tutaj opinię, która prawdopodobnie będzie kontrowersyjna. Pytanie, dlaczego jedna lub druga struktura danych sprowadza się do wydajności i wydajności. Czego mówimy programistom, aby nie robili? Bez przedwczesnej optymalizacji! Chyba że wiesz o profilowaniu, że wybór struktury danych jest przyczyną problemów z wydajnością, „prawo” jeden odebrać to jeden jesteś najbardziej znane. Każda inna decyzja to przedwczesna optymalizacja, a zatem zło!
Tom W

2
Wybór właściwego strukturę danych z przodu w oparciu o stosowalności i oczekiwane cechy wydajności niezależnie od podstawowej implementacji jest nie przykładem przedwczesnej optymalizacji.
John Bode,

Może być wybranie sterty Fibonacciego na sterty binarne. Używanie sterty vs listy (gdy stos jest odpowiedni) nie jest.
user470365

5

Są fundamentalne, ale także, na czym byś quizował absolwentów? Mogą, ale nie muszą, mieć doświadczenia poza pracą zawodową. Ich kurs mógł obejmować technologie Microsoft bardziej niż powiedzieć Javę i odwrotnie. Struktury danych są wspólną płaszczyzną.


+1 za to, na co jeszcze chciałbyś quizować absolwentów, ponieważ nie ma nic innego, co wszyscy absolwenci kierunków zawodowych powinni wiedzieć, że ty również wiesz.
Ian

4

Często najlepszy kod pozwala uniknąć odkrywania struktur danych niskiego poziomu. Jest to szczególnie prawdziwe w językach wysokiego poziomu. Zauważyłem trend w kierunku pytań o strukturę danych niskiego poziomu, nawet w zadaniach CRUD. YMMV, ale wydaje się, że nacisk na wiedzę naukowców hakerów przyćmił inne umiejętności, które sprawiają, że świetny programista:

  • zarządzanie projektami / czasem: być w stanie nadążać za realnym światem napędzanym przez biznes, a nie nową połączoną listę, która działa 1% szybciej.
  • minimalna ilość umiejętności społecznych: arogancki programista, który nie potrafi się dogadać, jest niczym innym jak kotwicą.
  • umiejętność szybkiego i ciągłego uczenia się nowych rzeczy: struktury danych prawie nie zmieniają się przez lata ... ale wszystko inne się zmienia. Struktury danych są świetnymi podstawami i każdy programista powinien je dobrze znać, ale księgowy nie jest sprawdzany pod kątem umiejętności dzielenia się, gdy przychodzi na rozmowę kwalifikacyjną. Świetni programiści to ludzie, którzy potrafią odkrywać nowe rzeczy i im się podobają.

Struktury danych są świetne. Struktury danych są ważne. Każdy programista powinien je zrozumieć. Jednak mamy obsesję na punkcie wypychania tych podstaw poza ich miejsce. Nie chodzi tylko o struktury danych, aw 99% przypadków nie ma potrzeby zadawania pytań poza podstawami struktur danych. Jeśli przeprowadzasz wywiad z księgowym, z pewnością zapytaj go, co to jest 81 podzielone przez 9, ale jeśli wciąż pytasz: „Jaki jest pierwiastek sześcianowy z 98425454242412 * 4512324? ... bez kalkulatora!” wtedy będziesz przerażał spory odsetek rozsądnych, inteligentnych, utalentowanych i przyjaznych ludzi, których mógłbyś mieć. Zapytaj, czy mogą zbudować podstawowy relacyjny model danych, zapytaj, czy mogą korzystać z ulepszonych struktur tablicowych zapewnianych przez odpowiednią strukturę, i zapytaj, czy potrafią wyjaśnić, kiedy wyszukiwanie binarne jest szybsze niż wyszukiwanie płaskie, ale nie ma zbyt wiele sensu, aby wyjść poza to. Jeśli potrafią to zrobić, zacznij szukać najładniejszej, najbardziej profesjonalnej i najbardziej kreatywnej ze wszystkich.

Uwielbiam pisanie Joela, ale myślę, że jego „Java Schools” jest zupełnie nie tak. Istnieje wiele rzeczy, które mogą udowodnić, że ktoś jest mądry poza opanowaniem C ++. Pomyśl o tym, możesz porozmawiać z kimś przez 10 minut, nie pytając go o arytmatykę wskaźnika, i mieć całkiem niezłe pojęcie, czy to oni są typem ludzi, którzy potrafią załatwić sprawę i rozwiązać problem. Nie musimy być tacy:

Przeprowadzający wywiad: „Opowiedz mi o swoich osiągnięciach”.

Coder: „Na moim ostatnim stanowisku byłem jedynym programistą niestandardowego systemu ERP dla firmy finansowej o wartości miliarda dolarów. Dostarczyliśmy miesiące przed terminem, a system jest produkowany od 3 lat.”

Przeprowadzający wywiad: „Pozwól, że wyjaśnię. Opowiedz mi o swoich osiągnięciach programistycznych

Koder: „Umm ...”

Przeprowadzający wywiad: „Na przykład, czy kiedykolwiek stworzyłeś własną listę, do której prowadzi link?”

Coder: „... [wychodzi]”


Ciekawe - dobra lista. Może nieco inne spojrzenie na to? 1. zarządzanie projektem / czasem: umiejętność przygotowania rzeczy w taki sposób, że struktury danych marnują tylko niewielką część czasu na rozmowę kwalifikacyjną. 2. minimalna ilość umiejętności społecznych: programista, który jest w stanie zrozumieć, że ankieterzy zazwyczaj chcą po prostu szybko sprawdzić podstawowe struktury danych przed przejściem do bardziej interesujących obszarów. 3. umiejętność szybkiego i ciągłego uczenia się nowych rzeczy bez zakłóceń, które mogą być spowodowane brakiem wiedzy na temat podstawowych struktur danych.
komar

@gnat - To też jest dobre. Wydaje mi się, że doszedłem do wniosku, że najgłębsze zrozumienie podstaw nie mówi o ogólnej zdolności przekraczającej pewien punkt, ale istnieje tendencja do zakładania czegoś wręcz przeciwnego. Struktury danych są czymś, czego większość ludzi uczy się przez kogoś innego (zwykle przez nauczyciela). Chcę wiedzieć, czego mogą się nauczyć na własną rękę, bo tak działa prawdziwy świat. Dobrzy programiści mogą projektować rozsądne systemy w oparciu o najlepsze praktyki. Wielcy programiści mogą nauczyć się szalonych systemów napisanych przez okropnych programistów przy użyciu najgorszych praktyk i sprawić, by działali.
Morgan Herlocker

1
Mogę sobie wyobrazić, że facet, który pracował nad systemem ERP, nie pasuje do zespołu.
Christopher Mahan

4

Bycie dobrym programistą nie polega na nauce języków i frameworków. Chodzi o umiejętność budowania rozwiązań złożonych problemów. Aby te rozwiązania były wydajne i niezawodne, prawie zawsze będą polegały na dobrych algorytmach i odpowiednim wykorzystaniu struktur danych. Znajomość struktur danych nie wystarczy. Musisz zrozumieć, że struktury danych wystarczą, aby użyć odpowiedniej dla problemu. Listy i mapy oferują niektóre cenne funkcje, ale wiążą się z nimi koszty, a użycie niewłaściwego może znacznie obniżyć wydajność oprogramowania.

Dobry ankieter wie o tym i stara się ustalić, czy możesz być wartościowy dla jego zespołu lub firmy. Języki, których będziesz używać za 2 lata, mogą być bardzo różne, ale potrzeba skutecznych algorytmów i struktur danych nie ulegnie zmianie.


2

Struktury danych, złożoność czasu, manipulowanie pamięcią i wskaźniki to fundamenty, które ktoś, kto nazywa siebie informatykiem, powinien z natury wiedzieć. Każda małpka kodowa może nauczyć się języka i nauczyć się go używać, ale specjaliści CS i studenci powinni się wyróżniać, wiedząc nie tylko, jak korzystać z połączonej listy lub mapy skrótów, ale DLACZEGO.

DLACZEGO naprawdę wyróżnia nas wszystkich od podstawowego skrypciarza, małpy kodowej i chrząkania świata komputerowego. DLACZEGO należy użyć tabeli skrótów zamiast połączonej listy, DLACZEGO moja tabela skrótów powinna mieć gęstość klastra z grubsza .6 -8. 8 DLACZEGO powinienem użyć tutaj listy połączonej cyklicznie zamiast listy podwójnie połączonej. DLACZEGO mój kod powinien działać z wydajnością „x” w najgorszym przypadku i „y” w przeciętnym przypadku.

Te podstawowe struktury danych i wiedza nie tylko o tym, w JAKI sposób są one używane (jak zresztą i tak powinno się odtwarzać w każdym programiście), ale o tym, że język jest obojętny DLACZEGO są używane, co zwykle jest tym, czego szukają w tych przypadkach.

Wiele miejsc sprawi, że napiszesz kod w języku, który znasz, ale jest to bardziej ogólnikowe, ponieważ C nie jest już langua franca w świecie programowania, a pseudokodowanie struktury może być miszmaszem. na miejscu i, w większości przypadków, gdy pseudo-kod / kod p & p tak naprawdę nie jest uczony, właściwie niemożliwe do rozwiązania.


0

Struktury danych stanowią fundament wszystkich programów. Nie musisz mieć dogłębnego ich zrozumienia, ale absolutnie musisz wiedzieć, jak one działają.

Dlaczego? Ponieważ cały kod oddziałuje na dane i manipuluje nimi. Jeśli zestawu danych nie można zapisać w strukturze, nie można go użyć. Dane są jak materiały budowlane domu. Dopóki nie złożysz go w strukturę, po prostu masz bezużyteczny stos desek.

Po podjęciu decyzji o tym, jak myśleć i zdefiniować swój zestaw danych, wtedy można zacząć używać go do robienia rzeczy, klasyczny algorytm część duetu. Każdy program, który piszesz, wykorzystuje strukturę danych, choć w wielu przypadkach struktura ta jest tak uproszczona, że ​​prawie nie istnieje. Kilka zmiennych dla danych stanu i gotowe!

Gdy przejdziesz poza trywialne programy, prawie wszystko wymaga struktury danych. Który wolisz, profesjonalny architekt, który projektuje wieżowiec z najlepszymi praktykami i matematyką, czy wujek Joe Bob, który natychmiast zaczyna budować?


-2

Aby wykorzystać to, co mówi @Pelshoff , oznacza to, że wiesz, co robisz. Jeśli używasz LinkedList do wszystkiego, może to wskazywać, że nie wiesz, co robisz lub nie chcesz przestać myśleć o problemie. Co więcej, przynajmniej kurs dotyczący struktur danych, który odbyłem, obejmował podstawową teorię złożoności tych struktur danych, która w przypadku dużych zbiorów danych jest bardzo ważna. Właśnie dlatego firmy takie jak Amazon czy Microsoft zrobiłyby coś takiego.

Muszę powiedzieć, że zanim wziąłem klasę struktury danych, pomyślałem, że nie są one ważne, ale przynajmniej są w stanie rozpoznać, kiedy lista połączona (lub ArrayList) nie jest praktyczna lub jakie są jej wady.


„Jeśli do wszystkiego używasz LinkedList, może to oznaczać, że nie wiesz, co robisz” lub jesteś programistą Lisp :-)
Peter Alexander

@Peter - co udowodniłoby mój punkt, że nie wiesz, co robisz! ;)
Jetti

wydaje się, że jest to oparte na martwym linku do usuniętej odpowiedzi - dość mylące dla czytelników. Czy masz coś przeciwko edycji, aby się tym zająć?
komar

-2

To, czy piszesz dobry kod, czy nie, jest subiektywnym stwierdzeniem. Ważne jest, aby wiedzieć, że kod funkcjonalny nie zawsze tworzy dobry kod.

To powiedziawszy, struktury danych są ważne, ponieważ są jak zakulisowi pracownicy, którymi kierujesz jako programista. To prawda, że ​​możesz wywoływać metody na strukturze, nie do końca rozumiejąc, co ona robi, i możesz korzystać ze struktury bez poznania sposobu przechowywania danych, ale znajomość tych szczegółów lepiej przygotuje Cię do zrozumienia, kiedy należy zastosować jedną strukturę ponad inne.

Wiedza, na przykład, że możesz przechodzić w obie strony przez podwójnie połączoną listę i tylko do przodu poprzez pojedynczo połączoną listę może pomóc określić, która struktura jest ważna podczas przechowywania danych. Możesz podjąć jeszcze większą decyzję edukacyjną, wiedząc, że pojedynczo połączona lista może potencjalnie mieć mniejszy narzut pod względem zużycia pamięci (ponieważ nie zawiera wskaźników do poprzednich elementów), więc jeśli potrzebujesz tylko iterować listę, możesz zaoszczędzić trochę pamięci, używając odpowiedniej struktury.

To tylko małe przykłady i ostatecznie, jeśli uważasz, że dobrze sobie radzisz w swojej karierze bez dogłębnej znajomości struktur danych, być może nie musisz się więcej uczyć. Jednak zrozumienie tego, co dzieje się pod maską, może naprawdę pomóc w przekształceniu funkcjonalnego kodu w dobry kod.


-3

Struktury danych są elementami składowymi wielu rzeczy, które chcesz robić. Jeśli znasz zastosowania każdej struktury danych, jej słabości i mocne strony, możesz łatwo rozwiązać problemy.

Na przykład mieliśmy wymóg zarządzania tysiącami obiektów. Co jakiś czas musimy aktualizować znacznik czasu obiektu zgodnie z jego identyfikatorem. Co jakiś czas musieliśmy usuwać obiekty, które nie były aktualizowane przez więcej niż X minut.

Jeśli znasz swoje struktury danych, możesz łatwo zdefiniować problem, a także bardzo łatwo znaleźć rozwiązanie. Kiedy programista, który nie zna wystarczającej struktury danych, próbował znaleźć rozwiązanie, jego rozwiązanie było niezręczne. Był jak ty - inteligentny, programista kodów, który szybko uczy się frameworków. Ale bez znajomości struktur danych musiał sam wymyślić koło. Co więcej - miał trudności z zrozumieniem prostszych rozwiązań, ponieważ były one oparte na strukturach danych, których nie rozumiał, takich jak czerwono-czarne drzewa (Twoja stara TreeMap w Javie).

Powiedziałbym więc, że ważne jest, aby wiedzieć, jak i kiedy korzystać z każdej struktury danych bez konieczności myślenia o tym. Ale nie sądzę, aby można to osiągnąć bez faktycznego zrozumienia, jak działają.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.