Skripta Ne Gjuhen Shqipe

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 6

ANALIZË E ALGORITMEVE

Përmbajtja

 Njohuri matematike .................................................................................................. 2


 Analiza e algoritmeve ............................................................................................... 4
 Elemente të analizës asimptotike. Klasifikimi i funksioneve sipas rritjes ................... 6

Kam fillu me bo kete skripte ne gjuhen shqipe per landen analize e algoritmeve duke perkthy nga librat
1.Computer Algorithms – Introduction to Design and Analysis by Sara Baase
2.Introduction to Algorithms by Cormen, Leiseron, Rivest, Stein
dhe nga disa shenime shtese po nuk me ka premtu koha me vazhdu dhe me perfundu, kushdo qe osht I
interesum mundet me vazhdu prej aty ku e kam lan une

1
NJOHURI MATEMATIKORE

Përgjatë këtij kursi do të na duhen njohuri themeleore në: funksione logaritmike, probabilitet, permutacione
dhe shuma. Gjithashtu do të njoftohemi me relacionet e rekurencës.

Logaritmet
Më së shpeshti do të na paraqitet funksioni logaritmik, zakonisht funksioni logaritmik me bazë 2.
Përkufizim: 𝑃ë𝑟 𝑏 > 1 𝑑ℎ𝑒 𝑥 > 0, log 𝑏 𝑥 (𝑙𝑜𝑔𝑎𝑟𝑖𝑡ë𝑚 𝑖 𝑥 𝑚𝑒 𝑏𝑎𝑧ë 𝑏) ë𝑠ℎ𝑡ë 𝑛𝑢𝑚𝑟𝑖 𝑦 𝑖 𝑡𝑖𝑙𝑙ë 𝑞ë 𝑏 𝑦 = 𝑦;
log 𝑏 𝑥 ë𝑠ℎ𝑡ë 𝑓𝑢𝑞𝑖𝑎 𝑛ë 𝑡ë 𝑐𝑖𝑙ë𝑛 𝑛𝑔𝑟𝑖𝑡𝑒𝑡 𝑏 𝑝ë𝑟 𝑡ë 𝑚𝑎𝑟𝑟ë 𝑟𝑒𝑧𝑢𝑙𝑡𝑎𝑡𝑖𝑛 𝑥.

Nga përkufizimi vlejnë vetitë, ku x është numër pozitiv dhe a çfardo numri real.
1. 𝑙𝑜𝑔𝑏 ë𝑠ℎ𝑡ë 𝑓𝑢𝑛𝑘𝑠𝑖𝑜𝑛 𝑟𝑟𝑖𝑡ë𝑠; 𝑥1 > 𝑥2 𝑎𝑡ëℎ𝑒𝑟ë log 𝑏 𝑥1 > log 𝑏 𝑥2
2. 𝑙𝑜𝑔𝑏 ë𝑠ℎ𝑡ë 𝑓𝑢𝑛𝑘𝑠𝑖𝑜𝑛 𝑛𝑗ë − 𝑛𝑗ë; log 𝑏 𝑥1 = log 𝑏 𝑥2 𝑎𝑡ëℎ𝑒𝑟ë 𝑥1 = 𝑥2
3. log 𝑏 1 = 0
4. log 𝑏 𝑏 𝑎 = 𝑎
5. log 𝑏 (𝑥1 ∙ 𝑥2 ) = log 𝑏 𝑥1 + log 𝑏 𝑥2
6. log 𝑏 (𝑥 𝑎 ) = 𝑎 ∙ log 𝑏 𝑥
7. 𝑥1 log𝑏 𝑥2 = 𝑥2 log𝑏 𝑥1 (𝑑𝑢ℎ𝑒𝑡 𝑣ë𝑟𝑡𝑒𝑡𝑢𝑎𝑟 𝑞ë 𝑙𝑜𝑔𝑎𝑟𝑖𝑡𝑚𝑒𝑡 𝑛ë 𝑡ë 𝑑𝑦 𝑎𝑛ë𝑡 𝑗𝑎𝑛ë 𝑡ë 𝑏𝑎𝑟𝑎𝑏𝑎𝑟𝑡ë)
8. log 𝑏1 𝑥 = (log 𝑏2 𝑥)/(log 𝑏2 𝑏1 )
Pasi logaritmi me bazë 2 përdoret më shpesh në llogaritje të kompleksitetit ekziston shënim i veçantë për të:
lg 𝑥 = log 2 𝑥. Logaritmi natyral me bazë e shënohet 𝑙𝑛.

Shumat
Janë disa shuma që përdoren më shpesh në analizën e algoritmeve.
Disa do ti paraqesim këtu ndërsa tjerat janë të vertetuara në fund të kapitullit.
1. Shuma e numrave të plotë të njëpasnjëshem
𝑛
𝑛(𝑛 + 1)
∑𝑖 =
2
𝑖=1
Vërtetim

Le të jetë 𝑆𝑛 = 1 + 2 + ⋯ + 𝑛, 𝑘ë𝑠𝑎𝑗 𝑠𝑒𝑟𝑖𝑒 𝑗𝑎 𝑠ℎ𝑡𝑜𝑗𝑚ë 𝑆𝑛 = 𝑛 + (𝑛 − 1) + ⋯ + 2 + 1, 𝑑𝑚𝑡ℎ

𝑆𝑛 = 1 + 2 + ⋯ + (𝑛 − 1) + 𝑛
(+) {
𝑆𝑛 = 𝑛 + (𝑛 − 1) + ⋯ + 2 + 1

(𝑛 + 1) + (𝑛 + 1) + ⋯ + (𝑛 + 1)
2𝑆𝑛 = ⏟
𝑛−ℎ𝑒𝑟ë
2𝑆𝑛 = 𝑛(𝑛 + 1)
𝑛(𝑛 + 1)
𝑆𝑛 =
2

2
2. Shuma e katrorëve
𝑛
2𝑛3 + 3𝑛2 + 𝑛
2
∑𝑖 = (vërtetimi në faqe … )
6
𝑖=1

3. Fuqitë e 2-shit.
𝑘

∑ 2𝑖 = 2𝑘+1 − 1
𝑖=0
Vërtetim
Zgjerojmë shumën ∑𝑘𝑖=0 2𝑖 , 𝑆𝑛 = 20 + 21 + 22 + ⋯ + 2𝑘 , 𝑠ℎ𝑢𝑚ë𝑧𝑜𝑗𝑚ë 𝑚𝑒 2 𝑑ℎ𝑒 𝑓𝑖𝑡𝑜𝑗𝑚ë
2𝑆𝑛 = 21 + 22 + 23 + ⋯ + 2𝑘+1
2𝑆𝑛 = 21 + 22 + 23 + ⋯ + 2𝑘+1
( −) {
𝑆𝑛 = 20 + 21 + 22 + ⋯ + 2𝑘

2𝑆𝑛 − 𝑆𝑛 = 2𝑘+1 − 20
𝑆𝑛 = 2𝑘+1 − 1

4. Shumat gjeometrike
𝑘
1 1
∑ 𝑖
=2− 𝑘 (𝑣ë𝑟𝑡𝑒𝑡𝑖𝑚𝑖 ë𝑠ℎ𝑡ë 𝑖 𝑛𝑗𝑒𝑗𝑡ë 𝑠𝑖𝑘𝑢𝑟 𝑡𝑒 𝑠ℎ𝑢𝑚𝑎 𝑒 𝑚ë𝑝𝑎𝑟𝑠ℎ𝑚𝑒)
2 2
𝑖=0

Ky rezultat mund të mirret duke shfrytëzuar formulën e progresionit gjeometrik.


𝑘
𝑎𝑘+1 − 1
∑ 𝑎𝑖 =
𝑎−1
𝑖=0
5. Shuma të përziera
𝑘

∑ 𝑖 2𝑖 = 2𝑘+1 (𝑘 − 1) + 2 (𝑣ë𝑟𝑡𝑒𝑡𝑖𝑚𝑖 𝑛ë 𝑓𝑎𝑞𝑒 … )


𝑖=1

Formulat binomiale
(𝑎 ± 𝑏)3 = 𝑎3 ± 3𝑎2 𝑏 + 3𝑎𝑏 2 ± 𝑏 3
(𝑎 ± 𝑏)4 = 𝑎4 ± 4𝑎3 𝑏 + 6𝑎2 𝑏 2 ± 4𝑎𝑏 3 + 𝑏 4

Pjesa e poshtme e plotë ⌊𝑥⌋ ; Pjesa e sipërme e plotë ⌈𝑥⌉ ku x është nr. real.
𝑥 − 1 < ⌊𝑥⌋ ≤ 𝑥 ≤ ⌈𝑥⌉ < 𝑥 + 1

Le të jetë 𝑛 = 2𝑘 ku 𝑛 ∈ 𝑁, 𝑘 ∈ 𝑍, atëherë lg 𝑛 = 𝑘 Nëse n nuk është fuqi e 2 atëherë ekziston


numri i plotë k i tillë që 2𝑘 < 𝑛 < 2𝑘+1 , ⌊lg 𝑛⌋ = 𝑘 𝑑ℎ𝑒 ⌈lg 𝑛⌉ = 𝑘 + 1.
𝑛
Duhet vërtetuar: 𝑛 ≤ 2⌈lg 𝑛⌉ < 2𝑛 𝑑ℎ𝑒 < 2⌊lg 𝑛⌋ ≤ 𝑛
2

3
ANALIZA E ALGORITMEVE

Algoritëm quajmë çdo varg të fundëm të instruksioneve, rregullave apo veprimeve të përkufizuara
mirë që ndërmerren për zgjidhjen e një problemi të caktuar.

Algoritmet i analizojmë me qëllimin për ti krahasuar ose mundësisht për ti përmisuar.

Korrektësia
Për një algoritëm themi se është korrekt nëse për hyrje merr ato vlera që japin rezultatin e saktë.
Programet janë të mëdha dhe komplekse, për të testuar a janë korrekte duhet të ndahen në module më të
vogla, testohen secili modul ndaras dhe nëse të gjithë e bëjne punën e pritshme atëherë i gjithë programi
është korrekt. Pothuajse të gjithë algoritmet në këtë kurs janë module të vogla nga të cilat ndërtohen
programe të mëdha.

Efektshmeria. Kompleksiteti i algoritmit.


Koha e ekzekutimit të algoritmit varet nga hardueri, gjuha programuese dhe stili i programerit. Neve na
intereson një kalkulim që tregon sa është i efektshëm(shpejtë) algoritmi e që nuk varet nga ato arsye.
Një algoritëm i thjeshtë mund të përmban disa intruksione inicializuese dhe ndonjë cikël, këto quhen edhe
operacione bazike. Numri i kalimeve brenda ciklit është indikitator i mirë se sa punë është bërë nga
algoritmi. Sigurisht, kalimi në një cikël mund të ketë më shumë punë sesa ndonjë kalim tjetër dhe algoritmet
mund të kenë cikle me gjatësi të ndryshme. P.sh. në disa cikle mund të jenë pesë hapa dhe në disa nëntë. Për
hyrje me gjatësi të mëdha numri i kalimeve në cikle do të jetë i madh. Pra, numërimi i kalimeve përgjatë
gjithë cikleve është praktikë e mirë por nëse dojmë kalkulim më të saktë atëherë i numërojme të gjithë
operacionet e algoritmit duke anashkaluar komentet. Numrin e operacioneve bazike të kryera do ta quajmë
edhe si kompleksitet, matje e kompleksitetit të algoritmit.

Analiza e rastit më të keq W(n) dhe analiza e rastit mesatar A(n)


Kompleksiteti nuk mund të shpjegohet me një numër sepse numri i hapave të kryer nga algoritmi nuk është i
njejtë për çdo hyrje të vlerave. P.sh. renditja sipas alfabetit e 1000 emrave zakonisht kërkon më shumë
operacione sesa renditja e 100 emrave duke përdorur algoritmin e njejtë ose zgjidhja e sistemit të 12
ekuacioneve lineare me 12 të panjohura zakonisht merr më shumë punë sesa zgjidhja e sistemit të 2
ekuacione lineare me 2 të panjohura. Por nuk është e mjaftueshme të vrojtohet vetëm gjatësia e të dhënave
hyrëse, varet në çfarë renditje janë na janë servuar dhe çfarë vlera janë të dhënat. Algoritmi për renditjen e
emrave mund të marrë pak punë nëse një pjesë e emrave janë veçse të renditur. Zgjidhja e sistemit me 12
ekuacione lineare nuk mund të kërkojë shumë punë nëse shumica e koeficientëve janë zero.
Më se shpeshti përshkruhet sjellja e algoritmit me kompleksitetin në rastin më të keq W(n).
𝑊(𝑛) = max{𝑡(𝐼)| ∈ 𝐷𝑛 }
W(n) është numri maksimal i operacioneve bazike që ekzekutohen nga algoritmi për ndonjë hyrje të
dhënave me gjatësi n. t(I) është numri i operacioneve bazike të algoritmit për hyrjen I i cili është element i
bashkësise të vlerave hyrëse 𝐷𝑛 . Rasti më i keq është i vlefshëm sepse tregon një kufi të sipërm të punës të
algoritmit. Do të analizojmë rastin më të keq në shumicën e algoritmeve në këtë kurs.

4
Nganjëherë është e nevojshmë të analizohet kompleksiteti në rastin mesatar A(n), llogaritet numri i
operacioneve për çdo element të vlerës hyrëse të gjatësisë n dhe merret mesatarja. Në praktikë disa elemente
mund të paraqiten më shpesh sesa disa tjera prandaj matja e mesatares ka kuptim. Le të jetë p(I) probabiliteti
që paraqitet elementi I.
𝐴(𝑛) = ∑ 𝑝(𝐼)𝑡(𝐼)
𝐼∈𝐷𝑛
Funksioni p është i përcaktuar sipas përvojës (eksperiencës), sipas informatave të veçanta të aplikacionit që
përmban atë algoritëm ose duke bërë supozime që lehtësojnë punën, p.sh. të gjithë elementet e vargut hyrës
kanë probabilitet të njejtë të paraqitjes. Nëse p është i komplikuar atëherë llogaritja e rastit mesatar do të jetë
e komplikuar.

Optimizimi
Pa marrë parasysh sa të mençur jemi nuk mund ta përmisojmë algoritmin përtej një pike të caktuar.
Për të analizuar kompleksitetin e algoritmit zgjedhim klasën e algoritmeve, zakonisht duke specifikuar llojet
e operacioneve që do të ekzekutohen dhe llogaritjen e kompleksitetit, p.sh operacionet bazike që do të
numërohen. Pastaj mund të shtrojmë pyetjen sa operacione nevojiten të zgjidhet problem i algoritmit. Themi
se algoritmi është optimal (në rastin më të keq) nëse nuk ekziston algoritëm tjetër brenda asaj klase qe do të
ekzekutoj më pak operacione bazike (në rastin më të keq).

Kufiri i poshtëm dhe kompleksiteti


Pra si do të tregojmë se algoritmi është optimal?
Mund të vërtetojmë teorema që tregojnë kufirin e poshtëm me numrin e operacioneve të nevojshme për të
zgjidhur një problem. Atëherë çdo algoritëm që ekzekuton atë numër të njejtë të operacioneve do të jetë
optimal. Pra janë dy detyra që duhet te kryhen për të zbuluar algoritmin optimal ose duke iu përgjigjur
pyetjes: Sa punë është e nevojshme dhe e mjaftueshme të zgjidhet problem?
1. Shfaqe atë që duket të jetë algoritëm optimal; quaje A. Analizoje A dhe gjeje funksionin W ashtu që
për hyrjet me gjatësi n, A ekzekuton më se shumti W(n) hapa në rastin më të keq.
2. Për ndonjë funksion F, vërtetoje teoremën që tregon se për çdo algoritëm të asaj klase ekziston një
hyrje me gjatësi n për të cilën algoritmi ekzekuton më se paku F(n) hapa.
Nëse funksionet Ë dhe F janë të barabarta, atëherë algoritmi A është optimal (në rastin më të keq)
përndryshe mund të ekzistoj algoritëm më i mirë ose kufi i poshtëm më i mirë.
Koncepti i kufirit të poshtëm në rastin më të keq është shumë me rëndësi në llogaritjen e kompleksitetit.
P.sh. kemi një algoritëm që duhet të gjejë numrin më të madh në varg.
Klasë e algoritmeve: Algoritme që mund të krahasojnë dhe të kopjojnë numrat e vargut por nuk bëjnë
operacione tjera.
Operacioni bazik: Krahason dy numra të vargut.
Kufiri i sipërm: Supozojmë numrat gjenden në vargun me gjatësi n. Atëherë kemi n-1 krahasime.
Kufiri i poshtëm: Supozojmë se të gjithë numrat në varg janë të ndryshëm. Ky supozim wshtw i lejueshwm
sepse nëse vendosim kufrin e poshtëm në rastin më të keq për ndonjë nënbashkësi të hyrjeve(vargun me
numra të ndryshëm) është kufi i poshtëm në rastin më të keq për gjithe numrat e vargut.
Në vargun me gjatësi n, 𝑛 − 1 numra nuk është maksimumi. Si përfundim kemi që 𝐹(𝑛) = 𝑛 − 1 është kufi
i poshtëm i numrit të krahasimeve të nevojshme, pra algoritmi është optimal.

5
ELEMENTE TË ANALIZËS ASIMTOTIKE.
KLASIFIKIMI I FUNKSIONEVE SIPAS RRITJES

Sa është e mirë matja e kohës të ekzekutimit të algoritmit? Sa të saktë mund ta bëjmë krahasimin ndërmjet
dy algoritmeve? Pasi nuk numërojmë çdo hap(operacion) të ekzekutuar nga algoritmi atëherë kemi ca
pasaktësi. Kemi cekur më parë që do të jemi të kënaqur nëse numri total i hapave është përafërsisht i njejtë
me numrin e operacioneve bazike. Kjo është e mjaftueshme që të bëhet klasifikimi ndërmjet dy algoritme që
kryejnë sasi pune të ndryshme për hyrje me gjatësi të mëdha.
Supozojmë algoritmi për zgjidhjen e një problem bën 2n oepracione bazike, pra përafërsisht 2cn
operacione në total për ndonjë konstantë c, dhe algoritmi tjetër bën 4.5n operacione bazike, ose 4.5c’n në
total. Cili ekzekutohet më shpejtë? Nuk e dimë. Algoritmi i parë mund të bëj më shumë operacione të larta
p.sh. konstanta e tij mund të jetë më e madhe. Pra nëse funksioni i cili krahason dy algoritme dallon për nga
faktori i konstantës është e pakuptimtë të veçohet njëri (përderisa nuk bëjmë analiza më të hollësishme).
Algoritmet e tilla i konsiderojmë të jenë në një klasë të përbashkët të kompleksitetit.
Supozojmë një algoritëm bën 𝑛3 /2 shumëzime dhe tjetri algoritëm bën 5𝑛2 . Cili algoritëm
ekzekutohet më shpejtë? Për vlera të vogla të n-it algoritmi i parë bën më pak shumëzime por për vlera të
mëdha të n-it algoritmi i dytë është më i shpejtë edhe nëse ka më shumë operacione. Shkalla e rritjes e
funksionin kubik është shumë më e madhe sesa ajo e funksionit kuadratik ku konstanta e propocionalitetit
nuk ka rëndësi kur n bëhet i madh.
Siç pamë nga shembujt ne dëshirojmë të krahasojmë ose të klasifikojmë funksionet që injorojnë
faktorët e konstantës dhe hyrjet me gjatësi të vogla. Kuptuam klasifikim të tillë duke studiuar çka quajmë
shkallë të rritjes asimptotike ose më thjeshtë rend(klasë) të funksionieve.

Le të jenë f dhe g funksione nga N në 𝑅 ∗ . Figura e mëposhtme shpjegon bashkësitë me të cilat


tregojmë lidhjen ndërmjet rendeve(klasëve) të funksioneve. Kjo do të na ndihmoj ti kemi më të qarta
përkufizimet që do të pasojnë.

Ω(f). funksionet që rriten së paku aq shpejtë sa f.

f Θ(f). funksionet që rriten me rend të njejtë sikur f.

Ο(f). funksionet që rriten jo më shpejtë sesa f.

Pwrkufizim

You might also like