Copyright, 2009 © Szlávi Péter A kupac és a prioritási sor típuskonstrukciók Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék
Adatszerkezetek2/55 Tartalomjegyzék I. A kupac típuskonstrukció A kupac típuskonstrukcióA kupac típuskonstrukció II. A prioritási sor típuskonstrukció A prioritási sor típuskonstrukcióA prioritási sor típuskonstrukció
Adatszerkezetek3/55 Tartalomjegyzék 0 A kupac-filozófia filozófia 1 A kupac algebrai specifikációja 1.1 Kupac-műveletek műveletek 1.2 Kupac-axiómák axiómák 2 A kupac típuskonstrukció specifikációja 2.1 A kupac exportmodulja exportmodulja 2.2 A kupac megvalósítási moduljai megvalósítási moduljaimegvalósítási moduljai I.
Adatszerkezetek4/55 11 A Kupac-filozófia 1 A kupac olyan véges elemsokaság, amely rendelkezik az alábbi tulajdonságokkal: 1.Minden elemnek legfeljebb két rákövetkezője (leszármazottja) lehet. Azaz bináris fának tekinthető. 2.Minden részfájának gyökere kisebb (vagy egyenlő) a közvetlen leszármazottainál. 3.A kupac balról folytonos, azaz ha nem teljes a fa, akkor csak a legutolsó szintből hiányozhatnak elemek, de azok is csak a szint jobb széléről. Ezek következménye, hogy ábrázolható folytonosan is, tömbben. I. A rákövetkezés rendezési reláció, azaz „elemciklusok” nincsenek. Természetesen a nagyobb- egyenlőség ugyanígy elképzelhető. A rendezettség irány nem lényegi kérdés.
Adatszerkezetek5/55 11 A kupac algebrai specifikációja 1.1 Kupac-műveletek 1 Típus Kupac(N,Elem): Asszociált műveletek: Létrehoz(Tömb(1..N:Elem)): Kupac [ egy Elem-sorozatból készít kupacot ] Üres: Kupac KupacHossz(Kupac): Egész [ az Elem-sorozat kezdő kupac-tulajdonságú részének a hossza ] Méret(Kupac Tömb): Egész [ a teljes Elem-sorozat hossza ] Kupac?(Kupac Tömb,Egész): Logikai [ rendelkezik-e a kupac-tulajdonsággal az Elem-sorozat egy adott indexű elemétől kezdődően a kupachosszig ] A csak leíró szerepű műveleteket dőlten szedtem I.
Adatszerkezetek6/ Kupac-műveletek (folytatás) Kupacba(Kupac,Elem): Kupac {NemDef} [az Elem-et a kupacba betesz, a kupac-tulajdonság megmarad] Kupacból(Kupac): (Kupac Elem) {NemDef} [a kupacból a gyökeret kiveszi, a kupac-tulajdonság megmarad] KupacRövidítés(Kupac): Kupac [a kupac első (gyökér) és utolsó elemének cseréje, majd a kupac- tulajdonság helyreállítása] Érték(Kupac Tömb,Egész): Elem {NemDef} [az Elem-sorozat adottadik elemének értéke] BalGyerek(Kupac,Egész): Egész {NemDef} [a kupac adottadik elemének bal gyerekének indexe] JobbGyerek(Kupac,Egész): Egész {NemDef} [a kupac adottadik elemének jobb gyerekének indexe] MinGyerek(Kupac,Egész): Egész {NemDef} [a kupac adottadik elemének kisebbik gyerekének indexe] VanGyerek?(Kupac,Egész): Logikai {NemDef} [a kupac adottadik elemének van-e gyereke] UtolsóSzülő(Kupac): Egész {NemDef} [a kupac utolsó gyerekkel bíró elmének indexe] A csak leíró szerepű műveleteket dőlten szedtem I.
Adatszerkezetek7/ Kupac-axiómák 1.2 Axiómák:Jelölések: k,k’:Kupac(Elem) = Kupac-típusú objektumk,k’:Kupac(Elem) = Kupac-típusú objektum t:Tömb(1..N:Elem) = tömb típusú objektumt:Tömb(1..N:Elem) = tömb típusú objektum i,j:Egész = tömb-indexeki,j:Egész = tömb-indexek 1 o Létrehoz – axióma k=Létrehoz(t) i [1..N]: j [1..N]: t(i)=Érték(k,j) KupacHossz(k)=N Méret(k)=N Kupac?(k,1) 2 o Üres – axióma k=Üres KupacHossz(k)=0 Méret(k)=N I.
Adatszerkezetek8/ Kupac-axiómák (folytatás) o Kupac-tulajdonság – axióma Kupac?(k,i) i>KupacHossz(k) i UtolsóSzülő(k) [ KupacHossz(k)] Érték(k,i) Érték(MinGyerek(k,i)) Kupac?(k,BalGyerek(k,i)) Kupac?(k,JobbGyerek(k,i)) 1.állítás: Az üres kupac kupac-tulajdonságú j 1: Kupac?(Üres,j) Biz.: 2 o - és 3 o -ból következik 2.állítás: A kupac-tulajdonság öröklése Kupac?(k,i) j>i: Kupac?(k,j) Biz.: 3 o -ból következik I.
Adatszerkezetek9/ Kupac-axiómák (folytatás) o Méret – axióma o Művelet Kupac : k’=o(k) Méret(k’)=Méret(k)=N 5 o Kupacba – axióma KupacHossz(k)<N k’=Kupacba(k,e) KupacHossz(k’)=KupacHossz(k)+1 i [1..KupacHossz(k)]: Érték(k,i) k’ e k’ Kupac?(k’,1) KupacHossz(k)=N Kupacba(k,e)=NemDef I.
Adatszerkezetek10/ Kupac-axiómák (folytatás) o Kupacból – axióma KupacHossz(k)>0 (k’,e)=Kupacból(k) e=Érték(k,1) KupacHossz(k’)=KupacHossz(k)–1 i [2..KupacHossz(k)]: Érték(k,i) k’ Kupac?(k’,1) KupacHossz(k)=0 Kupacból(k)=NemDef 7 o KupacRövidítés – axióma k’=KupacRövidítés(k) Érték(k’,KupacHossz(k))=Érték(k,1) KupacHossz(k’)=KupacHossz(k)–1 i [2..KupacHossz(k)]: Érték(k,i) k’ Kupac?(k’,1) I.
Adatszerkezetek11/ Kupac-axiómák (folytatás) o Gyerek – axióma i [1..UtolsóSzülő(k)] VanGyerek?(k,i) JobbGyerek(k,i) KupacHossz(k) Érték(BalGyerek(k,i)) Érték(JobbGyerek(k,i)) MinGyerek(k,i)=BalGyerek(k,i) Érték(BalGyerek(k,i))>Érték(JobbGyerek(k,i)) MinGyerek(k,i)=JobbGyerek(k,i) JobbGyerek(k,i)>KupacHossz(k) MinGyerek(k,i)=BalGyerek(k,i) i (UtolsóSzülő(k)..KupacHossz(k)] VanGyerek?(k,i) … I.
Adatszerkezetek12/55 2 A kupac típuskonstrukció specifikációja 2.1 A kupac exportmodulja ExportModul Kupac(Konstans N:Egész, Típus TElem): Típus TTömb=Tömb(1..N:TElem) Típus TTömb=Tömb(1..N:TElem) Eljárás Létrehoz(Konstans t:TTömb, Változó k:Kupac) Eljárás Létrehoz(Konstans t:TTömb, Változó k:Kupac) Eljárás Üres(Változó k:Kupac) Eljárás Üres(Változó k:Kupac) Függvény KupacHossz(Konstans k:Kupac):Egész Függvény KupacHossz(Konstans k:Kupac):Egész Függvény Méret(Konstans k:Kupac):Egész Függvény Méret(Konstans k:Kupac):Egész Függvény Kupac?(Konstans k:Kupac, i:Egész):Logikai Függvény Kupac?(Konstans k:Kupac, i:Egész):Logikai Függvény Kupacba(Változó k:Kupac, Konstans e:TElem) Függvény Kupacba(Változó k:Kupac, Konstans e:TElem) Függvény Kupacból(Változó k:Kupac, e:TElem) Függvény Kupacból(Változó k:Kupac, e:TElem) Meg kell gondolni az operátorok ef/uf-ét az axiómák alapján! I.
Adatszerkezetek13/ A kupac exportmodulja (folytatás) Eljárás KupacRövidítés(Változó k:Kupac) Eljárás KupacRövidítés(Változó k:Kupac) Függvény Érték(Változó k:Kupac, Konstans i:Egész):TElem Függvény Érték(Változó k:Kupac, Konstans i:Egész):TElem Függvény BalGyerek(Változó k:Kupac, Konstans i:Egész):Egész Függvény BalGyerek(Változó k:Kupac, Konstans i:Egész):Egész Függvény JobbGyerek(Változó k:Kupac, Konstans i:Egész):Egész Függvény JobbGyerek(Változó k:Kupac, Konstans i:Egész):Egész Függvény MinGyerek(Változó k:Kupac, Konstans i:Egész):Egész Függvény MinGyerek(Változó k:Kupac, Konstans i:Egész):Egész Függvény VanGyerek?(Változó k:Kupac, Konstans i:Egész):Logikai Függvény VanGyerek?(Változó k:Kupac, Konstans i:Egész):Logikai I.
Adatszerkezetek14/ A kupac exportmodulja (folytatás) Függvény UtolsóSzülő(Konstans k:Kupac):Egész Függvény UtolsóSzülő(Konstans k:Kupac):Egész Függvény Hibás?(Változó k:Kupac):Logikai Függvény Hibás?(Változó k:Kupac):LogikaiVáltozó Modul vége. I.
Adatszerkezetek15/55 22 A kupac típuskonstrukció specifikációja 2.2. A kupac megvalósítási modulja 2 Egyetlen „értelmes” ábrázolás van: a folytonos, a tömbre építkező. Modul Kupac(Konstans N:Egész, Típus TElem): Reprezentáció [Típus TTömb=Tömb(1..N:TElem)] Változó elemek:TTömb hossz,maxHossz:0..N hiba:Logikai I.
Adatszerkezetek16/ A kupac megvalósítási modulja (folytatás) Implementáció Eljárás Létrehoz(Konstans t:TTömb, Változó k:Kupac): Változó j:Egész elemek:=t; hossz:=N; maxHossz:=N; hiba:=Hamis Ciklus j=UtolsóSzülő(k)-től 1-ig -1-esével GyökérHelyre(k,j) Ciklus vége elemek:=t; hossz:=N; maxHossz:=N; hiba:=Hamis Ciklus j=UtolsóSzülő(k)-től 1-ig -1-esével GyökérHelyre(k,j) Ciklus vége Eljárás vége. Eljárás Üres(Változó k:Kupac): hossz:=0 maxHossz:=N hiba:=Hamis Eljárás vége. Eljárás GyökérHelyre(Változó k:Kupac, gyökér:Egész): Változó szülő, gyerek:Egész szülő:=gyökér; gyerek:=MinGyerek(k,szülő) Ciklus amíg VanGyerek?(k,szülő) és Érték(k,szülő)>Érték(k,gyerek) Csere(k,szülő,gyerek); szülő:=gyerek gyerek:=MinGyerek(k,gyerek) Ciklus vége Eljárás vége. szülő:=gyökér; gyerek:=MinGyerek(k,szülő) Ciklus amíg VanGyerek?(k,szülő) és Érték(k,szülő)>Érték(k,gyerek) Csere(k,szülő,gyerek); szülő:=gyerek gyerek:=MinGyerek(k,gyerek) Ciklus vége Eljárás vége. Lokális eljárás L. A példát! példá L. A példát! példá I.
Adatszerkezetek17/ A kupac megvalósítási modulja (folytatás) Kiinduló állapot „fás” képe:Kiinduló állapot „fás” képe: A kupacosítandó sorozat A kupacosítás (Létrehozás lépései):A kupacosítás (Létrehozás lépései): I.
Adatszerkezetek18/ A kupac megvalósítási modulja (folytatás) Íme a kupac! I.
Adatszerkezetek19/ A kupac megvalósítási modulja (folytatás) Függvény Kupac?(Konstans k:Kupac, i:Egész):Logikai … hf … … hf … Függvény vége. Függvény KupacHossz(Konstans k:Kupac):Egész KupacHossz:=hossz KupacHossz:=hossz Függvény vége. Függvény Méret(Konstans k:Kupac):Egész Méret:=maxHossz Méret:=maxHossz Függvény vége. Függvény Érték(Változó k:Kupac, Konstans i:Egész):TElem [Ef: i [1..maxHossz]] Érték:=elemek(i) Érték:=elemek(i) Függvény vége. I.
Adatszerkezetek20/ A kupac megvalósítási modulja (folytatás) Eljárás Kupacba(Változó k:Kupac, Konstans e:TElem): [Ef: hossz<maxHossz] Változó j:Egész [új elem a végére:] hossz:+1; elemek(hossz):=e [a kupac-tulajdonság helyreállítása:] Ciklus j=UtolsóSzülő(k)-től 1-ig -1-esével GyökérHelyre(k,j) Ciklus vége Eljárás vége. Eljárás Kupacból(Változó k:Kupac, e:TElem): [Ef: hossz>0] e:=elemek(1); KupacRövidítés(k) e:=elemek(1); KupacRövidítés(k)KupacRövidítés Eljárás vége. L. A Létrehozás-nál! Létrehozás L. A Létrehozás-nál! Létrehozás L. A példát! példá L. A példát! példá I.
Adatszerkezetek21/ A kupac megvalósítási modulja (folytatás) Elemkivétel: Kupacból( [1,2,6,3,4,7,8,5] , e)Elemkivétel: Kupacból( [1,2,6,3,4,7,8,5] , e) „Utolsó előre fuss!” Előrehozás + kupacosítás:Előrehozás + kupacosítás: Elemkiolvasás I.
Adatszerkezetek22/ A kupac megvalósítási modulja (folytatás) Függvény BalGyerek(Változó k:Kupac, Konstans i:Egész):Egész [Ef: i [1..hossz Div 2]] BalGyerek:=i*2 BalGyerek:=i*2 Függvény vége. Függvény JobbGyerek(Változó k:Kupac, Konstans i:Egész):Egész [Ef: i [1..hossz Div 2]] JobbGyerek:=i*2+1 JobbGyerek:=i*2+1 Függvény vége. L. Az UtolsóSzülő-nél! UtolsóSzülő L. Az UtolsóSzülő-nél! UtolsóSzülő I.
Adatszerkezetek23/ A kupac megvalósítási modulja (folytatás) Függvény MinGyerek(Változó k:Kupac, Konstans i:Egész):Egész [Ef: i [1..hossz Div 2]] Elágazás JobbGyerek(k,i)>hossz esetén MinGyerek:=BalGyerek(k,i) Érték(BalGyerek(k,i)) hossz esetén MinGyerek:=BalGyerek(k,i) Érték(BalGyerek(k,i))<Érték(JobbGyerek(k,i)) esetén MinGyerek:=BalGyerek(k,i) egyéb esetben MinGyerek:=JobbGyerek(k,i) Elágazás vége Függvény vége. I.
Adatszerkezetek24/ A kupac megvalósítási modulja (folytatás) Függvény VanGyerek?(Változó k:Kupac, Konstans i:Egész):Logikai [Ef: i [1..hossz]] VanGyerek?:=i*2[=BalGyerek] hossz Függvény vége. Függvény UtolsóSzülő(Konstans k:Kupac):Egész [Ef: i [1..hossz]] UtolsóSzülő:=hossz Div 2 Függvény vége. Függvény Hibás?(Változó k:Kupac):Logikai … hf … Változó Függvény vége. I.
Adatszerkezetek25/ A kupac megvalósítási modulja (folytatás) Eljárás KupacRövidítés(Változó k:Kupac): Csere(k,hossz,1); hossz:-1; GyökérHelyre(k,1) GyökérHelyre Eljárás vége. Inicializálás Inicializálás Hossz:=0; maxHossz:=N; hiba:=Hamis Modul vége. Eljárás Csere(Változó k:Kupac, i,j:Egész): Változó cs:TElem cs:=elemek(i); elemek(i):=elemek(j); elemek(j):=cs cs:=elemek(i); elemek(i):=elemek(j); elemek(j):=cs Eljárás vége. Lokális eljárás I.
Adatszerkezetek26/55 Tartalomjegyzék 1 A prioritási sor algebrai specifikációja algebrai specifikációjaalgebrai specifikációja 1.1 Prioritási sor-műveletek műveletek 1.2 Prioritási sor-axiómák axiómák 2 A prioritási sor típuskonstrukció specifikációja típuskonstrukció specifikációjatípuskonstrukció specifikációja 2.1 A prioritási sor exportmodulja exportmodulja 2.2 A prioritási sor megvalósítási moduljai megvalósítási moduljaimegvalósítási moduljai Prioritás-szerint rendezett (folytonos ) ábrázolás Prioritás-szerint rendezett (folytonos ) ábrázolásPrioritás-szerint rendezett (folytonos ) ábrázolás Időrendben rendezett (folytonos ) ábrázolás Időrendben rendezett (folytonos ) ábrázolásIdőrendben rendezett (folytonos ) ábrázolás Kupacos ábrázolás Kupacos ábrázolásKupacos ábrázolás 3 Alkalmazási példák példák II.
Adatszerkezetek27/55 11 A prioritási sor algebrai specifikációja 1.1 Prioritási sor-műveletek 1 Típus PrSor(Elem,Prioritás): Asszociált műveletek: Üres: PrSor Üres?(PrSor): Logikai Tele?(PrSor): Logikai Első(PrSor): (Elem Prioritás) {NemDef} Sorba(PrSor,Elem,Prioritás): PrSor {NemDef} Sorból(PrSor): (PrSor Elem Prioritás) {NemDef} SorHossz(PrSor): Egész II.
Adatszerkezetek28/ Prioritási sor-axiómák 1.2 Axiómák: 1 o Az Üres prioritási sor üres. s=Üres Üres?(s) SorHossz(s)=0 2 o Az a prioritási sor, amelyben legalább egy elem van, az nem üres; a sorba tétel során a sor hossza eggyel nő. Tele?(s) Üres?(Sorba(s,e,p)) SorHossz(Sorba(s,e,p))=SorHossz(s)+1 3a o Az üres prioritási sornak nincs első eleme. Első?(Üres)=NemDef 3b o Az Üres prioritási sorból nem lehet kivenni elemet. Sorból(Üres)=NemDef 3c o A tele prioritási sorba nem lehet további elemet betenni. Tele?(s) Sorba(s,e,p)=NemDef II.
Adatszerkezetek29/ Prioritási sor-axiómák (folytatás) 4 o A prioritási sor első eleme a legnagyobb prioritásúak közül a legrégebben betett elem. Üres?(s) Tele?(s) Első(Sorba(s,e,p))=(e,p) Üres?(s) Tele?(s) s’=Sorba(s,e,p) ( Első(s).Pr p Első(s’)=Első(s) ) ( Első(s).Pr<p Első(Sorba(s,e,p))=(e,p) ) SorHossz(s’)=SorHossz(s)+1.Pr II.
Adatszerkezetek30/ Prioritási sor-axiómák (folytatás) 5 o A prioritási sorból az első elemet lehet kivenni (a többi nem változik). Üres?(s) Tele?(s) Sorból(Sorba(s,e,p))=(s,e,p) Üres?(s) Tele?(s) Sorból(s)=(s’,e’,p’) (e’,p’)=Első(s) ( Első(s).Pr<p s=Sorból(Sorba(s,e,p)).Sor ) ( Első(s).Pr p Sorba(s’,e,p)=Sorból(Sorba(s,e,p)).Sor ).Sor Állítás: a Sorból művelet után eggyel csökkent a prioritási sor hossza. Üres?(s) SorHossz(Sorból(s).Sor)=SorHossz(s)–1 Biz.: 2 o & 5 o –ből következik. II.
Adatszerkezetek31/55 2 A prioritási sor típuskonstrukció specifikációja 2.1 A prioritási sor exportmodulja ExportModul PrSor(Típus TElem: Típus TPrior): Eljárás Üres(Változó s:PrSor) Eljárás Üres(Változó s:PrSor) Függvény Üres?(Konstans s:PrSor): Logikai Függvény Üres?(Konstans s:PrSor): Logikai Függvény Tele?(Konstans s:PrSor): Logikai Függvény Tele?(Konstans s:PrSor): Logikai Függvény ElsőElem(Változó s:PrSor): TElem Függvény ElsőElem(Változó s:PrSor): TElemVáltozó Függvény ElsőPrioritás(Változó s:PrSor): TPrior Függvény ElsőPrioritás(Változó s:PrSor): TPrior Eljárás Sorba(Változó s:PrSor, Konstans e:TElem, p:TPrior) Eljárás Sorba(Változó s:PrSor, Konstans e:TElem, p:TPrior) Függvény SorHossz(Konstans s:PrSor): Egész Függvény SorHossz(Konstans s:PrSor): Egész Meg kell gondolni az operátorok ef/uf-ét az axiómák alapján! II.
Adatszerkezetek32/ A prioritási sor exportmodulja (folytatás) Eljárás Sorból(Változó s:PrSor, e:TElem, p:TPrior) Eljárás Sorból(Változó s:PrSor, e:TElem, p:TPrior) Infix Operátor Azonos?(Konstans s1,s2:PrSor):Logikai Infix Operátor Azonos?(Konstans s1,s2:PrSor):Logikai Másnéven s1=s2 Másnéven s1=s2 Infix Operátor LegyenEgyenlő(Változó s1:PrSor, Konstans s2:PrSor) Másnéven s1:=s2 Infix Operátor LegyenEgyenlő(Változó s1:PrSor, Konstans s2:PrSor) Másnéven s1:=s2 Operátor Kiírás(Konstans s:PrSor) Másnéven Ki: s Operátor Kiírás(Konstans s:PrSor) Másnéven Ki: s Operátor Beolvasás(Változó s:PrSor) Másnéven Be: s Operátor Beolvasás(Változó s:PrSor) Másnéven Be: s Függvény Hibás?(Változó s:PrSor): Logikai Függvény Hibás?(Változó s:PrSor): LogikaiVáltozó Modul vége. II.
Adatszerkezetek33/55 22 A prioritási sor típuskonstrukció specifikációja 2.2. A prSor megvalósítási moduljai Prioritás-szerint rendezett (folytonos ) ábrázolás moduljai 2moduljai Modul PrSor(Típus TElem: Típus TPrior): Reprezentáció Konstans MaxHossz: Egész(???) Típus TPrElem=Rekord(elem: TElem, pr: TPrior) PrElemek=Tömb(1..MaxHossz: TPrElem) [TípusInvariáns: növekvően…] Változó se: PrElemek eleje, vége, hossz : 0..MaxHossz hiba: Logikai II.
Adatszerkezetek34/ Prioritás-szerint rendezett (folytonos ) ábrázolás (folytatás) Implementáció Eljárás Üres(Változó s:PrSor): eleje:=1; vége:=1; hossz:=0; hiba:=Hamis Eljárás vége. Függvény Üres?(Konstans s:PrSor): Logikai Üres?:=hossz=0 Függvény vége. Függvény Tele?(Konstans s:PrSor): Logikai Tele?:= hossz=MaxHossz Tele?:= hossz=MaxHossz Függvény vége. Függvény ElsőElem(Változó s:PrSor): TElem Ha hossz 0 akkor ElsőElem:=se(eleje).elem különben hiba:=Igaz Ha hossz 0 akkor ElsőElem:=se(eleje).elem különben hiba:=Igaz Függvény vége. II.
Adatszerkezetek35/ Prioritás-szerint rendezett (folytonos ) ábrázolás (folytatás) Függvény ElsőPrioritás(Változó s:PrSor): TPrior Ha hossz 0 akkor ElsőPrioritás:=se(eleje).pr különben hiba:=Igaz Függvény vége. Eljárás Sorba(Változó s:PrSor, Konstans e:TElem, p:TPrior): Ha hossz<MaxHossz akkor Ha hossz=0 akkor hely:=eleje különben Helykeresés(eleje,vége,hely,p) Eltolás(hely,vége) Elágazás vége se(hely).elem:=e; se(hely).pr:=p vége: 1; hossz:+1... II.
Adatszerkezetek36/ Prioritás-szerint rendezett (folytonos ) ábrázolás (folytatás)... különben hiba:=Igaz Elágazás vége Eljárás vége.... különben hiba:=Igaz Elágazás vége Eljárás vége. Eljárás Helykeresés(Konstans eleje,vége:0..MaxHossz, Változó hely: 0..MaxHossz, Konstans p:TPrior): hely:=eleje Ciklus amíg hely vége 1 és se(hely).pr p hely: 1 Ciklus vége [hely vége 1 és se(hely).pr<p vagy hely=vége 1 TípusInvariáns] Eljárás vége. hely:=eleje Ciklus amíg hely vége 1 és se(hely).pr p hely: 1 Ciklus vége [hely vége 1 és se(hely).pr<p vagy hely=vége 1 TípusInvariáns] Eljárás vége.TípusInvariáns II.
Adatszerkezetek37/ Prioritás-szerint rendezett (folytonos ) ábrázolás (folytatás) Eljárás Eltolás(Konstans hely,vége:0..MaxHossz): Változó i:Egész i:=vége Ciklus amíg i hely 1 se(i 1):=se(i); i: 1 Ciklus vége Eljárás vége. i:=vége Ciklus amíg i hely 1 se(i 1):=se(i); i: 1 Ciklus vége Eljárás vége. Eljárás Sorból(Változó s:PrSor, e:TElem, p:TPrior): Ha hossz>0 akkor p:=se(eleje).pr; e:=se(eleje).elem eleje: 1; hossz:-1 különben hiba:=Igaz Elágazás vége Eljárás vége. II.
Adatszerkezetek38/ Prioritás-szerint rendezett (folytonos ) ábrázolás (folytatás) Függvény SorHossz(Konstans s:Sor): Egész SorHossz:=hossz Függvény vége. Függvény Hibás?(Változó s:PrSor): Logikai Hibás?:=hiba; hiba:=Hamis Függvény vége. Infix Operátor Azonos?(Konstans s1, s2:PrSor):Logikai Másnéven s1=s2 ??? Operátor vége. Infix Operátor LegyenEgyenlő(Változó s1:PrSor, Konstans s2:PrSor) Másnéven s1:=s2 Infix Operátor Azonos?(Konstans s1, s2:PrSor):Logikai Másnéven s1=s2 ??? Operátor vége. Infix Operátor LegyenEgyenlő(Változó s1:PrSor, Konstans s2:PrSor) Másnéven s1:=s2??? ??? Operátor vége. ??? Operátor vége.??? II.
Adatszerkezetek39/ Prioritás-szerint rendezett (folytonos ) ábrázolás (folytatás) Operátor Kiírás(Konstans s:PrSor) Másnéven Ki: s … Operátor vége. Operátor Kiírás(Konstans s:PrSor) Másnéven Ki: s … Operátor vége. Operátor Beolvasás(Változó s:PrSor) Másnéven Be: s … Operátor vége. Inicializálás Inicializálás eleje:=1; vége:=1; hossz:=0; hiba:=Hamis Modul vége. II.
Adatszerkezetek40/55 22 A prioritási sor típuskonstrukció specifikációja 2.2. A prSor meglósítási moduljai Időrendben rendezett (folytonos ) ábrázolás 2 Modul PrSor(Típus TElem: Típus TPrior): Reprezentáció … ugyanaz, mint ben II.
Adatszerkezetek41/ Időrendben rendezett (folytonos ) ábrázolás (folytatás) Eljárás Üres(Változó s:PrSor):...ugyanaz, mint ben Eljárás vége Függvény Üres?(Konstans s:PrSor): Logikai...ugyanaz, mint ben Függvény vége Függvény Tele?(Konstans s:PrSor): Logikai...ugyanaz, mint ben Függvény vége Függvény ElsőElem(Változó s:PrSor): TElem Ha hossz 0 akkor ElsőElem:=se(Max(s)).eleje különben hiba:=Igaz Függvény vége. II.
Adatszerkezetek42/ Időrendben rendezett (folytonos ) ábrázolás (folytatás) Függvény Max(Változó s:PrSor): 1..MaxHossz i:=eleje; m:=i Ciklus j=1-től hossz-1-ig i: 1; Ha se(i).pr>se(m).pr akkor m:=i Ciklus vége Max:=m Függvény vége. Függvény ElsőPrioritás(Változó s:PrSor): TPrior Ha hossz 0 akkor ElsőPrioritás:=se(Max(s)).pr különben hiba:=Igaz Függvény vége. Eljárás Sorba(Változó s:PrSor, Konstans e:TElem, p:TPrior): Ha hossz<MaxHossz akkor se(vége).pr:=p; se(vége):=e; hossz:+1; vége: 1 II.
Adatszerkezetek43/ Időrendben rendezett (folytonos ) ábrázolás (folytatás) különben hiba:=Igaz Elágazás vége Eljárás vége. különben hiba:=Igaz Elágazás vége Eljárás vége. Eljárás Sorból(Változó s:PrSor, e:TElem, p:Priotitás): Változó maxI:Egész Ha hossz>0 akkor maxI:=Max(s); e:=se(maxI).elem; p:=se(maxI).pr; Rátolás(maxI,vége); hossz:-1; vége: 1 különben hiba:=Igaz Elágazás vége Eljárás vége. Függvény Hibás?(Változó s:PrSor): Logikai...ugyanaz, mint ben Függvény vége. 2.2.1 2.2.1 Hf. II.
Adatszerkezetek44/ Időrendben rendezett (folytonos ) ábrázolás (folytatás) Infix Operátor Azonos?(Konstans s1, s2:PrSor):Logikai … ugyanaz, mint ben... Operátor vége. Infix Operátor Azonos?(Konstans s1, s2:PrSor):Logikai … ugyanaz, mint ben... Operátor vége. Infix Operátor LegyenEgyenlő(Változó s1:PrSor, Konstans s2:PrSor) … ugyanaz, mint ben... Operátor vége. Operátor Kiírás(Konstans s:PrSor) … ugyanaz, mint ben... Operátor vége. Operátor Kiírás(Konstans s:PrSor) … ugyanaz, mint ben... Operátor vége. Operátos Beolvasás(Változó s:PrSor) … ugyanaz, mint ben... Operátor vége. Inicializálás … ugyanaz, mint ben... … ugyanaz, mint ben Modul vége. II.
Adatszerkezetek45/55 22 A prioritási sor típuskonstrukció specifikációja 2.2. A prSor meglósítási moduljai Kupacos ábrázolás 2 Modul PrSor(Típus TElem: Típus TPrior): Reprezentáció Konstans MaxHossz: Egész(???) Típus TPrElem=Rekord(elem: TElem, pr: TPrior) TPrElemek=Kupac(MaxHossz, TPrElem) Változó ke: TPrElemek Változó ke: TPrElemek II.
Adatszerkezetek46/ Kupacos ábrázolás (folytatás) Implementáció Eljárás Üres(Változó s:PrSor): Üres(ke) Eljárás vége. Függvény Üres?(Konstans s:PrSor): Logikai Üres?:=KupacHossz(ke)=0 Függvény vége. Függvény Tele?(Konstans s:PrSor): Logikai Tele?:=KupacHossz(ke)=MaxHossz Tele?:=KupacHossz(ke)=MaxHossz Függvény vége. II.
Adatszerkezetek47/ Kupacos ábrázolás (folytatás) Függvény ElsőElem(Változó s:PrSor): TElem Ha KupacHossz(ke) 0 akkor ElsőElem:=Érték(ke,1).elem különben hiba:=Igaz Elágazás vége Ha KupacHossz(ke) 0 akkor ElsőElem:=Érték(ke,1).elem különben hiba:=Igaz Elágazás vége Függvény vége. Függvény ElsőPrioritás(Változó s:PrSor): TPrior Ha KupacHossz(ke) 0 akkor ElsőPrioritás:=Érték(ke,1).pr különben hiba:=Igaz Elágazás vége Függvény vége. II.
Adatszerkezetek48/ Kupacos ábrázolás (folytatás) Eljárás Sorba(Változó s:PrSor, Konstans e:TElem, p:TPrior): Ha KupacHossz(ke)<MaxHossz akkor Kupacba(ke,TPrElem(e,p)) különben hiba:=Igaz Elágazás vége Eljárás vége. Eljárás Sorból(Változó s:PrSor, e:TElem, p:TPrior): Változó ep:TPrElem Ha KupacHossz(ke)>0 akkor Kupacbol(ke,ep) e:=ep.elem; p:=ep.pr különben hiba:=Igaz Eljárás vége. II.
Adatszerkezetek49/ Kupacos ábrázolás (folytatás) Függvény SorHossz(Konstans s:Sor): Egész SorHossz:=KupacHossz(ke) Függvény vége. Függvény Hibás?(Változó s:PrSor): Logikai Hibás?:=Hibás?(ke) Függvény vége. … hf … … hf … Inicializálás Inicializálás Üres(ke) Üres(ke) Modul vége. II.
Adatszerkezetek50/55 33 Alkalmazási példák Megszakítási rendszerMegszakítási rendszer 3.2 Mindennapok prioritási soraiMindennapok II.
Adatszerkezetek51/ Megszakítási rendszer 3.1 A számítógép az esetleg konkuráló (egyidejűleg érkező) megszakításokat egy prioritási sorba gyűjti, majd ennek sorrendjében hajtja végre az egyes megszakításokhoz rendelt rutinokat... II.
Adatszerkezetek52/ Mindennapok prioritási sorai 3.2 Az Élet „dezertörei” mindenki által kellően átélt példákkal illusztrálják a prioritási sorok „létjogosultságát”, de legalábbis létezését. II.
Adatszerkezetek53/55 Megjegyzés -- Változó A „Változó”-ság oka: valamilyen hiba lehetősége fönnáll (üres vagy tele a sor), s ennek visszajelzésére a „hiba” mező változhat.valamilyen hiba lehetősége fönnáll (üres vagy tele a sor), s ennek visszajelzésére a „hiba” mező változhat. Vagy valamely operáció (l. Hiba függvény) kifejezetten állítja.Vagy valamely operáció (l. Hiba függvény) kifejezetten állítja.
Adatszerkezetek54/55 Megjegyzés -- Tele? Ez a furcsaság azt fejezi ki, hogy a memória akkor is elfogyhat, amikor az adott sor első elemét igyekeznénk beletenni. Ez a furcsaság azt fejezi ki, hogy a memória akkor is elfogyhat, amikor az adott sor első elemét igyekeznénk beletenni.
Adatszerkezetek55/55 Megjegyzés -- ciklikus növelés A rövidség kedvéért bevezetjük ciklikus növelés, illetve csökkentés műveleteket. 1:{1..MaxHossz} {1..MaxHossz} x 1 := (x Mod MaxHossz)+1, 1:{1..MaxHossz} {1..MaxHossz} x 1 := (x 1+MaxHossz) Mod MaxHossz
Adatszerkezetek56/55 Megjegyzés -- Azonosság? „s1=s2” értelmezési lehetőségek: –„tökéletesen” azonos állapot, azaz s1.eleje=s2.eleje és s1.vége=s2.vége (értékmegosztás esetén azonos elemek) –„lényegi” azonosság, azaz azonos számú és értékű elemek.
Adatszerkezetek57/55 Megjegyzés -- Értékadás „s1:=s2” értelmezési lehetőségek: –„tökéletesen” azonos állapot létrehozása, azaz s1.eleje:=s2.eleje; s1.vége:=s2.vége (értékmegosztás esetén azonos elemek) –értékmásolás, azaz s1 minden elemének s2-másolatelem létrehozása.
Adatszerkezetek58/55 Megjegyzés -- Prioritás Az elemek rendezésére szolgáló többletinfor- máció. Infix Operátor (TPrior,TPrior): Logikai Megvalósítása: az elem egy „rendezett” mezője,az elem egy „rendezett” mezője, az elemen értelmezett valamilyen alkalmas rendezett értéket szolgáltató függvény.az elemen értelmezett valamilyen alkalmas rendezett értéket szolgáltató függvény. II.II.