[Powered by Google Translate] Ai auzit, probabil, oamenii vorbesc despre un algoritm rapid sau eficiente
pentru executarea sarcina dumneavoastră special,
dar ce anume înseamnă pentru un algoritm pentru a fi rapid sau de eficiente?
Ei bine, nu e vorba de o măsurare în timp real,
cum ar fi secunde sau minute.
Acest lucru se datorează faptului că hardware-ul computerului
și software-ul variază drastic.
Programul meu ar putea rula mai lent decât a ta,
pentru ca eu o rulează pe un calculator mai vechi,
sau pentru că I se întâmplă să joace un joc video online
în același timp, care este hogging toate memoria mea,
sau am putea fi difuzate programul meu prin intermediul unui software diferit
care comunică cu aparatul diferit la un nivel scăzut.
E cum ai compara merele cu portocalele.
Doar pentru ca calculatorul meu lent durează mai mult
decât a ta de a da înapoi un răspuns
nu înseamnă că trebuie algoritm mai eficient.
>> Deci, din moment ce nu se poate compara direct runtime ale programelor
în câteva secunde sau minute,
cum putem compara 2 algoritmi diferite
indiferent de hardware sau software-ul de mediu?
Pentru a crea un mod mai uniform de măsurare a eficienței algoritmică,
oamenii de stiinta de calculator si matematicieni au conceput
concepte pentru măsurarea complexitatea asimptotică a unui program de
și o notație numit "Big Ohnotation"
pentru a descrie acest lucru.
Definiția formală este faptul că o funcție f (x)
ruleaza pe ordinea de g (x)
în cazul în care există o anumită valoare (x), x ₀ și
o constantă, C, pentru care
f (x) este mai mică sau egală cu
care constanta de ori g (x)
pentru orice x mai mare decât x ₀.
>> Dar să nu-ți fie frică de mers cu definiție oficială.
Ce înseamnă, de fapt, în mai puțin termeni teoretici?
Ei bine, e de fapt o modalitate de a analiza
cat de rapid timp de execuție a unui program creste asimptotic.
Asta este, ca mărime de intrare crește spre infinit dvs.,
cuvânt de spus, te sortarea o serie de dimensiuni 1000, comparativ cu o serie de mărimea 10.
Cum rulare a programului ta să crească?
De exemplu, imaginați-vă numărare numărul de caractere
într-un șir mai simplu mod
de mers pe jos prin întreg șir
scrisoare-de-literă și adăugând 1 la un contor pentru fiecare personaj.
Acest algoritm se spune pentru a rula în timp liniar
în ceea ce privește numărul de caractere,
"N" în șir.
Pe scurt, se execută în O (n).
De ce este acest lucru?
Ei bine, folosind aceasta abordare, timpul necesar
sa traverseze întregul șir
este proporțională cu numărul de caractere.
Numărarea numărul de caractere dintr-un șir de 20 de caractere
este de gând să ia de două ori, atâta timp cât este nevoie
pentru a număra caracterele dintr-un șir de 10 de caractere,
pentru ca trebuie sa te uiti la toate caracterele
și fiecare personaj are aceeași cantitate de timp să se uite la.
Pe măsură ce crește numărul de caractere,
Runtime va crește liniar cu lungimea de intrare.
>> Acum, imaginați-vă dacă vă decideți că timpul linear,
O (n), pur și simplu nu a fost suficient de rapid pentru tine?
Poate te stocarea siruri de caractere uriașe,
și nu vă puteți permite timp suplimentar s-ar lua
pentru a traversa toate personajele lor de numărare unul câte unul.
Deci, vă decideți să încercați ceva diferit.
Ce se întâmplă dacă s-ar întâmpla să stocați deja numărul de caractere
în șir, să zicem, într-o variabilă numită "len,"
încă de la începutul programului,
înainte de a vă memorate chiar caracter foarte primul în șir dvs.?
Apoi, tot ce ar trebui să facem acum pentru a afla lungimea șirului,
verifica ce este valoarea variabilei este.
Tu nu ar trebui să se uite la șirul în sine, la toate,
și accesarea valoarea unei variabile cum ar fi len este considerată
o constantă de timp asimptotic funcționare,
sau O (1).
De ce este acest lucru? Ei bine, amintiți-vă ce înseamnă complexitate asimptotică.
Cum se schimbă rulare ca dimensiunea
intrări de dvs. crește?
>> Spuneți că ați fost încercarea de a obține numărul de caractere dintr-un șir mai mare.
Ei bine, nu ar conta cât de mare faci șir,
chiar și un milion de caractere,
tot ce ar trebui să facă pentru a găsi lungimea șirului cu această abordare,
este de a citi valoarea variabilei LEN,
care deja făcut.
Durata de intrare, care este, de lungimea șirului sunteți încercarea de a găsi,
nu afectează deloc cât de repede se execută programul.
Această parte a programului dumneavoastră va rula la fel de rapid pe un șir de un caracter
și un șir de o mie de caractere,
si de aceea acest program ar fi mentionat ca rulează în timp constant
cu privire la dimensiunea de intrare.
>> Desigur, există un neajuns.
Iti petreci spațiu de memorie suplimentar pe calculatorul dvs.
stocarea variabila
și timp suplimentar este nevoie de tine
pentru a face de stocare reală a variabilei,
dar punctul de încă stă,
a afla cât de mult timp a fost șirul de
nu depinde de lungimea șirului, la toate.
Deci, se execută în O (1) sau constanta de timp.
Acest lucru cu siguranță nu trebuie să însemne
că codul se execută în 1 pas,
dar nu contează cât de multe etape este,
în cazul în care nu se schimba cu dimensiunea de intrări,
e încă asimptotic constanta pe care le reprezintă ca O (1).
>> După cum puteți ghici, probabil,
există multe diferite runtime mari O să măsoare cu algoritmi.
O (n) ² algoritmi sunt asimptotic mai lent decât O (n) algoritmi.
Asta este, ca numărul de elemente (n) crește,
în cele din urmă O (n) ² algoritmi va dura mai mult timp
mult O (n) pentru a rula algoritmi.
Acest lucru nu înseamnă O (n) algoritmi executați întotdeauna mai repede
mult O (n) ² algoritmi, chiar și în același mediu,
pe același hardware.
Poate pentru dimensiuni mici de intrare,
O (n) ² algoritm ar putea lucra de fapt mai repede,
dar, în cele din urmă, în calitate de mărimea de intrare crește
spre infinit, O (n) ² algoritmul lui timp de execuție
va eclipsa în cele din urmă de rulare O (n) algoritmul.
La fel ca orice funcție matematică pătratică
va depăși în cele din urmă orice funcție liniară,
indiferent de cât de mult de un cap de a începe funcția liniară începe off cu.
Dacă lucrați cu cantități mari de date,
algoritmi care rulează în O (n) ² poate ajunge într-adevăr până încetinirea programului,
dar pentru dimensiuni mici de intrare,
probabil nici nu va observa.
>> Un alt complexitatea asimptotică este,
timp logaritmică, O (log n).
Un exemplu de un algoritm care rulează acest lucru rapid
este clasic căutare algoritmul binar,
pentru a găsi un element dintr-o listă deja-sortate de elemente.
>> Dacă nu știi ce face cautare binara,
Voi explica pentru tine foarte repede.
Să presupunem că sunteți în căutarea pentru numărul 3
în această matrice de întregi.
Se uită la elementul din mijloc al matrice
și întreabă, "Este elementul vreau mai mare, egală sau mai mică decât aceasta?"
Dacă e egal, atunci mare. Ai găsit elementul, și ați terminat.
Dacă e mai mare, atunci știi elementul
trebuie să fie în partea dreaptă a matrice,
si poti sa te uiti doar la faptul că, în viitor,
și, dacă este mai mic, atunci știi că trebuie să fie în partea stângă.
Acest proces este apoi repetat cu matrice mici dimensiuni
până când elementul corect este găsit.
>> Acest algoritm puternic taie dimensiunea matrice în jumătate, cu fiecare operațiune.
Deci, pentru a găsi un element într-o gamă de sortat dimensiune 8,
cel (log ₂ 8),
sau 3 din aceste operațiuni,
verificarea elementul din mijloc, apoi de tăiere matrice în jumătate va fi necesar,
întrucât o serie de dimensiune 16 ia (log ₂ 16),
sau 4 operațiuni.
Asta e doar 1 operațiunea mai mult de o matrice de dimensiune dublat.
Dublarea dimensiunea matrice
crește durata de funcționare cu doar 1 bucata din prezentul cod.
Din nou, verificarea elementul din mijloc al listei, apoi de despicare.
Deci, se spune să funcționeze în timp logaritmică,
O (log n).
Dar stai, spui tu,
nu asta depinde de locul în lista de element pe care îl căutați este?
Ce se întâmplă dacă primul element te uiti la întâmplă să fie corect?
Apoi, este nevoie de doar 1 funcționare,
indiferent de cât de mare este lista.
>> Ei bine, de aceea oamenii de știință de calculator au termeni mai
pentru complexitatea asimptotică care reflectă mai bun caz
și cel mai rău caz performanțelor unui algoritm.
Mai corect, limitele superioare și inferioare
pe timp de execuție.
În cel mai bun caz pentru căutare binară, elementul nostru este
chiar acolo, în mijloc,
si te-ai prins în timp constant,
indiferent de cât de mare restul de matrice este.
Simbolul folosit pentru acest lucru este Ω.
Deci, acest algoritm se spune pentru a rula în Ω (1).
În cel mai bun caz, aceasta constată elementul rapid,
indiferent de cât de mare este matrice,
dar, în cel mai rău caz,
acesta trebuie să efectueze (log n) controale pe părți
de matrice pentru a găsi elementul dreapta.
Limitele cazul cel mai defavorabil superioare sunt descrise cu mare "O" pe care le cunosc deja.
Deci, e O (log n), dar Ω (1).
>> O căutare liniară, prin contrast,
in care te plimbi prin fiecare element al matricei
pentru a găsi cea pe care o doriți,
este cel mai bun Ω (1).
Din nou, primul element pe care doriți.
Deci, nu contează cât de mare este matrice.
În cel mai rău caz, e ultimul element din matrice.
Deci, va trebui să se plimbe prin toate elementele din matrice n să-l găsiți,
ca în cazul în care ați fost în căutarea pentru un 3.
Deci, se execută în O (n)
deoarece este proporțională cu numărul de elemente din matrice.
>> Un simbol mai folosit este Θ.
Acest lucru poate fi folosit pentru a descrie algoritmi în care cazurile cele mai bune și mai rău
sunt aceleași.
Acesta este cazul în algoritmii șir de lungime care am vorbit mai devreme.
Asta este, dacă am depozitați-l într-o variabilă înainte de
am stoca și accesa string-l mai târziu, în timp constant.
Indiferent ce număr
suntem stocarea în această variabilă, va trebui să se uite la ea.
Cel mai bun caz este, ne uităm la ea
și pentru a găsi lungimea șirului.
Deci, Ω (1) sau cel mai bun caz constanta de timp.
Cel mai rău caz este,
ne uităm la ea și pentru a găsi lungimea șirului.
Deci, O (1) sau constanta de timp, în cel mai rău caz.
Deci, din moment cel mai bun caz și cele mai grave cazuri sunt aceleași,
acest lucru poate fi spus pentru a rula în Θ (1) timp.
>> În rezumat, avem bune moduri de a rationa despre eficiența codurilor
fără a ști nimic despre timp real-lume, care le iau pentru a rula,
care este afectată de o mulțime de factori externi,
inclusiv hardware diferite, software-ul,
sau specificul codului.
De asemenea, ne permite să motiv bine despre ceea ce se va întâmpla
atunci când dimensiunea crește intrărilor.
>> Dacă sunteți execută în O (n) ² algoritm,
sau mai rau, un O (2 ⁿ) algoritm,
unul dintre cele mai rapide tipuri de creștere,
veți începe cu adevărat să observați încetinirea
Atunci când începeți să lucrați cu cantități mari de date.
>> Asta e complexitatea asimptotică. Multumesc.