Czy programowanie lub informatyka w ogóle dotyczą algorytmów?


40

Jako student studiów coraz częściej zdarza mi się, że prestiżowe firmy (takie jak Google, Facebook, Microsoft, ...) zadają pytania dotyczące algorytmów w teście i rozmowach kwalifikacyjnych. Kilka startupów, do których aplikowałem, również pytało o algorytmy. Zastanawiam się, czy płynność algorytmów jest najważniejsza dla programistów w tych firmach?

Jeśli odpowiedź brzmi „tak”, jaka jest najlepsza metoda lub zasoby, aby skutecznie uczyć się i ćwiczyć algorytmy? Wydaje mi się, że nie jestem zainteresowany rozwiązywaniem pozornie zbyt skomplikowanych problemów spotykanych w większości podręczników lub stron internetowych. Chociaż łatwo rozumiem podstawowe algorytmy (takie jak quicksort, bubblesort, ...), bardzo trudno jest mi je zapamiętać i wykorzystać później.

Dzięki.

P / S: Jeśli pytasz mnie, co lubię, to buduje dobre oprogramowanie do innowacyjnego rozwiązywania problemów użytkowników. Przypuszczam, że nie musi to oznaczać, że oprogramowanie musi być bardzo skomplikowane.


26
Masz pojęcie, jak skomplikowane jest Google, aby umożliwić Ci przeszukiwanie całej sieci za pomocą pola tekstowego i przycisku?
JeffO

21
@JeffO Już nawet nie używam przycisku ;-)
wałek klonowy

1
Jeśli Google to ułatwi, wszystkie inne witryny wyszukiwania nie będą w ogóle potrzebować żadnego kodu.
JeffO

Myślałem, że pytanie dotyczy tego, jak działają komputery, jak działa procesor, jak działa pamięć RAM, jak działa wifi itp. To dość interesujące pytanie, które wciąż jest przedmiotem wielu badań. Wciąż uważam, że sprzęt jest bardziej niesamowity niż wszyscy maniacy programowania w Javie lub PHP.
Jokoon

2
Nie chodzi tylko o algorytmy, ale w rzeczywistości są one podstawą CS. Ale programowanie to coś więcej niż tylko algorytmy i logika (na przykład utrzymanie kodu nie wymagałoby jedynie znajomości algorytmów).
haylem

Odpowiedzi:


44

Algorytmy są jasne

Oto piękna cecha algorytmów: zajmowana przez nich przestrzeń problemowa jest dobrze zdefiniowana, tzn. Twoje wymagania są nie tylko faktycznie znane , ale zwykle nawet sformalizowane podobnie jak wskaźniki jakości rozwiązania.

Więc jeśli powiem ci, abyś wymyślił algorytm, nie ma dużego potencjału problemów z komunikacją, a mierzenie wydajności jest trywialnym zadaniem. Jednocześnie wydajność jest dość dobrym wskaźnikiem umiejętności logicznego myślenia.

Algorytmy są wydajnym filtrem

Obecnym problemem branży (i edukacji) jest niska średnia jakość absolwentów. Zostało to zilustrowane testem FizzBuzz , który jest:

Napisz program, który przejdzie przez liczby od 1 do 100 i wypisze „fizz”, jeśli liczba jest podzielna przez 3, „brzęczenie”, jeśli jest podzielna przez 5, a sama liczba, jeśli nie jest podzielna przez żadną.

Najwyraźniej większość absolwentów Comp Sci nie rozwiązuje tego problemu. Należy pamiętać, że jest to pytanie algorytmiczne, choć oczywiście żenująco proste. Biorąc to pod uwagę, zdobywając kogoś, kto może rozwiązać problemy podane w Google Code Jam lub Project Euler, już lubisz crème-de-la-crème.

Algorytmy to niewielka część tworzenia oprogramowania

Prawda jest taka, że ​​gdy tylko zaczniesz pracować w branży, nie będziesz używać umiejętności algorytmicznych więcej niż 1% czasu.

Zanim zaczniesz pisać kod, musisz najpierw zebrać i przeanalizować wymagania. Następnie musisz zsyntetyzować swój projekt na ich podstawie. Następnie musisz wdrożyć projekt. Następnie musisz ocenić implementację pod kątem oryginalnych wymagań, następnie powtórzyć wymagania, następnie iterować projekt, następnie iterować implementację i tak dalej.

Jednym z wymagań jest rozsądna wydajność. Jeśli to wymaganie nie jest spełnione, musisz profilować swoją implementację, aby wyśledzić wąskie gardła, a następnie możesz ją zoptymalizować, co czasami jest kwestią bezpośredniej mikrooptymalizacji (co jest raczej łatwe do zrobienia), ale czasem jest to kwestia używając lepszych algorytmów (co nie zawsze jest później łatwe). W związku z tym:

Algorytmy są krytyczne

Im lepsze zrozumienie algorytmów, tym większa szansa, że ​​uda Ci się to zrobić za pierwszym razem. W przeciwnym razie możesz nie tylko napotkać problem, który można rozwiązać tylko za pomocą lepszego algorytmu, ale nie będziesz w stanie go rozwiązać.
Więc chociaż prawie nigdy nie potrzebujesz tej umiejętności, stanowi ona jeden punkt niepowodzenia w twojej metodologii rozwoju, a jeśli jej nie masz, możesz mieć tylko nadzieję, że taka konieczność nigdy się nie pojawi, lub że ktoś inny wskoczy, by ją naprawić ty.

To, co jest naprawdę ważne, to wyczuć złożoność obliczeniową i jak utrzymać ją na niskim poziomie, jak wyjaśniłem również w odpowiedzi na podobne pytanie . Lub specjalizować się w rzeczach, w których to po prostu nie jest ważne, takich jak tworzenie GUI, ale z drugiej strony prawie wszyscy go nienawidzą ... z jakiegoś powodu!


5
+1 za bardzo kompleksową i inteligentną odpowiedź. Smutne jest także, jak skuteczny jest filtr FizzBuzz. Nie ma absolutnie usprawiedliwienia, że ​​nie można tego zrobić.
Adam Crossland,

4
Pomyślałem, że powinieneś drukować, fizzbuzzjeśli liczba jest podzielna przez jedno i drugie, i wielu się w tym wsuwało, ponieważ musisz starannie sprawdzać modulo.
Matthieu M.,

1
1% może być nieco za wysoki
konopie

1
@ MatthieuM .: drukowanie obu jest nieodłącznie związane ze sformułowaniem wymagania. Brak tego oznacza, że ​​nie sprawdziłeś dokładnie wymagań; teraz uważam, że interesujące jest to, że nie mówi się, że trzeba je drukować w określonej kolejności, a nawet konsekwentnie w tej samej kolejności ...
jmoreno

1
@ back2dos: tak, ale robienie tego w losowej kolejności wydaje się zabawniejsze ... zauważ, że wymagania podane w tej odpowiedzi nie wspominają o wierszach, tylko o drukowaniu . Jeśli dostaniesz test FizzBuzz, warto wskazać, że istnieje wiele niepotwierdzonych założeń (z drugiej strony może to po prostu sprawić, że zostaniesz pomalowany jako mądry).
jmoreno

30

Ogólnie rzecz biorąc, programowanie jako zadanie nie polega na algorytmach. Możesz spędzić lata na programowaniu aplikacji CRUD, nie wymagając głębokich umiejętności algorytmicznych.

Programowanie jako praca dotyczy:

  1. Komunikacja:

    • Twój kod źródłowy jest środkiem do komunikowania twoich pomysłów rówieśnikom. Jeśli nikt nie może odczytać / zrozumieć twojego kodu, jest to bezwartościowe.

    • Samotny programista, który nie rozmawia z żadnym innym programistą, prawdopodobnie zacznie popełniać błędy w kodzie i uważa, że ​​jego własne podejście jest jedynym dopuszczalnym.

    • Musisz wiedzieć, jak komunikować się z interesariuszami, działem kontroli jakości, użytkownikami, projektantami wizualnymi, DBA itp.

    • Jako doświadczony programista musisz uczyć mniej doświadczonych kolegów, którzy chcą doskonalić swoje umiejętności.

  2. Znajomość odpowiednich narzędzi: kontroli wersji, systemu śledzenia błędów, IDE, który język lepiej nadaje się do określonego zadania i dlaczego, jak korzystać z analizy kodu itp.

  3. Szeroka wiedza i kultura: jakie są języki funkcjonalne? Jak komputery interpretują kod? Dlaczego LOC jest bezsensownym środkiem? itp.

  4. Głęboka znajomość języków, z którymi pracujesz.

  5. Algorytmy

Z drugiej strony informatyka jest bardziej zorientowana na algorytmy. Jeśli pracujesz jako naukowiec, może to nie mieć nic wspólnego z pracą programisty, a Ty popracujesz nad tym, jak zoptymalizować algorytm, jak przekształcić reprezentację danych w inną itd.


12
-1: „Aplikacje CRUD” to algorytmy. Są po prostu (ogólnie) proste. Nie ma „szlachetnego znaczenia”.
S.Lott,

2
a kod źródłowy jest twoim jedynym kanałem komunikacji z komputerem, który robi dokładnie to , co mu każesz (i prawie nigdy nie to, co chcesz)
maniak ratchet,

5
To niesamowite, jak dobry jest rynek do czyszczenia aplikacji CRUDdy, których zespoły inżynieryjne zignorowały (lub nigdy nie nauczyły się) podstaw algorytmów.
JasonTrue

2
@ S.Lott: „Aplikacje CRUD są algorytmami” są analogiczne do „Jestem Ameryką”. ;)
Jim G.

1
@JimG: Jak mówi Steven Colbert „Jestem Ameryką i ty też możesz”. Aplikacje CRUD zawierają, są oparte, obejmują, są implementacjami, są realizacjami, zawierają, odzwierciedlają algorytmy. Skarżyłeś się tylko, nie sugerując konkretnego przyimka. Co by cię uszczęśliwiło?
S.Lott,

16

Myślę, że pytania dotyczące algorytmów w wywiadach to jeden z głównych sposobów, w jaki firmy próbują ocenić znajomość podstaw informatycznych przez kandydata. Chociaż nie jest to jedyny ważny obszar umiejętności dla profesjonalnego programisty, jest to jedna z kluczowych kompetencji dobrego programisty.

Myślę, że powodem, dla którego wiele dużych firm kładzie nacisk na podstawy CS w procesie rozmowy kwalifikacyjnej, jest to, że jest to podstawowa umiejętność, która jest rozwijana najmniej po ukończeniu studiów i przejściu na siłę roboczą. Praktyczna umiejętność programowania, umiejętności projektowania, praktyki inżynierii oprogramowania i tym podobne to wszystko, co jest rozwijane przede wszystkim poprzez doświadczenie, podczas gdy podstawy CS są przede wszystkim rozwijane w trakcie edukacji.

Jeśli chodzi o ćwiczenie projektowania algorytmów, Steve Yegge zaleca Podręcznik projektowania algorytmów Skieny w swoim doskonałym przewodniku po rozmowach kwalifikacyjnych jako programista .


4
+1: języki programowania, frameworki, system operacyjny, edytory, zestawy narzędzi, wszystkie one przychodzą i znikają, ale wiedza na temat skutecznego rozwiązywania problemów ma wszystko wspólnego ze znajomością podstaw struktur danych i algorytmów. Te rzeczy pozostają z nami zawsze.
Adam Crossland

„Jeśli chodzi o ćwiczenie projektowania algorytmów, Steve Yegge poleca Podręcznik projektowania algorytmów Skieny w swoim doskonałym przewodniku po rozmowach programistycznych”. Przykro nam, ale może to nie dotyczyć osoby, która zadała to pytanie, ponieważ akurat jest studentem. Google / MS przeszedł z Skiena (dla studentów) do zadawania pytań, które pojawiły się w międzynarodowych konkursach kolegialnego programowania. (Wiem to na pewno z niepotwierdzonych doświadczeń). Książka Skieny jest nadal używana - ale głównie dla kandydatów na studia licencjackie.
user396089

Jeśli chodzi o pytania, które pojawiają się w konkursach programistycznych - jesteś całkiem nieufny, jeśli nie widziałeś wcześniej tego pytania (chyba że twoje IQ również zdarza się, że jest o 3 SD od normalnego)
użytkownik396089

11

Jako odnoszący sukcesy programista, który jest samoukiem i odbył tylko kilka kursów informatyki na studiach, powiem, że największymi problemami, przed którymi stoi dziś biznes, nie jest zdolność wszystkich ich programistów do napisania algorytmu sortowania bąbelkowego w najbardziej efektywny sposób możliwy. Prawdziwe problemy, przed którymi stoją firmy:

  • Programiści, którzy nie mogą szybko się uczyć i dostosowywać do nowych domen

  • Programiści, którzy nie mogą w znaczący sposób współdziałać społecznie z klientami lub interesariuszami

  • Programiści, którzy nie mogą zgadywać i kwestionować niepoprawnych lub źle przemyślanych wymagań biznesowych

  • Programiści, którzy nie rozumieją, jak dokładnie przetestować swój kod i funkcje

  • Programiści, którzy nie są w stanie dostarczyć wiarygodnych oszacowań w odpowiednim czasie

  • Programiści, którzy nie mogą tworzyć jasnej i zwięzłej dokumentacji

  • Deweloperzy, którzy nie potrafią samodzielnie uruchomić się lub przejąć sytuacji

Dziewięć razy na dziesięć postawię zakład, że prawie wszystkie okoliczności, w których deweloper flirtuje w firmie, ponieważ beznadziejnie zawodzą w jednej z powyższych cech. Zapomnij o Google i Facebooku, są to przypadki wyjątkowe i mają uzasadnioną potrzebę dla osób, które głęboko rozumieją informatykę.

Prawdziwe firmy nie zmagają się jednak ze złożonością informatyki, lecz ze złożonością ludzkości. Problem polega na tym, że NAPRAWDĘ trudno jest przetestować wyżej wymienione cechy. Przez większość czasu musisz oceniać ludzi na podstawie tych cech na podstawie reakcji jelit. Jest to trudne, jeśli nie masz dobrych ludzi umiejętności i intuicji, o wiele łatwiej jest sprawdzić znajomość algorytmu.


+1 Regularne i dziwaczne firmy, które nie przypominają Google'a, potrzebują ludzi o dobrych umiejętnościach biznesowych, a przede wszystkim do zrozumienia, jak wymyślić / zastosować / zarządzać / modyfikować procesy. Nie jest błędem, że firmy podobne do Google'a nie wykluły się na zwinnym ruchu, ponieważ informatyka nie polega na rozwiązywaniu problemów biznesowych.
S.Robins,

10

Osobiście postrzegam „standardowe” algorytmy i struktury danych jako część słownika programisty. Wiele praktycznych problemów, które napotykasz jako programista, często zawiera rozwiązanie, które (przynajmniej częściowo) wyraża się w tym słownictwie.

Posługując się tym słownictwem, nie musisz wymyślać „własnych” rozwiązań (by tak rzec wynaleźć na nowo koło), dzięki czemu możesz pracować mądrzej i często szybciej.

„Nie mogę się zainteresować rozwiązywaniem pozornie zbyt skomplikowanych problemów występujących w większości podręczników lub stron internetowych”

„Trudno mi zapamiętać i wykorzystać je później”

Zmusić się do ich ukończenia. Podziękujesz sobie później. Nawet jeśli nie pamiętasz ich szczegółowo (chociaż z wystarczającą praktyką na pewno to zrobisz), możliwość powiedzenia „Pamiętam rozwiązanie czegoś podobnego za pomocą algorytmu X lub struktury danych Y” bardzo ci pomoże. Nawet jeśli wymaga to sprawdzenia szczegółów i odświeżenia pamięci.


+1 dla struktur danych. Są drugą połówką monety algorytmicznej.
Spencer Rathbun

9

Chociaż nie możesz być dobrym programistą bez znajomości swoich algorytmów, niesprawiedliwe jest utrzymywanie innych aspektów zawodu programisty poza zasięgiem wzroku. Na przykład ścisła dyscyplina i dobra znajomość języka ojczystego są co najmniej tak samo ważne dla bycia dobrym programistą, jak znajomość algorytmów. Nie należy również nie doceniać znaczenia zrozumienia podstawowych narzędzi, takich jak języki programowania, systemy kontroli źródła, środowiska testowe i tak dalej.

Jednak jeśli chodzi o wywiady, pomiar zrozumienia algorytmów jest znacznie prostszy niż pomiar innych umiejętności związanych z pracą jako programista. Dlatego ankieterzy często koncentrują się na pytaniu o algorytmy i zwracają szczególną uwagę na sposób ich wyjaśnienia podczas rozmowy. Nie dlatego, że inne rzeczy są mniej ważne, ale dlatego, że trudno jest ocenić te inne rzeczy w ciągu 30 minut przeznaczonych na rozmowę.


1
+1 Idealna odpowiedź! Łatwiej jest sprawdzić znajomość algorytmu.
wałek klonowy

„twoje algorytmy” - jestem samoukiem. Czy jest gdzieś źródło lub lista, która określa, jakie są te powszechne algorytmy, które każdy programista powinien wiedzieć? Chciałbym je przeczytać. Dzięki!
Ominus

2
@Ominus Chociaż nie ma ogólnego konsensusu w sprawie „listy dżentelmenów”, w większości przypadków będzie to obejmować wyszukiwanie, sortowanie, przechodzenie przez struktury danych pozbawione ciągłości przestrzennej (listy połączone, drzewa binarne itp.) Oraz szczątkowe (błędne) zastosowania rekurencji (rekurencyjna silnia, sekwencja Fibonacciego itp.)
dasblinkenlight

@Ominus - Ja też jestem samoukiem, ale myślę, że „Wprowadzenie do algorytmów” - CLRS to dobry sposób na zapoznanie się z tą dziedziną. Dobra jest także książka Skieny „Podręcznik projektowania algorytmów”.
Tod

5

Tak, programowanie dotyczy głównie algorytmów.

Ale może nie w tym sensie, że myślisz.

Mam wrażenie, że wszyscy używamy różnych definicji algorytmu. Szczerze mówiąc, na to pytanie trudno odpowiedzieć, ponieważ algorytm jest niejasnym terminem. Użyję definicji Wikipedii, aby odpowiedzieć na to pytanie:

Zestaw reguł precyzyjnie definiujących sekwencję operacji.

To jest serce i dusza programowania. Kiedy piszesz dowolny kod, po prostu implementujesz algorytm. Jeśli piszesz niektóre aplikacje CRUD, wdrażasz prosty algorytm. Umiejętność opracowania algorytmu rozwiązania problemu jest tym, czym jest programowanie. Reszta to tylko szczegóły.

Nie zgadzam się z poprzednim plakatem, który mówi, że głębsze rozumienie języka jest ważniejsze niż rozumienie algorytmów. Każdy dobry programista powinien być w stanie dogłębnie nauczyć się języka, ale bez algorytmów nie można wymyślić żadnego kodu na własną rękę.


Z innej perspektywy, w matematyce serce i dusza mogą być algorytmami, jednak w przypadku programowania jest to coś innego. Możesz pisać oprogramowanie bez algorytmów per se (być może nie jest to dobre oprogramowanie), ale nie możesz pisać oprogramowania bez logiki i abstrakcyjnego myślenia. W sercu leży jednak rozwiązywanie problemów. Znalezienie rozwiązania jest procesem algorytmicznym, ale samo rozwiązanie niekoniecznie jest algorytmem.
S.Robins,

4

Odpowiedź zależy całkowicie od wykonywanej pracy. Niektóre pola są szczególnie bardziej skoncentrowane na algorytmach niż inne. Rozmawiając z tą notatką, miałem przyjemność przeprowadzać wiele wywiadów z Amazonem. Mimo że pozycja nie miałaby wiele wspólnego z tymi złożonymi algorytmami, zastanawiałem się, jak wykonać zadanie zamortyzowane na stały czas.

To, co świadczy o silnym zrozumieniu algorytmów, stanowi dowód dla twojego potencjalnego pracodawcy, że jesteś trafnym narzędziem do rozwiązywania problemów. To nie jest tak naprawdę dobry wskaźnik (IMO) dobrego pracownika, ale niektórzy pracodawcy używają go do badań przesiewowych. Jeśli ubiegasz się o stanowisko, które wymaga dyplomu ukończenia studiów, oczekuje się, że będziesz mieć bardziej rygorystyczne podstawy w algorytmach.

To, co (IMO) jest niezwykle pomocne w praktyce, to nie zapamiętywanie określonych algorytmów, ale poprzez zrozumienie, w jaki sposób działają niektóre algorytmy, znajduje się ta mała bryłka z tyłu umysłu, w której powiesz „Widziałem to wcześniej” lub „Wiem, że można to zrobić lepiej ”, co spowoduje rozpoczęcie badań nad rozwiązaniem Twojego problemu.


+1 za rozmowę o pasku zatrudnienia dla studentów. Niektóre firmy są znacznie bardziej wymagające przy zatrudnianiu studentów niż studentów. Ale aby być uczciwym wobec nich, studenci są również lepiej opłacani i zazwyczaj rekrutowani na wyższym poziomie wewnętrznie.
user396089

1

Zawsze myślę, że programowanie opiera się bardziej na danych niż na algorytmach. Ale w takim razie, jaki jest użytek z danych, jeśli tego nie zrobisz ... wszystkie te manipulacje są algorytmami. Tak więc tak, programowanie jest w całości oparte na algorytmach.

To może nie wyglądać jak matematyka, a wiele pracy algorytmicznej, którą wykonujesz na co dzień, jest po prostu rzeczą, taką jak wysyłanie danych między GUI a programem, ale to też liczy się jako algorytm. Wstawianie elementu do pola listy jest standardowym algorytmem wstawiania, który ma własne problemy, takie jak manipulowanie wydajnością i strukturą listy.


1

Tylko programiści pracujący dla tych firm mogą naprawdę odpowiedzieć na twoje pytanie. Rodzaje algorytmów, o których mowa w powiedzeniu „Wprowadzenie do algorytmów”, prawdopodobnie odegrały pewną rolę w 0,01% mojego życia programistycznego w ciągu ostatnich 25 lat. Kiedy potrzebuję struktury danych lub sortowania, zwykle dostarczone biblioteki lub frameworki mają to, czego potrzebuję. Kiedy potrzebuję super szybkiego FFT, znajduję coś w rodzaju biblioteki Intel Math, zamiast pisać ją samodzielnie. Potrafię jednak odróżnić to, co robią w Google, od tego, co zrobiłem w swojej karierze. Książka Skieny „Podręcznik projektowania algorytmów” była otwarta ze względu na opowiadane przez nią historie wojenne. Możesz powiedzieć, że używa algorytmów w swojej pracy DUŻO.

Z mojego doświadczenia jako niezależnego konsultanta programowego wynikają trzy rzeczy: 1. Skuteczna komunikacja z klientami 2. Pisanie działającego kodu. 3. Zarządzanie złożonością

Wykonanie tylko liczb 1 i 2 nie wystarczy. Jeśli kodu nie da się utrzymać (przez kogoś innego niż programista), który go napisał, jest skazany na niepowodzenie.

Numer 3 to najtrudniejsza umiejętność programowania. Wymaga przemyślenia architektury, projektowania i kodowania. Wymaga opanowania refaktoryzacji. Wymaga zrozumienia zasad SOLID / DRY. Gdybym musiał zatrudnić programistę, który przeczytał Wstęp do algorytmów i poświęcił się jego opanowaniu, lub takiego, który czytał Pragmatycznego programistę i poświęcił się byciu jednym, zatrudniłbym go za każdym razem. (Nie to, że muszą się wzajemnie wykluczać).


1

Tak.

Informatyka to głównie algorytmy (procentowo).

Nie.

Ale to jest „nauka” komputerów. Najczęstszym zastosowaniem informatyki jest inżynieria oprogramowania. Inżynieria oprogramowania to nie tylko algorytmy. Chodzi przede wszystkim o sztukę tworzenia, dążenie do perfekcji i koncentruje się na pozytywnym wpływie na życie prawdziwych ludzi, którzy istnieją dzisiaj. Podczas gdy informatyka może mieć tę samą motywację, jest to dalekie od inżynierii oprogramowania.

Zapytaj zatrudnionego profesora na dużym Uniwersytecie Informatyki, co jest najważniejsze w programowaniu, i prawdopodobnie powie Ci „algorytmy i struktury danych”

Zapytaj starszego programistę w dużej firmie programistycznej, co jest najbardziej istotną rzeczą do zrozumienia w programowaniu, a oni prawdopodobnie powiedzą ci, „uczenie się zachwycania klientów” (implikowane to rozumienie zwinne, myślenie jak klient, terminowa dostawa i ciągle, dzięki czemu rzeczy działają itp.)

Może to wydawać się semantyką, ale z mojego zrozumienia oba są niezwykle różne, zarówno w praktyce, jak i teorii.


1

Gdybym musiał wybrać jedną rzecz w informatyce jako najważniejszą jej część, wybrałbym abstrakcje , a nie algorytmy.


1

W informatyce, jakich pojęć się nauczysz, nie przydadzą się, dopóki ich nie pokażesz. Problem jest głównym problemem, który należy rozwiązać, więc algorytm jest krótkim planowaniem, w jaki sposób problem zostanie rozwiązany w ogóle. Dlatego jest to poważny problem w świecie informatyki.

Myślę, że prawie każdy aspekt informatyki potrzebuje algorytmu Pozwól, że ci to pokażę Poniższa lista zawiera różne obszary informatyki i stosowane przez nich algorytmy.

Automaty

Budowa zestawu zasilającego. Algorytm przekształcenia niedeterministycznego automatu w deterministyczny. Algorytm Todda-Coxetera. Procedura generowania cosets.

Sztuczna inteligencja

Alpha beta. Alpha max plus beta min. Szeroko stosowany w grach planszowych. Algorytmy mrówek. Optymalizacja kolonii mrówek to zestaw algorytmów zainspirowanych zachowaniem mrówek w celu rozwiązania problemu, znalezienia najlepszej ścieżki między dwiema lokalizacjami. DE (Ewolucja różnicowa). Rozwiąż problem dopasowania wielomianowego Czebyszewa. Ujęcie częściowo nadzorowane zdań sarkastycznych w internetowych recenzjach produktów. Algortithm, który rozpoznaje sacarsms lub ironię w tweecie lub dokumencie internetowym. Taki algorytm będzie również niezbędny do programowania robotów humanoidalnych.

Wizja komputerowa

Skrót. Reprezentuj obraz lub wideo przez mniejszy. Zliczanie obiektów na obrazie . Używa algorytmu etykietowania podłączonego komponentu, aby najpierw oznaczyć etykietą każdy obiekt, a następnie policzyć, a następnie obiekty. Algorytm O'Carroll. Na podstawie matematycznej konwersji widzenia owadów algorytm ocenia, jak ominąć obiekty.

Algorytmy genetyczne

Używają trzech operatorów. wybór (wybierz rozwiązanie), reprodukcja (użyj wybranych rozwiązań, aby skonstruować inne), zamiana (wymień rozwiązanie, jeśli jest lepsze).

Wybór proporcjonalny do kondycji. Znany również jako wybór koła ruletki, jest funkcją służącą do wybierania rozwiązań. Wybór obcięcia. Kolejna metoda wyboru rozwiązań, uporządkowana według sprawności. Wybór turnieju. Wybierz najlepsze rozwiązanie według rodzaju turnieju. Stochastyczne uniwersalne pobieranie próbek. Poszczególne osoby są odwzorowane na ciągłe odcinki linii, dzięki czemu odcinek każdego z osobna ma taką samą wielkość jak jego przydatność dokładnie tak, jak przy wyborze koła ruletki.

Sieci neuronowe

Siatka Hopfield. Nawracająca sztuczna sieć neuronowa, która służy jako adresowalne systemy pamięci z binarnymi jednostkami progowymi. Konwergują się w stan stabilny. Propagacja wsteczna. Nadzorowana technika uczenia stosowana do szkolenia sztucznych sieci neuronowych. Mapa samoorganizująca się (mapa Kohonen). Sieci neuronowe wyszkolone przy użyciu uczenia bez nadzoru w celu uzyskania reprezentacji próbek treningowych w niskim wymiarze (2D, 3D). Dobry do wizualizacji danych wielowymiarowych.

Bioinformatyka

Needleman-Wunsch. Wykonuje globalne dopasowanie dla dwóch sekwencji, dla sekwencji białkowych lub nukleotydowych. Smith-Waterman. Wariacja Needlemana-Wunscha.

Kompresja

Algorytmy kompresji bezstratnej

Transformacja Burrowsa-Wheelera. Wstępne przetwarzanie przydatne w celu poprawy bezstratnej kompresji. Siadać. Kompresja danych używana przez ZIP. Kodowanie Delta. Pomoc na kompresję danych, w których często występują dane sekwencyjne. Kodowanie przyrostowe. Kodowanie delta stosowane do sekwencji ciągów. LZW. (Lempel-Ziv-Welch). Następca LZ78. Tworzy tabelę translacji z danych do kompresji. Jest używany przez format graficzny GIF. LZ77 i 78. Podstawa dalszych wariantów LZ (LZW, LZSS, ...). Obaj są koderami słownikowymi. LZMA. Skrót od algorytmu łańcuchowego Lempel-Ziv-Markov. LZO. Algorytm kompresji danych skoncentrowany na szybkości. PPM(Prognozowanie przez częściowe dopasowanie). Adaptacyjna technika kompresji danych statystycznych oparta na modelowaniu i prognozowaniu kontekstowym. Kodowanie Shannon-Fano. Konstruuje kody prefiksów na podstawie zestawu symboli i ich prawdopodobieństw. Obcięty plik binarny. Kodowanie entropijne zwykle stosowane do jednolitych rozkładów prawdopodobieństwa za pomocą skończonego alfabetu. Popraw kodowanie binarne. Kodowanie długości przebiegu. Podstawowa kompresja, która zastępuje sekwencję tego samego kodu liczbą wystąpień. Sequitur. Inkrementalne wnioskowanie gramatyczne na łańcuchu. EZW (Embedded Zerotree Wavelet). Progresywne kodowanie w celu kompresji obrazu do strumienia bitów ze zwiększającą się dokładnością. Może być kompresją stratną również z lepszymi wynikami.

Kodowanie entropii Schemat kodowania, który przypisuje kody do symboli, aby dopasować długości kodu do prawdopodobieństwa symboli.

Kodowanie Huffmana. Prosta kompresja bezstratna wykorzystująca względne częstotliwości znaków. Adaptacyjne kodowanie Huffmana. Technika kodowania adaptacyjnego oparta na kodowaniu Huffmana. Kodowanie arytmetyczne. Zaawansowane kodowanie entropijne. Kodowanie zakresu. To samo co kodowanie arytmetyczne, ale spojrzał na to nieco inaczej. Jednoznaczne kodowanie. Kod reprezentujący liczbę n z n, po których następuje zero. Kodowanie Delta, gamma, omega. Uniwersalny kod kodujący dodatnie liczby całkowite. Kodowanie Fibonacciego. Uniwersalny kod, który koduje dodatnie liczby całkowite w binarnych słowach kodowych. Kodowanie Golomb. Forma kodowania entropijnego, która jest optymalna dla alfabetów po rozkładach geometrycznych. Kodowanie ryżu. Forma kodowania entropijnego, która jest optymalna dla alfabetów po rozkładach geometrycznych.

Algorytmy kompresji stratnej

Liniowe kodowanie predykcyjne. Kompresja stratna reprezentująca obwiednię widmową cyfrowego sygnału mowy w formie skompresowanej. Algorytm A-law. Standardowy algorytm towarzyszący. Algorytm Mu-law. Standardowy algorytm kompresji lub kompandowania sygnału analogowego. Kompresja fraktalna. Metoda stosowana do kompresji obrazów za pomocą fraktali. Przekształć kodowanie. Rodzaj kompresji danych dla danych takich jak sygnały audio lub obrazy fotograficzne. Kwantyzacja wektorowa. Technika często stosowana w stratnej kompresji danych. Kompresja falkowa. Forma kompresji danych dobrze dostosowana do kompresji obrazu i dźwięku.

Kryptografia

Tajny klucz (szyfrowanie symetryczne)

Użyj tajnego klucza (lub pary bezpośrednio powiązanych kluczy) zarówno do deszyfrowania, jak i szyfrowania.

Advanced Encryption Standard (AES) , znany również jako Rijndael. Blowfish. Zaprojektowany przez Schneiera jako algorytm ogólnego przeznaczenia, przeznaczony jako zamiennik starzejącego się DE. Data Encryption Standard (DES) , wcześniej DE Algorytm. IDEA (międzynarodowy algorytm szyfrowania danych) . Poprzednio IPES (Improved PES), kolejny zamiennik DES. Jest używany przez PGP (Pretty Good Privacy). Wykonuje transformacje danych podzielonych na bloki, używając klucza. RC4 lub ARC4. Szyfrowanie strumieniowe powszechnie stosowane w protokołach, takich jak SSL dla ruchu internetowego i WEP dla sieci bezprzewodowych. Mały algorytm szyfrowania. Łatwy do wdrożenia algorytm szyfru blokowego przy użyciu niektórych wzorów. PES (proponowany standard szyfrowania). Starsza nazwa IDEA.

Klucz publiczny (szyfrowanie asymetryczne)

Użyj pary kluczy oznaczonych jako klucz publiczny i klucz prywatny. Klucz publiczny szyfruje wiadomość, tylko klucz prywatny pozwala ją odszyfrować.

DSA (algorytm podpisu cyfrowego). Generuj klucze z liczbami pierwszymi i losowymi. Był używany przez agencje amerykańskie, a teraz jest własnością publiczną. ElGamal. Na podstawie Diffie-Hellman, używanego przez oprogramowanie GNU Privacy Guard, PGP i inne systemy kryptograficzne. RSA (Rivest, Shamir, Adleman). Szeroko stosowany w protokołach handlu elektronicznego. Użyj liczb pierwszych. Wymiana kluczy Diffie-Hellman (Merkle) (lub wykładnicza wymiana kluczy). Metoda i algorytm współdzielenia tajnego klucza przez niezabezpieczony kanał komunikacyjny. Używany przez RSA. NTRUEncrypt. Użyj pierścieni wielomianów z mnożeniem splotowym.

Funkcje podsumowania wiadomości

Skrót wiadomości to kod wynikający z szyfrowania łańcucha lub danych o dowolnej długości, przetwarzany przez funkcję skrótu.

MD5. Służy do sprawdzania obrazów ISO dysków CD lub DVD. RIPEMD (RACE Integrity Primitive Evaluation Message Digest). Oparty na zasadach MD4 i podobnych do SHA-1. SHA-1 (Bezpieczny algorytm mieszania 1). Najczęściej używany zestaw powiązanych funkcji kryptograficznych SHA. Został zaprojektowany przez agencję NSA. HMAC. uwierzytelnianie wiadomości z kluczem mieszającym. Tygrys (TTH). Zwykle używany w hashach drzew Tygrysów.

Kryptograficzne z wykorzystaniem liczb pseudolosowych Zobacz. Generatory liczb losowych

Techniki w kryptografii

Tajne dzielenie, Tajne dzielenie, Dzielenie klawiszy, M z N algorytmów.

Tajny program Shamira. Jest to formuła oparta na interpolacji wielomianowej. Tajny plan dzielenia się Blakleya. Ma charakter geometryczny, tajemnicą jest punkt w przestrzeni m-wymiarowej.

Inne techniki i deszyfrowanie

Podzbiór sumy. Biorąc pod uwagę zestaw liczb całkowitych, czy jakaś suma podzbioru jest równa zero? Używany w kryptografii. Algorytm Shora. Algorytm kwantowy zdolny do odszyfrowania kodu w oparciu o funkcje asymetryczne, takie jak RSA.

Geometria

Pakowanie prezentów. Określenie wypukłego kadłuba zestawu punktów. Odległość Gilberta-Johnsona-Keerthi. Określenie najmniejszej odległości między dwoma wypukłymi kształtami. Skan Grahama. Określanie wypukłego kadłuba zestawu punktów w płaszczyźnie. Przecięcie segmentu linii. Sprawdzanie, czy linie przecinają się z algorytmem linii przeciągnięcia. Punkt w wielokącie. Sprawdza, czy dany punkt mieści się w danym. Przecięcie promienia / płaszczyzny. * Przecięcie linii / trójkąta. * Szczególny przypadek przecięcia promienia / płaszczyzny. Poligonizacja niejawnych powierzchni. Przybliż powierzchnię niejawną z reprezentacją wielokąta. Triangulacja.Metoda oceny odległości do punktu od kątów do innych punktów, których odległość jest znana.

Wykresy Technologia 3D Surface Tracker. Proces dodawania obrazów do ścian w filmie, z uwzględnieniem ukrytych powierzchni. Bellman-Ford. Oblicza najkrótsze ścieżki na wykresie ważonym (gdzie niektóre grubości krawędzi mogą być ujemne). Algorytm Dijkstry. Oblicza najkrótsze ścieżki na wykresie z nieujemnymi wagami krawędzi. Metody perturbacji. Algorytm obliczający lokalnie najkrótsze ścieżki na wykresie. Floyd-Warshall. Rozwiązuje problem najkrótszej ścieżki wszystkich par na ważonym, ukierunkowanym wykresie. Odkrycie cyklu Floyda. Znajduje cykle w iteracjach. Johnson. Algorytm najkrótszej ścieżki wszystkich par na rzadkim, ważonym grafie. Kruskal.Znajduje minimalne drzewo rozpinające dla wykresu. Prim's. Znajduje minimalne drzewo rozpinające dla wykresu. Nazywany również algorytmem DJP, Jarník lub Prim – Jarník. * Boruvka. * Znajduje minimalne drzewo rozpinające dla wykresu. Ford-Fulkerson. Oblicza maksymalny przepływ na wykresie. Edmonds-Karp. Wdrożenie Ford-Fulkerson. Nieblokujący przełącznik minimalnego zakresu. Do centrali telefonicznej. Woodhouse-Sharp. Znajduje minimalne drzewo rozpinające dla wykresu. Na bazie wiosny Algorytm do rysowania wykresów. Język węgierski. Algorytm znajdowania idealnego dopasowania. Algorytm kolorowania. Algorytm kolorowania wykresów. Najbliższy sąsiadZnajdź najbliższego sąsiada. Sortowanie topologiczne. Posortuj ukierunkowany wykres acykliczny w taki sposób, aby każdy węzeł znajdował się przed wszystkimi węzłami, do których ma krawędzie (zgodnie ze wskazówkami). Algorytm najmniej popularnych przodków Tarjana off-line. Oblicz najniższe wspólne przodki dla par węzłów w drzewie.

Grafika

Algorytm linii Bresenhama. Wykorzystuje zmienne decyzyjne do kreślenia linii prostej między 2 określonymi punktami. Krajobraz Narysuj scenerię 3D. * Algorytm linii DDA. * Wykorzystuje matematykę zmiennoprzecinkową do kreślenia linii prostej między 2 określonymi punktami. Wypełnienie. Wypełnia połączony region kolorem. Przywracanie obrazu. Przywróć zdjęcie, popraw obrazy. Algorytm linii Xiaolin Wu. Antyaliasing linii. Algorytm malarza. Wykrywa widoczne części trójwymiarowej scenerii. Śledzenie promieni. Realistyczne renderowanie obrazu. Cieniowanie Phong. Model oświetlenia i metoda interpolacji w grafice komputerowej 3D. Cieniowanie Gourauda.Symuluj różne efekty światła i koloru na powierzchni obiektu 3D. Renderowanie linii Konstruuje obraz, przesuwając fikcyjną linię. Globalne oświetlenie. Rozważa bezpośrednie oświetlenie i odbicie od innych przedmiotów. Interpolacja. Konstruowanie nowych punktów danych, takich jak zoom cyfrowy. Resyntezator. Usuń obiekt ze zdjęcia i odbuduj tło używane przez Photoshopa i Gimpa. Samouczek Resynthesizera. Algorytm przechwytywania zbocza. Jest to implementacja wzoru przechwytywania nachylenia do rysowania linii. Interpolacja splajnu. Zmniejsza błąd ze zjawiskiem Runge. Technologia 3D Surface Tracker. Dodawanie zdjęć lub wideo na ścianach w wideo, z uwzględnieniem ukrytych powierzchni.

Listy, tablice i drzewa

Badawczy

Wyszukiwanie w słowniku Zobacz wyszukiwanie predykcyjne. Algorytm wyboru Znajduje k-tą największą pozycję na liście. Algorytm wyszukiwania binarnego. Lokalizuje element na posortowanej liście. Pierwsze wyszukiwanie szerokości. Przemieszcza wykres poziom po poziomie. Głębokie wyszukiwanie. Przemieszcza wykres gałąź po gałęzi. Najlepsze wyszukiwanie Przechodzi przez wykres w kolejności prawdopodobnego znaczenia przy użyciu kolejki priorytetowej. Wyszukiwania drzewo. * Specjalny przypadek najlepiej pierwszego wyszukiwania, który używa heurystyki w celu poprawy szybkości. Wyszukiwanie według jednolitych kosztów. Wyszukiwanie drzewa, które wyszukuje trasę o najniższym koszcie, gdzie koszty są różne. Wyszukiwanie predykcyjne.Wyszukiwanie binarne, które uwzględnia wielkość wyszukiwanego hasła w porównaniu do wysokich i niskich wartości w wyszukiwaniu. Stół Hash. Kojarz klucze z elementami w nieposortowanej kolekcji, aby odzyskać je w czasie liniowym. Wyszukiwanie interpolowane. Zobacz wyszukiwanie predykcyjne.

Sortowanie

Sortowanie według drzewa binarnego. Rodzaj drzewa binarnego, przyrostowy, podobny do sortowania przez wstawianie. Bogosort. Niewystarczająca losowa karta biurkowa. Sortowanie bąbelkowe. Dla każdej pary indeksów zamień elementy, jeśli są nieczynne. Sortowanie wiader. Podziel listę na segmenty i posortuj je indywidualnie. Uogólnia sortowanie szuflad. Sortowanie koktajlowe (lub dwukierunkowe bąbelki, shaker, marszczyć, transfer, sortowanie happy hour). Odmiana sortowania bąbelkowego, która sortuje się w obu kierunkach, przechodzi przez listę. Sortuj według rodzaju grzebienia. Efektywna odmiana sortowania bąbelkowego, która eliminuje „żółwie”, małe wartości na końcu listy i wykorzystuje luki między wartościami. Liczenie sortuj.Wykorzystuje zakres liczb na liście A, aby utworzyć tablicę B o tej długości. Indeksy w B są używane do zliczania, ile elementów w A ma wartość mniejszą niż i. Sortuj według gnomów. Podobne do sortowania przez wstawianie, z tym wyjątkiem, że przenoszenie elementu na właściwe miejsce odbywa się poprzez serię zamian, jak w przypadku sortowania bąbelkowego. Heapsort. Konwertuj listę na stertę, wciąż usuwaj największy element ze sterty i dodając ją na końcu listy. Sortowanie przez wstawianie. Określ, gdzie należy bieżący element na liście posortowanych i wstaw go tam. Introsort. Lub introspekcyjne. Zaczyna się od szybkiego sortowania i przełącza na heapsort na pewnym poziomie rekurencji. Scal sortuj.Sortuj pierwszą i drugą połowę listy osobno, a następnie scal posortowane listy. Sortuj naleśniki. Odwróć elementy niektórych prefiksów sekwencji. Rodzaj Pigeonhole. Wypełnij pustą tablicę wszystkimi elementami tablicy do sortowania, w kolejności. Sortowanie listonoszy. Hierarchiczny wariant sortowania kubełkowego, stosowany przez urzędy pocztowe. Szybkie sortowanie. Podziel listę na dwie części, wszystkie pozycje na pierwszej liście będą znajdować się przed wszystkimi pozycjami na drugiej liście; następnie posortuj dwie listy. Często metoda wyboru. Sortowanie Radix. Sortuje klucze związane z elementami lub liczbą całkowitą, przetwarzając cyfry. Sortuj wybór. Wybierz najmniejszy z pozostałych elementów i dodaj go na końcu posortowanej listy. Sortowanie w skorupkach.Poprawiono sortowanie przy wstawianiu za pomocą przerw między wartościami. Smoothsort. Zobacz heapsort. Rodzaj stochastyczny. Zobacz bogosort.

i wiele więcej...


0

W nagłówku pytania zadałeś dwa pytania, więc odpowiem na oba pytania.

Tak, w informatyce chodzi o algorytmy. Cóż ... w rzeczywistości jest to trochę mylące, ponieważ istnieje wiele aspektów informatyki, więc zmienię zdanie. Informatyka stosowana w świecie pracy dotyczy przede wszystkim algorytmów. Firmy takie jak Google, Facebook i wszystkie te zwariowane miejsca na Wall Street zatrudniające fizyków i programistów chcą bardzo złożonych problemów zredukowanych do prostej formy, która sama w sobie wymaga głębokiego zrozumienia matematyki i projektowania algorytmów.

Nie, programowanie to nie tylko algorytmy. Programowanie polega na pobieraniu specyfikacji i konwertowaniu ich na kod, który można skompilować do wykonania.

Dodatkowa część odpowiedzi: Software Development nie jest programowaniem, a jednak wielu zdaje się mylić warunki i używać ich zamiennie. Programowanie jest jedynie funkcją lub techniką być może większego procesu tworzenia oprogramowania. Rozwój oprogramowania z pewnością nie polega wyłącznie na algorytmach, ale na rozwiązywaniu problemów z oprogramowaniem i stosowaniu solidnych procesów zgodnych z biznesem, aby umożliwić skuteczne rozwiązywanie problemów. Chociaż procesy tworzenia oprogramowania - a nawet same programowanie - mogą mieć charakter algorytmiczny, nie jest to to samo, co algorytmy.

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.