Źródło obrazu: pixabay.com

Języki programowania do nauki algorytmów

Zanim zacznę od mojej ciężkiej artylerii o językach i ich maskach z algorytmami, najpierw dowiedz się, jakie są algorytmy.

Być może słyszałeś to w filmach, zwłaszcza w filmach takich jak The Swordfish, lub w jakimkolwiek innym hakującym filmie hakerskim, w którym haker stwierdza coś takiego, jeśli pójdę i zmienię algorytm i dodam bla bla i bla, wtedy będę mógł włamać się do CIA i takie tam.

Ale to dość bełkot. Nie ma czegoś takiego. Algorytmy służą nie tylko do hakowania.

Po pierwsze, algorytmy tylko struktury danych. Są metodą lub sposobem na robienie rzeczy, bardziej prawdopodobne do rozwiązania problemów algorytmów. Wciąż zdezorientowany, pozwól mi wziąć to w prostszy sposób.

Pomyśl o algorytmach jak o formułach. Formuły, które mogą pomóc ci wykonać zadanie bez zbędnych ceregieli. Coś w stylu:

(a + b) 2 = a 2 + 2ab + b 2

Ale są one dość proste. Odpowiednie algorytmy są znacznie bardziej przydatne niż tylko (a + b). Algorytmy te są używane w bankach, ale nie tylko dla bezpieczeństwa i innych rzeczy, ale wszędzie. Załóżmy, że otwierasz swoje konto w banku.

Wkładasz do niego X pieniędzy i chcesz wiedzieć, jakie odsetki byś otrzymał.

Księgowy w banku po prostu wstawiałby liczby dotyczące kwoty, liczby okresów i stóp procentowych w polu oprogramowania. Oprogramowanie algorytmów działa i daje wynik.

Teraz dane wyjściowe zostały obliczone przez algorytmy… fragment kodu, który ma już formuły do ​​obliczania odsetek. W naszym przypadku dla prostego zainteresowania byłoby to:

A = P (1 + rt)

A = kwota

P = główny

R = stopa procentowa

T = czas lub n

Najprawdopodobniej musiałeś wiedzieć, jakie są algorytmy. Tylko jedna rzecz, o której należy pamiętać, jeśli jesteś początkującym programistą, to nigdy się nie myli z funkcjami i algorytmami. Obie są dwiema różnymi rzeczami.

Jeśli masz jakieś zamieszanie, po prostu usuń je i dopiero wtedy przejdź dalej.

Języki, matematyka i algorytm

Kilka rzeczy, o których należy pamiętać, że zrozumienie matematyki algorytmów jest najważniejsze, gdy chcesz pisać lepsze algorytmy. Podobnie jest w przypadku algorytmów niezniszczalnych lub odpornych na błędy.

Te algorytmy, które są nazywane niezniszczalnymi, są po prostu fragmentami czystej matematyki, które nie rozwiążą problemu bez wymaganych części. Powiedzmy na przykład: a + b = 20

Załóżmy, że tutaj jest 5. Teraz, jeśli wiem, że a jest 5, to ten algorytm można łatwo złamać. Ale jeśli nawet nie wiem, co to jest a, nadal istnieje możliwość złamania tego algorytmu.

Sposobem na złamanie byłoby coś takiego, jak brutalna siła. Brutalna siła oznacza wypróbowanie każdej możliwej kombinacji.

Więc chciałbym zacząć zgadywać liczby takie jak 1 + 19, 2 + 18, 3 + 17, 10 + 10 i tak dalej. Tak więc teraz stanie się jedna z tych dwóch rzeczy.

Pierwsze prawdopodobieństwo jest takie, że ponieważ wszystkie powyższe kombinacje dałyby mi odpowiedź jako 20, wszystkie mogły złamać ten algorytm. Ale jeśli programista zakodował go na stałe tak, aby akceptował tylko 5 + 15, wówczas wszystkie kombinacje nie działałyby.

Ale znowu, ponieważ próbuję wszystkich możliwych kombinacji, byłby czas, kiedy spróbowałbym 5 + 15 i to złamałoby algorytm.

Ponownie programista może próbować zachować ograniczoną liczbę prób i znacznie więcej struktury bezpieczeństwa pomiędzy nimi, ale nawet w tym celu mamy wiele narzędzi, aby to obejść.

Niezniszczalny algorytm czy mit?

Pytanie brzmi więc, czy istnieje jakikolwiek algorytm niezniszczalny, czy tylko mit. Odpowiedź jest obie. Niedawno czytałem kilka rzeczy w Internecie, gdzie przeczytałem słynny cytat:

„Niemożliwe oznacza tylko, że nie wypróbowano wszystkich rozwiązań”

Tak. Tak działają algorytmy. Weźmy powyższą sprawę. Załóżmy, że istnieje inny algorytm, który wygląda następująco:

a + b + c + d + e + f = (-9)

Tak. W ten sposób piszesz niezniszczalny algorytm. Rzecz w tym, że przyzwoity komputer z dobrą kartą graficzną może łatwo złamać to za pomocą oclhashcat. Ale to tylko przykład. Tutaj kombinacje mogą być dowolne.

Odpowiedź jest ujemna dziewięć, co oznacza, że ​​w a, b, c, d, e i f może być kilka liczb, które są ujemne, co najmniej jedna duża liczba jest odejmowana przez małą liczbę.

To przenosi mnie z powrotem do naszych pierwszych przykładów algorytmu a + b = 20. Nawet tutaj może być o wiele więcej kombinacji, takich jak -1 + 21 lub -29354+ 29374. Zdobycie punktu.

Tak więc teoria niezniszczalnych algorytmów idzie tak daleko, jak tylko ludzki umysł może myśleć. Niezniszczalne algorytmy nie są mitem. Dobrze napisany algorytm może złamać nawet 2-3 miesiące nawet przez komputer, taki jak zaszyfrowany WPA2.

Chodzi o to, że trzeba mieć cierpliwość, aby pozostać w spokoju psychicznym, dopóki się nie rozwiąże. Według matematyki nie ma takiego algorytmu, którego nie można złamać. Po prostu potrzebuje kogoś, kto się tym zainteresuje.

Najlepsze języki do pisania algorytmów

Szczerze mówiąc, oficjalnie nie ma określonego języka, który byłby doskonały do ​​pisania algorytmów.

Języki funkcjonalne mają jednak przewagę, ponieważ są znacznie lepsze pod względem obliczeń i matematyki niż inne języki zorientowane obiektowo. Jednak po prostu algorytmy wymieniają kilka z nich, które uważam za wystarczające do kodowania matematyki w:

  • Python i Ruby

Przede wszystkim poleciłbym języki wysokiego poziomu. Języki wysokiego poziomu są najłatwiejsze w obsłudze. Powodem, dla którego języki te są łatwiejsze, jest to, że w przeciwieństwie do C lub innego języka niskiego poziomu, języki te są łatwiejsze pod względem czytania.

Nawet ich składnia jest tak łatwa, że ​​tylko początkujący zrozumie ją bez nikogo, kto ich nauczy.

Wszystkie wspólne struktury danych w tych językach mają abstrakty. Możesz nawet budować własne zaimplementowane wersje i struktury danych na strukturach danych. Te języki są wpisywane dynamicznie.

Ale tutaj jest tylko jeden problem, od którego programiści mogą łatwiej zacząć, ale podczas uruchamiania testów mogą zobaczyć wiele błędów, których nie widzieli przed uruchomieniem, w przeciwieństwie do innych języków niskiego poziomu.

  • do

C jest tutaj dokładnie przeciwieństwem Pythona. Możesz się nawet pomylić, ponieważ chociaż C jest językiem wysokiego poziomu, niektórzy nawet uważają go za język niskiego poziomu ze względu na sposób kodowania.

Nawet C jest tutaj bardzo dobry pod względem abstrakcji. Jeśli lubisz algorytmy, możesz później lub później nauczyć się odpowiednich języków niskiego poziomu, takich jak asembler.

Chodzi o to, że jeśli bardzo dobrze znasz język C, migracja z języka C lub dowolnego podobnego języka do języka asemblera byłaby dość łatwa. Zarządzanie pamięcią jest również bardzo dobre w C i jest to bardzo ważne dla algorytmów.

  • Jawa

Wiele osób tak naprawdę nienawidzi Javy, ponieważ jest zbyt gadatliwa i surowa. Nawet niektórzy twierdzą, że brakuje wielu funkcji, które są dostępne w nowoczesnych, wyrafinowanych językach. Ale tak naprawdę nie należy się tym przejmować.

Java, w przeciwieństwie do Pythona, nie jest językiem o dynamicznym pisaniu. Jest to język o typie statycznym i ma mnóstwo funkcji wyrzucania elementów bezużytecznych.

Oznacza to, że Java faktycznie wyświetli błędy podczas kompilacji, a nawet przed uruchomieniem. W porównaniu z innymi językami wysokiego poziomu, Java ma bardzo niski wyciek pamięci, który oczywiście można naprawić i nie ma błędów segmentacji.

  • C # i C ++

C # jest prawie podobny do Java. To bardziej przypomina Javę z możliwościami nowoczesnego języka. Niektórzy ludzie lubią używać nawet C ++. Ale jest to niezwykle niepotrzebnie skomplikowane.

Niektórzy używają go, ponieważ ponieważ trudno go zrozumieć, ale gdy uda ci się go złamać, ludzie będą mieli ciężki czas na zrozumienie twoich algorytmów, co czyni go idealnym do pracy. Z drugiej strony C # ma zbieranie śmieci podobne do tego w Javie.

Istnieją również inne języki funkcjonalne, takie jak Haskell (Lisp Family) i Scala (oparty na Javie). Możesz przeczytać na nich moje inne blogi, na których szczegółowo napisałem o tym, jak działają i takie tam. Java, C i C ++ działają na jednej lub drugiej maszynie wirtualnej.

Podczas gdy Ruby i Python są tłumaczami ustnymi.

Jeśli mnie zapytasz, wolałbym C #, ponieważ ma wszystkie nowoczesne możliwości, a także ułatwia przenoszenie na niższe języki programowania. Pod względem naukowym ma właściwości języków Java, Scala, C i języków niższego poziomu.

Jeśli chcesz zacząć od algorytmów, prawdopodobnie możesz rozważyć użycie wersji Visual Studio Community Edition lub Visual Studio Express. Prawdopodobnie musiałbyś to kupić, z wyjątkiem tego, że w przypadku Pythona większość potrzebnych rzeczy byłaby darmowa.

Polecane artykuły: -

Oto kilka artykułów, które pomogą ci uzyskać więcej informacji na temat języków programowania do nauki algorytmów, więc po prostu przejdź przez link.

  1. 8 Niesamowitych pytań i odpowiedzi na wywiad z algorytmem
  2. Najlepsze algorytmy i kryptografia (przykłady)
  3. Najlepsze struktury danych i algorytmy C ++ | Podstawy
  4. Wywiad ze strukturami danych i algorytmami