Professional Documents
Culture Documents
Introduction to Algorithms, third edition. Thomas Cormen, Charles Leiserson, Ronald Rivest, Clifford Stein
Algoritmi eshte nje procedure me hapa te njepasnjeshem qe merr disa te dhena hyrese (input) dhe prodhon disa vlera dalese (output). Algoritmi eshte nje sekuence hapash qe duke kryer perllogartje, shnderrojne inputin ne output. Algoritmi perdor struktura te dhenash.
Strukturat e te dhenave jane menyra sistematike te ruajtjes dhe organizimit te te dhenave (inpute, outpute te algoritmeve) te cilat i bejne te aksesueshme (vektore, lista, stiva, peme). Nje strukture te dhenash nuk eshte e pershtatshme per te gjitha qellimet e mundshme, keshtu qe duhen njohur pikat e forta dhe kufizimet e seciles.
Algoritmi mund te shikohet si nje mjet per zgjidhjen e nje problemi kompjutacional te percaktuar mire.
Percaktimi i problemit pershkruan ne menyre te pergjithshme lidhjen ndermjet inputit dhe outputit. Algoritmi pershkruan nje procedure kompjutacionale per te arritur/ realizuar lidhjen mes inputit dhe outputit. Psh. problemet e renditjes se numrave jane probleme qe zgjidhen nepermjet algoritmeve. Problemi percaktohet si:
Input: nje sekuence n numrash a1, a2an. Output : nje perkembim (a1, a2, an) i sekuences hyrese i tille qe a1 a2 an.
Tregtia elektronike lejon shkembimin e mallrave elektronikisht dhe varet shume nga privatesia dhe siguria e informacionit personal. Teknologjite mbeshtetese bazohen tek kriptografia dhe firmat dixhitale te cilat perdorin algoritme numerike. Problemet e gjetjes se menyrave te perdorimit/shperndarjes ne menyre eficente te burimeve per te marre perfitim maksimal zgjidhen gjithashtu nepermjet algoritmeve te programimit linear.
Probleme te veshtira
Interesohemi per te gjetur zgjidhje eficente te problemeve. Pergjithesisht eficenca matet me shpejtesine (sa kohe duhet per te prodhuar rezultatin) e ekzekutimit te algoritmit. Ka nje grup problemesh per te cilat nuk njihet nje zgjidhje eficente por as nuk eshte provuar qe nuk ekziston nje zgjidhje e tille. Keto quhen probleme NP-komplete. Nese zgjidhet njeri nga problemet NP-komplete, pra gjendet nje algoritem eficent, atehere ekzistojne algoritme eficente per te gjitha problemet e tjera te kesaj klase. Kjo eshte nje veti e vecante dhe interesante e ketyre algoritmeve.
Probleme te veshtira
Eshte e rendesishme te njihen problemet NP-Komplete sepse ato shfaqen shpesh ne situata reale. Keshtu qe mund te shpenzohet nje kohe e madhe per gjetjen e zgjidhjes m eficente , nderkohe qe koha mund te shpenzohet per gjetjen e nje zgjidhjeje te mire per rastin konkret.
Cilesi te Algoritmeve
Korrektesia (correctness) algoritmi kryen saktesisht ate qe duhet te beje, pra per cdo instance te inputit, ai jep rezultatin korrekt te pritur. Nese algoritmi jep rezultat te gabuar ose jep rezultat te sakte per disa nga instancat e inputit, atehere ai nuk eshte korrekt. Nje algoritem jo korrekt nuk vlen per zgjidhjen e problemit. Efienca (efficiency) algoritmi perdor ne menyre efiente burimet (kujtese, procesor) te kompjuterit. Duam qe algoritmat te ekzekutohen shpejt duke perdorur sa me pak kujtese. Thjeshtesia (simplicity) thjeshtesia per ta kuptuar dhe implementuar nje algoritem.
Cilesi te Algoritmeve
Shpesh duhet zgjedhur ndermjet efiences dhe thjeshtesise. Nje algoritem eficent (i shpejte), ne me te shumten e rasteve, eshte i kompikuar. Kriteri qe zgjedhim (efience apo thjeshtesi) varet nga problemi aktual. Nqs nje program perdoret shpesh, atehere kostoja e perdorimit te nje algoritmi te ngadalte, por te thjeshte dhe te lexueshem eshte me e madhe sesa po te perdorej nje algoritem efient por jo shume i thjeshte per tu kuptuar (dhe anasjelltas).
Koha qe i duhet nje programi per tu ekzekutuar (per te kryer veprimet, perpunimet per te cilat eshte ndertuar) varet:
Koha e ekzekutimit te algoritmit qe perben programin. Inputi konkret qe merr programi. Cilesia e implementimit dhe cilesia e kodit te gjeneruar nga kompilatori. Makina qe perdoret per te ekzekutuar programin.
Ne kohen e ekzekutimit te algoritmeve ndikon dhe gjuha e programimit e zgjedhur apo stili i implementimit (rekursivitet ose jo),.
Ne tabelen A kerkohet per vleren k dhe nese kjo vlere gjendet, kthehet pozicioni ne tabele ku ajo ndodhet.
Algorithm linSearch(A; k) 1. for i 0 to A.length - 1 do 2. if A[i] = k then 3. return i 4. return -1
Cila eshte koha e ekzekutimit te algoritmit nese inputi eshte tabela A = [2, 4, 3, 3, 5, 6, 1, 0, 9, 7] dhe k = 0? Thene ndryshe, sa hapa perllogarites duhet te kryhen perpara sesa te arrihet ne perfundimin nese numri k ndodhet ne tabelen A ose jo?
Per te llogaritur numrin e hapave qe kryen nga algoritmi linSearch duhet te gjendet sesa here ekzekutohet secili rresht i algoritmit. Rreshti i pare ekzekutohet 8 here (per vlera i = 0..7) Rreshti i dyte ekzekutohet 8 here Rreshti i trete ekzekutohet 1 here Rreshti i katert nuk ekzekutohet asnjehere
Shenojme c1, c2, c3 numrin e instruksioneve makine qe duhet te ekzektuohen per secilin nga rreshtat 1, 2 dhe 3.
Numri i hapave perllogarites te algoritmit linSearch per tabelen A dhe numrin k eshte te shumten: 8c1 + 8c2 + c3
Koha e ekzekutimit ne rastin me te keq e nje algoritmi A eshte funksioni Ta : N N ku Ta(N) eshte numri maksimal i hapave qe kryen A me te dhena input me permase N. Per nje permase te dhene, numri i tabelave me ate permase eshte gjithmone i fundem, pra Ta eshte gjithmone e percaktuar mire. Pergjithesisht konsiderohen tabela te fundme
Numri i hapave te perllogaritjes nuk eshte i pavarur nga madhesia e tabeles A. Pritet qe algoritmi te kryeje me shume hapa kur perdor nje tabele me 100 000 elemente sesa kur perdor nje tabele me 10 elemente. Edhe per tabela te te njejtes permase, numri i hapava varet shume edhe nga fakti nese numri k ndodhet ne tabele ose jo.
Per kerkimin linear, rasti me i keq eshte kur numri k ndodhet ne pozicionin e fundit te tabeles A ose nuk gjendet fare ne tabele. Tabela A ka gjatesi n. Nqs numri k ndodhet ne pozicionin e fundit te tabeles, numri i hapave qe kryen algoritmi per te gjetur k eshte:
Rasti me i keq eshte mjaft optimist dhe nuk shfaqet gjithmone Koha mesatare e ekzekutimit te nje algoritmi eshte funksioni AVTa (n) R ku AVTa(n) eshte numri mesatar i hapave qe kryen algoritmi A me te dhena input me permase n. Probleme me kohen mesatare:
Cfare kuptimi ka saktesisht mesatarja? Cfare quhet input mesatar varet plotesisht nga aplikimi Analiza e kohes mesatare eshte shume e veshtire matematikisht
Algoritmi kerkon ne nje tabele te renditur per nje numer. Input: tabela A me numra, e renditur ne rendin rrites, i1, i2, k Output: Index i, i1 i i2, i tille qe A[i] = k, nqs k kjo i ekziston, - 1
perndryshe.
Algorithm binarySearch(A; k; i1; i2) 1. if i2 < i1 then return -1 2. else 3. j = (i1+i2)/2 4. if k = A[j] then 5. return j 6. else if k < A[j] then 7. return binarySearch(A; k; i1; j - 1) 8. else 9. return binarySearch(A; k; j + 1; i2)
Le te jete ci koha e ekzekutimit te hapit ne rreshtin i te algoritmit c8, c9 dhe c10 jane koha e ekzekutimit te therritjes rekursive te funksionit, por jo koha e ekzekutimit te tere veprimeve perfshire ne kete therritje Permasa e tabeles input A eshte n = i2 i1 + 1. Ajo eshte edhe numri i elementeve te tabeles qe do te investigohen Koha e ekzekutimit te kerkimit binar eshte: TbinarySearch(n) ci + TbinarySearch(n/2). (per i nga 1 ne 10)