Anda di halaman 1dari 22

Algoritmet e Renditjes 2

Leksion 5

Dizenjimi i Algoritmeve
Ka disa menyra per ndertimin e algoritmeve. Rendtja me nderfutje perdor metoden inkrementale: Duke patur te renditur nenvektorin A[1..j - 1], ne nderfutim elementin A[j] ne vendin e vet, duke perftuar keshtu nenvektorin e renditur A[1 j]. Ne kete leksion do te shohim nje metode alternative te dizenjimit, te njohur si Pera-e-Sundo . Ne do ta perdorim metoden Pera-e-Sundo per te dizenjuar nje algoritem renditjeje per te cilin koha e kezekutimit ne rastin me te keq eshte shume me e shkurter se ajo e renditjes me nderfutje.

Metoda Pera-e-Sundo .
Shume algoritme te perdorshem jane rekursive ne strukture: per te zgjidhur nje problem te dhene, ata therrasin vetveten ne menyre rekursive nje ose disa here per te zgjidhur nenprobleme te lidhura ngushte me to. Keto algoritme zakonisht ndjekin nje metode pera e sundo: ata e ndajne problemin ne disa nenprobleme qe jane te ngjashem me problemin fillestar por qe jane me te vegjel ne madhesi, i zgjidhin nenproblemet ne menyre rekursive dhe me pas kombinojne keto zgjidhje per te krijuar nje zgjidhje te problemit fillestar.

Metoda Pera-e-Sundo .
Metoda pera e sundo perfshin 3 hapa ne secilin nivel te rekursivitetit: Ndaj (pera) problemin ne disa nenprobleme. Zgjidh (sundo) nenproblemet duke i zgjidhur ato ne menyre rekursive. Megjithate, nese madhesia e nenproblemeve eshte mjaftueshem e vogel, zgjidh nenproblemet ne nje menyre te drejtperdrejte.

Kombino zgjidhjet e nenproblemeve per te perftuar zgjidhjen e problemit fillestar.

Renditja me perzierje (Merge Sort )


Algoritmi i renditjes me perzierje ndjek parimin pera e sundo.

Pera: Ndaj sekuencen prej n elementesh qe duhet renditur, ne dy nensekuenca me nga n/2 elemente secila.
Sundo: Rendit dy nensekuencat ne menyre rekursive duke perdorur renditjen me perzierje. Kombino: Perziej dy nensekuencat e renditura per te prodhuar zgjidhjen e renditur: Rekursiviteti perfundon kur sekuenca qe duhet renditur ka gjatesine 1, rast ne te cilin nuk ka pune per te bere, meqe do sekuence prej 1 elementi eshte vete e renditur.

Renditja me perzierje - Pseudokodi

Thirrja fillestare: MERGE-SORT(A, 1, n)

Renditja me perzierje Shembull per n=8

Renditja me perzierje Shembull per n=11

Renditja me perzierje (Merge Sort )


Veprimi baze i renditjes me perzierje eshte perzierja e dy sekuencave, ne hapin Kombino Per te realizuar perzierjen , ne perdorim nje procedure ndihmese MERGE(A, p, q, r), ku A eshte nje vektor dhe p,

q, dhe r jane indekset qe numerojne elementet e vektorit te tille qe p q < r. Procedura supozon se nenvektoret A[p..q] dhe A[q + 1..r] jane te renditur. Kjo procedure i perzien dy vektoret per te formuar nje nenvektor te vetem te renditur qe zevendeson nenvektorin aktual A[p..r].

Renditja me perzierje (Merge Sort )


Procedura MERGE kerkon nje kohe ekzekutimi te rendit (n), ku n = r - p + 1 eshte numri i elementeve qe po renditen dhe funksionon si me poshte: Duke iu kthyer lojes me letra, supozojme se: Kemi dy stiva me letra mbi tavoline, ku selica stive eshte e renditur, me letren me te vogel ne maje te stives. Ne deshirojme qe ti perziejme dy stivat ne nje stive te vetme output. Hapi baze konsiston ne zgjedhjen e letres me te vogel nga dy stivat dhe heqjen e saj nga stiva dhe vendosjen ne stiven output. Ky hap perseritet, derisa njera stive input te jete bosh, kohe ne te cilen ne vetem marrim stiven input te mbetur dhe e vendosim ne stiven output. Cdo hap baze kerkon nje kohe konstante, meqenese ne jemi duke krahasuar vetem dy letrat ne maje te seciles stive. Meqe ne kryejme te shumten n hapa baze, perzierja kerkon nje kohe te rendit (n).

Renditja me perzierje (Merge Sort )


Nuk kemi nevoje qe te kontrollojme nese stiva eshte bosh ne do hap baze. Vendos ne fund te seciles stive input nje leter te veante sentinel, qe permban nje vlere te veante qe e perdorim per te thjeshtuar kodin. Ne perdorim , qe ta kemi te sigurt qe do ta humbim kete vlere. Kur eshte ne maje te seciles stive, te gjitha letrat josentinel jane vendosur tashme ne stiven output. Ne e dime qe me perpara se ka saktesisht r p + 1 letra josentinel ndalojme kur kemi kryer r p + 1 hapa baze. Pra nuk na

nevojitet kurre qe te kontrollojme per sentinelet, meqe ato gjithmone humbin.

Ne vend qe te numerojme hapat baze, mjafton te mbushim vektorin output nga indeksi p deri tek dhe duke perfshire indeksin r .

Renditja me perzierje - Pseudokodi

Shembull: Thirrja e MERGE(9, 12, 16)

Shembull: Thirrja e MERGE(9, 12, 16) - vazhdim

Analiza e renditjes me perzierje (1)


Per thjeshtesi supozojme se n eshte fuqi e 2, pra cdo hap perca na con ne dy nenprobleme, secili me madhesi saktesisht n/2 Hapi baze ndodh kur n = 1. Kur n 2, duhen hapat per Merge Sort: Perca: Llogaritet q si mesatare e p dhe r , pra D(n) = (1). Sundo: Zgjidhen dy nenproblemet ne menyre rekursive, secili me madhesi n/2, pra 2T (n/2). Kombino: MERGE per nje nenvektor me n elemente kerkon nje kohe (n), pra C(n) = (n). Meqe D(n) = (1) dhe C(n) = (n), te dy se bashku sjellin nje funksion

qe eshte linear ne n: (n) Pra rekursiviteti per kohen e ekzekutimit te merge sort eshte

Analiza e renditjes me perzierje (2)


Le te jete c nje konstante qe pershkruan kohen e ekzekutimit per rastin baze dhe gjithashtu eshte koha per element vektori per hapat pera e sundo (natyrisht nuk eshte e domosdoshme qe te perdoret e njejta konstante per te dyja). Per kete kemi:

Vizatojme nje peme rekursiviteti, qe tregon zgjerimin hap pas hapi: Per problemin fillestar, kemi nje kosto cn, plus dy nenproblemet, ku secili kushton T (n/2):

Analiza e renditjes me perzierje (3)


Per secilin nga nenproblemet me madhesi n/2, kemi nje kosto prej
cn/2, plus dy nenproblemet, ku secili kushton T (n/4):

Analiza e renditjes me perzierje (4)


Vazhdojme te zgjerojme pemen derisa madhesia e problemit te behet 1:
Secili nivel ka koston cn. Niveli me i larte ka koston cn. Niveli pasardhes me poshte ka 2 nenprobleme, me kosto cn/2 secili Niveli pasardhes ka 4 nenprobleme, me kosto cn/4 secili. Sa here qe ulemi me nje nivel, numri i nenproblemeve dyfishohet por kostoja per gjysmat e nenproblemeve kostoja per nivek mbetet e njejte. Ka lg n + 1 nivele (lartesia

eshte lg n).

Analiza e renditjes me perzierje (5)


Duke perdorur induksionin kemi: Rasti baze: n = 11 nivel, dhe lg 1 + 1 = 0 + 1 = 1. Hipoteza induktive eshte qe nje peme per nje problem me madhesi 2i ka lg 2i+1 = i+1 nivele. Duhet te vertetojme qe pema me madhesi 2i+1 ka i + 2 nivele. Meqe supozojme se madhesia e problemit eshte fuqi e numrit 2, madhesia e problemit tjeter pas 2i eshte 2i+1. Nje peme per nje problem me madhesi 2i+1 ka nje nivel me shume se pema e problemit me madhesi 2i i + 2 nivele. Meqe lg 2i+1 + 1 = i + 2, pema ka i+2 nivele (cfare deshem te vertetojme) Kostoja totale eshte shuma e kostove te secilit nivel. Kemi lg n +1 nivele, ku secili e ka koston cn kostoja totale eshte cn lg n + cn. Duke mos marre parasysh termin e rendit me te ulet cn dhe koeficientin konstant c (n lg n).

Krahasime
Krahasuar me renditjen me nderfutje, renditja me perzierje eshte me e shpejte. Per madhesi te vogla inputi, renditja me nderfutje mund te jete me e shpejte. Por per inpute mjaft te medha renditja me perzierje gjithmone do te jete me e shpejte, sepse koha e ekzekutimit te tij rritet me ngadale se koha e ekzekutimit te renditjes me nderfutje.

Detyre Shtepie
Bazuar ne algoritmin ne pseudokod per renditjen me perzierje, ndertoni nje program ne Paskal per kete algoritme. Modifikojeni algoritmin menyre qe ai ti rendise vektoret ne rendin zbrites.

Pyetje