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.
źródło
Odpowiedzi:
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:
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!
źródło
fizzbuzz
jeśli liczba jest podzielna przez jedno i drugie, i wielu się w tym wsuwało, ponieważ musisz starannie sprawdzać modulo.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:
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.
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.
Szeroka wiedza i kultura: jakie są języki funkcjonalne? Jak komputery interpretują kod? Dlaczego LOC jest bezsensownym środkiem? itp.
Głęboka znajomość języków, z którymi pracujesz.
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.
źródło
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 .
źródło
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.
źródło
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.
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.
źródło
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ę.
źródło
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:
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ę.
źródło
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.
źródło
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.
źródło
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ć).
źródło
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.
źródło
Gdybym musiał wybrać jedną rzecz w informatyce jako najważniejszą jej część, wybrałbym abstrakcje , a nie algorytmy.
źródło
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...
źródło
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.
źródło