Sursa imaginii: pixabay.com

Limbaje de programare pentru învățarea algoritmilor

Așadar, înainte de a începe cu lucrurile mele de artilerie grele despre limbi și măștile lor cu algoritmi, anunțați mai întâi care sunt algoritmii.

Este posibil să fi auzit-o în filme, în special în filme precum The Swordfish sau orice alt film de hacking wannabe în care hackerul afirmă ceva de genul dacă mă duc și schimb algoritmul și adaug bla bla și bla, atunci voi putea să hack în CIA și chestii.

Dar asta este destul de grozav. Nu există așa ceva. Algoritmii nu sunt concepute doar pentru hacking.

În primul rând, algoritmii sunt doar structuri de date. Ele sunt o metodă sau un mod de a face lucrurile, mai probabil să rezolve probleme de algoritmi. Încă confuz, permiteți-mă să iau asta într-un mod mai simplu.

Gândiți-vă la algoritmi ca la formule. Formulele care vă pot ajuta să vă duceți la îndeplinire sarcina fără prea mult timp. Ceva de genul următor:

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

Dar acestea sunt destul de simple. Algoritmii corecti sunt mult mai utili decât doar (a + b). Acești algoritmi sunt folosiți în bănci, dar nu doar pentru securitate și chestii, ci peste tot. Să zicem că îți deschizi contul într-o bancă.

Inserați suma X de bani în ea și doriți să cunoașteți cantitatea de interes pe care o veți obține.

Contabilul din bancă ar pune apoi numerele în ceea ce privește suma, numărul perioadei și rata dobânzii într-o casetă dintr-un software. Software-ul algoritmilor rulează și vă oferă rezultatul.

Acum, această ieșire a fost calculată de algoritmi … bucata de cod care are deja formulele pentru calcularea interesului. În cazul nostru, pentru un interes simplu, ar fi:

A = P (1 + rt)

A = Suma

P = principal

R = rata dobânzii

T = Timp sau n

Acum, cel mai probabil trebuie să vă faceți o idee despre ce algoritmi sunt. Doar un lucru trebuie să țineți cont dacă sunteți începători în programare, care nu se confundă niciodată cu funcțiile și algoritmii. Ambele sunt două lucruri diferite.

Dacă aveți confuzie, trebuie doar să le ștergeți și abia apoi continuați mai departe.

Limbi, matematică și algoritm

Puține lucruri de reținut, faptul că înțelegerea algoritmilor matematici este cea mai importantă atunci când doriți să scrieți algoritmi mai buni. Similar este și cazul algoritmilor care nu pot fi evazibili sau care dovedesc o prostie.

Acești algoritmi, care sunt numiți ca fiind de rupt, sunt doar bucăți de cod de matematică pură care nu vor rezolva problema fără părțile necesare. Să spunem de exemplu: a + b = 20

Să presupunem că este 5 aici. Acum, dacă știu că a este 5, atunci acest algoritm poate fi ușor rupt. Cu toate acestea, dacă nici măcar nu știu ce este, atunci mai există posibilitatea să pot sparge acest algoritm.

Modul de a crăpa ar fi ceva de genul că l-aș forța brutal. Forța brută înseamnă a încerca orice combinație posibilă.

Așadar, ceea ce aș face este să încep să ghicesc numere precum 1 + 19, 2 + 18, 3 + 17, 10 + 10 și așa mai departe. Deci, oricare dintre cele două lucruri s-ar întâmpla.

Prima probabilitate este că, din moment ce toate combinațiile de mai sus mi-ar da răspunsul ca 20, toate ar putea sparge acest algoritm. Dar, dacă programatorul a codat-o greu pentru a accepta doar 5 + 15, toate combinațiile nu ar funcționa.

Dar, din nou, din moment ce încerc toate combinațiile posibile, va fi un moment în care aș încerca 5 + 15 și asta ar crăpa algoritmul.

Din nou, programatorul ar putea încerca să mențină numărul limitat de încercări și mult mai multă structură de securitate între ele, dar chiar și pentru asta, avem o mulțime de instrumente care să o ocolească.

Algoritmul sau mitul de neîntrerupt?

Deci, întrebarea este dacă există ceva denumit algoritm de neîntrerupt sau este doar un mit. Răspunsul este ambele. Am citit recent câteva lucruri pe internet, unde am citit un citat faimos:

„Imposibil înseamnă doar că nu a încercat toate soluțiile”

Da. Așa funcționează algoritmii. Să luăm cazul de mai sus. Să presupunem că există un alt algoritm care merge astfel:

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

Da. Așa scrieți un algoritm de neîntrerupt. Chestia este un computer decent, cu o placă grafică bună, care poate sparge cu ușurință acest lucru cu oclhashcat. Dar acesta este doar un exemplu. Aici combinațiile pot fi ca orice.

Răspunsul este un nou Negativ, ceea ce înseamnă că în a, b, c, d, e, și f, pot exista câteva numere care sunt negative, cel puțin un număr mare se scade cu un număr mic.

Acest lucru mă readuce la primele noastre exemple de algoritm de a + b = 20. Chiar și aici, pot exista mult mai multe combinații precum -1 + 21, sau -29354+ 29374. Obținerea punctului meu.

Deci, teoria algoritmilor de neînfășurat nu merge decât în ​​măsura în care o minte umană poate gândi. Algoritmii de neînfrânt nu sunt un mit. Un algoritm bine scris poate dura până la 2-3 sau chiar mai multe luni pentru a sparge chiar și de un computer, cum ar fi chestiile criptate WPA2.

Chestia este că trebuie să ai răbdare să rămâi în pace mentală până când se rezolvă. Conform matematicii, nu există un astfel de algoritm care să nu poată fi fisurat. Trebuie doar ca cineva să se intereseze de fapt.

Cele mai bune limbi pentru a scrie algoritmi

Sincer vorbind, oficial nu există un limbaj specific care să fie excelent pentru algoritmii de scriere.

Limbile funcționale au totuși mâna superioară, motivul fiind că sunt mult mai superioare din punct de vedere al calculelor și al matematicii decât alte limbaje orientate pe obiect. Totuși, aș enumera doar algoritmi pe care îi consider suficient de mulți pentru a codifica matematica în:

  • Python și Ruby

În primul rând, aș recomanda limbi la nivel înalt. Limbile la nivel înalt sunt cel mai ușor de utilizat. Motivul pentru care aceste limbi sunt mai ușoare este pentru că, spre deosebire de C sau de orice altă limbă de nivel scăzut, aceste limbi sunt mai ușoare din punct de vedere al lecturii.

Chiar și sintaxa lor este atât de ușoară, încât doar un începător pur ar înțelege-o fără ca cineva să-i învețe.

Toate structurile comune de date din aceste limbi au abstractii. Puteți chiar să vă construiți propriile versiuni implementate și să construiți structuri de date pe structuri de date. Aceste limbi sunt tastate dinamic.

Dar există o singură problemă aici că poate fi mai ușor pentru un programator să înceapă, dar atunci când rulează teste, pot vedea o mulțime de erori pe care nu le-au văzut înainte de execuție, spre deosebire de alte limbi de nivel scăzut.

  • C

C este exact opusul lui Python aici. S-ar putea să vă confundați, deoarece, deși C este un limbaj la nivel înalt, unii oameni chiar îl consideră un limbaj de nivel scăzut datorită modului său de codare.

Chiar și C este foarte bun în ceea ce privește abstractizarea aici. Dacă sunteți în algoritmi, este posibil ca într-o dată sau alta să fie nevoie să învățați limbi adecvate la nivel scăzut, cum ar fi ansamblul.

Este de părere că, dacă cunoașteți foarte bine C, ar fi destul de ușor să migrați de la C sau orice alt tip de limbă similar la limbajul de asamblare. Gestionarea memoriei este foarte bună și în C și acest lucru este foarte important pentru algoritmi.

  • Java

Mulți oameni urăsc Java, de fapt, că sunt prea verbosi și stricți. Chiar și unii oameni spun că îi lipsește o mulțime de funcții care sunt disponibile în limbi moderne sofisticate. Dar acest lucru nu indică faptul că este preocupat.

Java, spre deosebire de Python, nu este un limbaj tastat dinamic. Este un limbaj scris tipic și are o mulțime de colectări de gunoi.

Aceasta înseamnă că Java va afișa de fapt erori în timpul compilării și chiar înainte de execuție. Și în comparație cu alte limbi de nivel înalt, Java are o scurgere de memorie extrem de scăzută, care poate fi în mod evident remediată și nu are defecte de segmentare.

  • C # și C ++

C # este aproape similar cu Java. Este mai mult ca Java cu capabilitățile limbajului modern. Unii oameni le place să folosească chiar și C ++. Dar este extrem de complicat inutil.

Unii oameni îl folosesc pentru că din moment ce este greu de înțeles, dar odată ce reușești să-l crăci, oamenii vor avea serios un moment dificil să-ți înțeleagă algoritmii, ceea ce îl face perfect pentru job. C #, pe de altă parte, are colectare de gunoi similară cu cea a Java.

Există, de asemenea, alte limbaje funcționale precum Haskell (familia Lisp) și Scala (bazată pe Java). Puteți citi și alte bloguri pe care le-am scris în detaliu despre cum funcționează și lucrurile. Java, C și C ++ toate rulează pe una sau alta mașină virtuală.

Întrucât Ruby și Python sunt interpreți pentru interpreții lor.

Dacă mă întrebați, aș prefera C #, întrucât are toate capacitățile moderne și, de asemenea, ar face mai ușor portul la limbajele de programare inferioare. În termeni științifici, are proprietățile Java, Scala, C și limbaje de nivel inferior.

Dacă doriți doar să începeți cu algoritmi, puteți lua în considerare probabil să utilizați ediția vizuală a comunității sau studioul Visual Studio Express. Probabil că ar trebui să cumpărați asta, cu excepția faptului că în cazul pitonului, majoritatea materialelor pe care le doriți ar fi gratuite.

Articole recomandate: -

Iată câteva articole care vă vor ajuta să obțineți mai multe detalii despre limbile de programare pentru învățarea algoritmilor, așa că treceți doar prin link.

  1. 8 întrebări și răspunsuri la interviu de algoritm minunat
  2. Cei mai buni algoritmi și criptografie (exemple)
  3. Cele mai bune structuri de date și algoritmi C ++ | Elementele de bază
  4. Structuri de date și interviu de algoritmi