Adatfeldolgozás 2. Szlávi Péter ELTE Informatika Szakmódszertani Csoport szlavi@ludens.elte.hu http://izzo.inf.elte.hu/~szlavi Copyright, 1999 © Szlávi Péter
Tartalom 1. Adatfeldolgozás problémája, alapfogalmak 1.1 Adatfeldolgozás típusfeladatai 1.2 Elemenkénti feldolgozhatóság 1.3 A Z=F(X) tétel 1.4 Típusfinomítás, struktúramegfeleltetés 2. Struktúramegfeleltetés konfliktusai 2.1 Tagolási konfliktus 2.2 Összefonódási konfliktus 2.3 Rendezetlenségi konfliktus 3. Időszerűsítés 3.1 Megoldása a Z=F(x) tétel alapján 3.2 Megoldása összefuttatással 2019.01.18. Adatfedolgozás
Tartalom 4. Külső rendezések 4.1 Négy munkafájlos rendezés 4.2 Három munkafájlos rendezés 4.3 Prioritási soros rendezés 2019.01.18. Adatfedolgozás
2. Struktúramegfeleltetés konfliktusai Mikor van „konfliktus”? Ha nem egyesíthető természetes módon szuperstruktúrák hierarchiájává a bemeneti és kimeneti adatok finomítás-struktúrája. Konfliktus fajták: tagolási összefonódási rendezetlenségi 2019.01.18. Adatfedolgozás
2. Struktúramegfeleltetés konfliktusai (folytatás) Tagolási konfliktus: a lényeg: általános megoldás: virtuális típus bevezetése 2019.01.18. Adatfedolgozás
2. Struktúramegfeleltetés konfliktusai (folytatás) Összefonódási konfliktus: a lényeg: általános megoldás: szétválogatás 2019.01.18. Adatfedolgozás
2. Struktúramegfeleltetés konfliktusai (folytatás) Speciális összefonódási konfliktus: a lényeg: a két „keveredő” sorozat elemeit egymás mögé kell elhelyezni megoldás: kiválogatás (X) + kiválogatvaHozzáírás(Y) (egymásutánírás) 2019.01.18. Adatfedolgozás
2. Struktúramegfeleltetés konfliktusai (folytatás) Speciális összefonódási konfliktus: a lényeg: a két párosan „keveredő” sorozat elemeit csak a második megérkezésekor lehet feldolgozni (előzés nincs!) megoldás: szétválogatás + párosítás/másolás (szétválogatás:sorokban várakoztatás + másolás) 2019.01.18. Adatfedolgozás
2. Struktúramegfeleltetés konfliktusai (folytatás) Speciális összefonódási konfliktus: a lényeg: a két egykén vagy párosan „keveredő” sorozat elemeit csak a második megérkezésekor lehet feldolgozni, de a követési távolság (ismert) nem nagy (a pár része az elsőnek, előzés van; pl. hálózaton a csomagok). megoldás: pufferbe másolás + időszerűsítés 2019.01.18. Adatfedolgozás
2. Struktúramegfeleltetés konfliktusai (folytatás) Rendezetlenségi konfliktus: a lényeg: általános megoldás: (külső) rendezés 2019.01.18. Adatfedolgozás
2. Struktúramegfeleltetés konfliktusai (folytatás) Speciális rendezetlenségi konfliktus: a lényeg: fordított sorrend megoldás: (külső) „veremkezelés” 2019.01.18. Adatfedolgozás
2. Struktúramegfeleltetés konfliktusai (folytatás) Speciális rendezetlenségi konfliktus: a lényeg: csoportokban rossz sorrendben, de a csoportok helyes sorrendben (a csoportméret ismert, nem túl nagy). megoldás: pufferbe másolás + belső rendezés 2019.01.18. Adatfedolgozás
2.1 Tagolási konfliktus Feloldás: a típusok „összebékítése” virtuális típus(ok) bevezetésével. Típusmódosítás: Reprezentációmódosítás Implementálás Virtuális elem olvasása (bemeneti oldalon) Virtuális elem írása (kimeneti oldalon) Sokszor még: nyitás és zárás „szertartása”, a vég érzékelése is. 2019.01.18. Adatfedolgozás
2.1 Tagolási konfliktus (folytatás) Példa: Fájl nyomtatása lapozottan (fej=Fájlnév, láb=lapsorszám). Megoldás: Típus Bemenet=File(TElem) Kimenet=File(TLap) TElem=? TLap=Rekord( fej: TFej törzs: TSorok láb: TLáb) Konfliktus!!! Feloldása: virtuális típus a bemeneti oldalon. Reprezentáció: Bemenet’=File(VLap) VLap=TLapnyiDbElem TUtolsóLap [Unió] Az világos, hogy TLapnyiDbElem és TUtolsóLap TSorok 2019.01.18. Adatfedolgozás
2.1 Tagolási konfliktus (folytatás) Implementáció: Konstans DB:Egész(?) Típus TSorok=Tömb(1..DB:TSor) TSor= … sor … Eljárás VLapOlvasás(Változó X:Bemenet, s:TSorok): i:=0 Ciklus amíg i<DB és nem Vége?(X) Olvas(X,adat); i:+1; s(i):=f(adat) Ciklus vége Ciklus j=i+1-től DB-ig s(j):=ÜresSor Ciklus vége Eljárás vége. f: TElemTSor A maradék kitöltése. Világos utalás arra, hogy a VLap unióként lett definiálva, ti. i<DB feltétel mellett jelent egyáltalán végrehajtást. 2019.01.18. Adatfedolgozás
2.1 Tagolási konfliktus (folytatás) A Kimenet típus implementálandó, hiszen TLap típus nem standard típus. Implementáció: Eljárás LapÍrás(Változó Z:SzövegFile Konstans s:TSorok): FejlécNyomtatás Ciklus i=1-től DB-ig SorÍr(Z,s(i)) Ciklus vége LáblécNyomtatás [lapsz:+1 és kiírás] Eljárás vége. A teljes feladat megoldása: Nyit(X,…); Nyitás(Z) [lapsz:=0] Ciklus amíg nem Vége?(X) VLapOlvasás(X,sor); LapÍrás(Z,sor) Ciklus vége Zár(X); Zár(Z) TLap=Rekord( fej: TFej törzs: TSorok láb: TLáb) Hf Hf Hf 2019.01.18. Adatfedolgozás
2.1 Tagolási konfliktus (folytatás) Példa: SzövegFile sorokra tördelése (szó nem törhet el; végjelek nincsenek a szövegben). Megoldás: Típus Bemenet=File(Karakter) Kimenet=File(TSor) Karakter TSor=(Szó x SzóElválasztó)* Szó=(Karakter\{‘ ‘}\VégJelek)* SzóElválasztó={‘ ‘}* Konfliktus!!! Feloldása: virtuális típus a bemeneti oldalon. Reprezentáció: Bemenet’=File(TSor) TSor=(Szó SzóElválasztó)* [Típusinvariáns: s:TSor Hossz(s)SorHossz] Kimenet File(Karakter) SzövegFile 2019.01.18. Adatfedolgozás
2.1 Tagolási konfliktus (folytatás) Implementáció: Típus TSor=Szöveg [Típusinvariáns: …] Konstans MaxSHossz:Egész(?) [Sorhossz] Előreolvasási technika!!! Változó szó,elv:Szöveg [előreolvasott szó/elv.] Eljárás SorNyitás(Változó X:Bemenet): Nyit(X,…) SzóOlvasás(X,szó,elv) [Vége?(X) szó/elv=’’] Eljárás vége. Elvárás a majdan megírandó SzóOlvasás eljáráshoz! 2019.01.18. Adatfedolgozás
2.1 Tagolási konfliktus (folytatás) Eljárás SorOlvasás(Változó X:Bemenet, sor:TSor): sor:=’’ [szó+elv előreolvasva] Ciklus amíg nem Vége?(X) és Hossz(sor)+Hossz(szó+elv)MaxSHossz sor:+szó+elv SzóOlvasás(X,szó,elv) Ciklus vége Ha Hossz(sor)+Hossz(szó)MaxSHossz akkor sor:+szó SzóOlvasás(X,szó,elv) [Vége?(X) szó/elv=’’] Elágazás vége Eljárás vége. Elvárás a majdan megírandó SzóOlvasás eljáráshoz! Elválasztók a sor végéről elhagyhatók 2019.01.18. Adatfedolgozás
2.1 Tagolási konfliktus (folytatás) Eljárás SzóOlvasás(Változó …): … Eljárás SorZárás(Változó …): … A Kimenet típus könnyen implementálható, hiszen a TSor típus, bár nem „standard” típus, de Szöveg leszár- mazott. Implementáció: Eljárás SorÍrás(Változó Z:SzövegFile Konstans s:TSor): SorÍr(Z,s) Eljárás vége. Hf Hf TSor=(Szó x SzóElválasztó)* Szöveg Hf a kimeneti típushoz tartozó többi művelet. 2019.01.18. Adatfedolgozás
2.1 Tagolási konfliktus (folytatás) A teljes feladat megoldása: SorNyitás(X); Nyit(Z,…) Ciklus amíg nem Vége?(X) SorOlvasás(X,sor); SorÍrás(Z,sor) Ciklus vége SorZárás(X); Zár(Z) 2019.01.18. Adatfedolgozás
2.2 Összefonódási konfliktus A probléma: Két vagy több sorozat keveredése úgy, hogy a részso- rozatok elemei a feldolgozásnak megfelelő sorrendben vannak. (A feldolgozáshoz a részsorozatok azonos sorszámú elemei alkotnak „egységet”.) Feloldás: Szétválogatás, majd „párhuzamos” feldolgozás. Speciális feladatok: 2.2.1 Szétválogatás és egymásutánírás 2.2.2 Szétválogatás és párosítás 2.2.1 Szétválogatás és időszerűsítés 2019.01.18. Adatfedolgozás
2. 2 Összefonódási konfliktus (folytatás) 2. 2 2.2 Összefonódási konfliktus (folytatás) 2.2.1 Szétválogatás és egymásutánírás Példa: Egy egyirányú utcában két jelzőlámpánál figyelik az átha- ladó autókat: mikor haladt át a lámpánál. Az adatok meg- figyelési idő szerinti sorrendben érkeznek. N db autót fi- gyeltek meg. Csoportosítsuk az adatokat, hogy az első lámpánál történt megfigyelések –időbeli sorrendjüket megtartva– előzzék meg a második lámpánál megfigyelt adatokat. (Az utcában előzés nincs.) Megoldás: Típus Bemenet=File(Forgalom) Kimenet=File(Forgalom) [Idő szerint rendezve] [Lámpa+Idő szerint rendezve] Forgalom=Rekord Forgalom=Rekord (Lámpa:{1,2} (Lámpa:{1,2} Idő:Egész) Idő:Egész) 2019.01.18. Adatfedolgozás
2. 2 Összefonódási konfliktus (folytatás) 2. 2 2.2 Összefonódási konfliktus (folytatás) 2.2.1 Szétválogatás és egymásutánírás Eljárás ForgalomCsoportosítás(Változó X:Bemenet Z:Kimenet): Változó Y:File(Forgalom) [segédfájl] adat:Forgalom Nyit(X,…); Nyit(Y,…); Nyit(Z,…) i:=0 Ciklus amíg i<N Olvas(X,adat) Ha adat.lámpa=1 akkor Ír(Z,adat); i:+1 különben Ír(Y,adat) Ciklus vége Zár(Y); Nyit(Y,…) Ciklus amíg nem Vége?(Y) Olvas(Y,adat); Ír(Z,adat) Ciklus vége Ciklus amíg nem Vége?(X) Olvas(X,adat); Ír(Z,adat) Ciklus vége Zár(X); Zár(Z); Zár(Y) Eljárás vége. Z(xX| x.lámpa=1) Y(xX| x.lámpa=2 x.idő<zN.idő) Az első lámpával végeztünk, a má-sodik eddigi adatai az eredménybe má-solhatók. Z+Y Z+(xX| x.lámpa=2 x.idő>zN.idő) X-ben már csak a második lámpa ada-tai maradhattak, egy-szerűen másolhatók. 2019.01.18. Adatfedolgozás
Egy alkalmas „belső állapotváltozás” tipizálása: 2.2 Összefonódási konfliktus (folytatás) 2.2.2 Szétválogatás és párosítás 1. példa: Egy vasútvonal két állomásán egy nap feljegyeztük, az ösz- szes egyik irányba áthaladó vonat indulási, illetve érkezési idejét (idő szerinti sorrendben). Adjuk meg az áthaladt vo- natok menetidőit a két állomás között! (Nincs előzés.) Megoldás: Típus Bemenet=File(Állomás) Kimenet=File(Vonat) Állomás=Rekord Vonat=Egész [menetidő] (sorszám:{1,2},idő:TIdő) Egy alkalmas „belső állapotváltozás” tipizálása: Bemenet=File(Állomás)TSor Kimenet=File(Vonat)TSor Állomás=Rekord Vonat=Egész (sorszám:{1,2},idő:TIdő) TSor=Sor(Vonat [1. idő]) TSor=Sor(Vonat [1. idő]) Miért nem kell vonatazonosító? Miért nem kell vonatazonosító? 2019.01.18. Adatfedolgozás
Két tipikus állapotváltozás: Előtte Utána 2.2 Összefonódási konfliktus (folytatás) 2.2.2 Szétválogatás és párosítás Két tipikus állapotváltozás: Előtte Utána BeFile TSor KiFile BeFile TSor KiFile ((1,x),(y,z),...) (s1,...,su) (v1,...,vk) ® ((y,z),...) (s1,...,su,x) (v1,...,vk) ((2,x),(y,z),...) (s1,...,su) (v1,...,vk) ® ((y,z),...) (s2,...,su) (v1,...,vk,x–s1) Eljárás Vonatidők(Változó X:Bemenet,V:Kimenet): … [fájlnyitások] SorInicializálás Ciklus amíg nem Vége?(X) Olvas(X,adat) Ha adat.sorszám=1 akkor Sorba(adat.idő) különben Sorból(t) Ír(V,adat.idő-t) Ciklus vége … [fájlzárások] Eljárás vége. 2019.01.18. Adatfedolgozás
2. 2 Összefonódási konfliktus (folytatás) 2. 2 2.2 Összefonódási konfliktus (folytatás) 2.2.2 Szétválogatás és párosítás 2. példa: Egy vasútvonal két állomásán egy nap feljegyeztük, az ösz- szes, mindkét irányba áthaladó vonat indulási, illetve érke- zési idejét (idő szerinti sorrendben). Adjuk meg az áthaladt vonatok menetidőit a két állomás között! (Előzés nincs, csak egy sínpár van.) Megoldás: Az „extraprobléma”, hogy nem 2, hanem 4 részsorozat ke- veredik ((oda+vissza)*(indulás+érkezés)). Ötlet: azt kell vissza- tartani, amelyikben előbbre haladtunk, azaz érzékelni kell, hogy ez melyik. Ciklus amíg nem Vége?(X) Olvas(X,adat) Ha SorÜres? akkor tip:=adat.sorszám Ha adat.sorszám=tip akkor Sorba(adat.idő) különben Sorból(t) Ír(V,adat.idő-t) Ciklus vége 2019.01.18. Adatfedolgozás
Egy alkalmas „belső állapotváltozás” tipizálása: 2.2 Összefonódási konfliktus (folytatás) 2.2.3 Szétválogatás és időszerűsítés 1. példa: Egy számítógéphálózaton az üzeneteket csomagokra bontva kül- dik. Minden csomag tartalmaz (a csomagsorszám mellett) egy ellenőrző összeget. Ha a vevő valamelyiket hibásnak találja, ak- kor annak megismétlését kéri a küldőtől. A csomagok jó sorrend- ben érkeznek (a javítók is egymáshoz képest). A vevő feladata az üzenetek csomagjainak javítások utáni helyes sorrendbe állítása. Megoldás: (az előzőhöz hasonlóan) … Egy alkalmas „belső állapotváltozás” tipizálása: Bemenet=File(Üzenet)TSor Kimenet=File(Üzenet)TSor Üzenet=Rekord Üzenet=Rekord (sorsz:Egész (sorsz:Egész tart:Szöveg,ell:TEll) tart:Szöveg,ell:TEll) TSor=Sor(Üzenet) TSor=Sor(Üzenet) 2019.01.18. Adatfedolgozás
Tipikus állapotváltozások: Előtte Utána 2.2 Összefonódási konfliktus (folytatás) 2.2.3 Szétválogatás és időszerűsítés (i:Egész /jó-e:{,}) az i. csomag jó-e Tipikus állapotváltozások: Előtte Utána BeFile TSor KiFile BeFile TSor KiFile ((i/),x2,...) (x2,...) () ® () (z1,...,zk) (z1,...,zk,(i/)) ((i/),x2,...) (x2,...) ((i/),se,...su,(j/),...) ® ((j/),...) (z1,...,zk) (z1,...,zk,(i/),se,...,su) ((i/),x2,,...) (x2,...) ((j/),...,sm) ij (i>j) ® ((j/),…,sm,(i/)) (z1,...,zk) (z1,...,zk) ((i/),x2,...) (x2,...) (...,sm) i(...,sm) ® (…,sm,(i/)) (z1,...,zk) (z1,...,zk) ((i/),x2,...) (x2,...) (...,sm) i(...,sm) ® (…,sm) (z1,...,zk) (z1,...,zk) jók jók 2019.01.18. Adatfedolgozás
2. 2 Összefonódási konfliktus (folytatás) 2. 2 2.2 Összefonódási konfliktus (folytatás) 2.2.3 Szétválogatás és időszerűsítés Eljárás Üzenetek(Változó X:Bemenet, V:Kimenet): … [fájlnyitások] SorInicializálás(s) Ciklus amíg nem Vége?(X) Olvas(X,a) Ha a.ell= akkor JóÜz(a,s,V) különben HibásÜz(s,a) Ciklus vége … [fájlzárások] Eljárás vége. Eljárás JóÜz(Konst. ad:Üzenet, Vált. s:TSor,V:Kimenet): Elágazás Üres?(s) esetén Ír(V,ad) ad.sorsz=Első(s).sorsz [azaz javító csomag] esetén Sorból(s,x); Ír(V,ad) SorÜrítés(s,V) egyéb esetben Sorba(s,ad) Elágazás vége Az ‘a’ megfelelő? 2019.01.18. Adatfedolgozás
Az ‘Első(s)’ megfelelő? 2.2 Összefonódási konfliktus (folytatás) 2.2.3 Szétválogatás és időszerűsítés Eljárás HibásÜzenet(Vált. s:TSor, Konst. ad:Üzenet): Ha ad.sorszÏs akkor Sorba(s,ad) IsmétlésKérés(ad.sorsz) Eljárás vége. Eljárás SorÜrítés(Változó s:TSor, V:Kimenet): Ciklus amíg nem Üres?(s) és Első(s).ell= Sorból(s,ad); Ír(V,ad) Ciklus vége Az ‘Első(s)’ megfelelő? 2019.01.18. Adatfedolgozás
Egy alkalmas „belső állapotváltozás” tipizálása: 2.2 Összefonódási konfliktus (folytatás) 2.2.3 Szétválogatás és időszerűsítés 2. példa: … mint előbb, de a csomagok sorrendje is megváltozhat ... Megoldás: (az előzőhöz hasonlóan) … Egy alkalmas „belső állapotváltozás” tipizálása: Bemenet=File(Üzenet)TSor Kimenet=File(Üzenet)TSor Üzenet=Rekord Üzenet=Rekord (sorsz:Egész (sorsz:Egész tart:Szöveg,ell:TEll) tart:Szöveg,ell:TEll) TSor=PrSor(Üzenet) TSor=PrSor(Üzenet) További ötlet: … ha jön egy új csomag, akkor a prioritási sorba beillesztjük őt, a sor elején levő jókat lehet kiszedni… 2019.01.18. Adatfedolgozás
2.3 Rendezetlenségi konfliktus A probléma: A sorozat elemeinek rossz sorrendje. Feloldás: Rendezés. Speciális feladatok: 2.3.1 Megfordítás 2.3.2 Részleges rendezetlenség 2019.01.18. Adatfedolgozás
2.3 Rendezetlenségi konfliktus (folytatás) 2.3.1 Megfordítás A probléma: A bemenet pontosan ellenkező sorrendű, mint a –kí- vánatos– kimenet. A megoldás: Veremként „működő” fájl. Modul FVerem(Típus TElem): Reprezentáció Változó f:DirektFile(TElem) Implemetáció Eljárás Üres(Változó v:Verem) Verembe(Változó v:Verem Konstans e:TElem) … Függvény Üres?(Konstans v:Verem): Logikai Inicializálás … Modul vége. Típus TElem=? Eljárás Megfordít (Változó X:Bemenet Y:Kimenet): Változó v:FVerem(TElem) … [fájlnyitások] Üres(v) Ciklus amíg nem Vége?(X) Olvas(X,adat); Verembe(v,adat) Ciklus vége Ciklus amíg nem Üres?(v) Veremből(v,adat); Ír(Y,adat) Ciklus vége … [fájlzárások] Eljárás vége. 2019.01.18. Adatfedolgozás
2.3 Rendezetlenségi konfliktus (folytatás) 2.3.1 Megfordítás Egy másik megoldás: Memóriabeli verem+szekvenciális fájl. Modul FVerem(Típus TElem): Reprezentáció Változó v:Verem(TElem) [memóriában] f:SzekvFile(TElem) Implemetáció Eljárás Üres(Változó v:Verem) Verembe(Változó v:Verem Konstans e:TElem) … Függvény Üres?(Konstans v:Verem): Logikai Inicializálás … Modul vége. Típus TElem=? Eljárás Megfordít (Változó X:Bemenet Y:Kimenet): Változó v:FVerem(TElem) … [fájlnyitások] Üres(v) … hf. … [fájlzárások] Eljárás vége. Ötlet: amikor a memóriabeli verem betelik, akkor egy szekvenciális fájlba mint futamot írjuk ki (értsd: egy futam=egy fájl több fájl; „szabályos” nevek- kel: pl. VeremXXXX.dat, X=számjegy.)… 2019.01.18. Adatfedolgozás
2. 3 Rendezetlenségi konfliktus (folytatás) 2. 3 2.3 Rendezetlenségi konfliktus (folytatás) 2.3.2 Részleges rendezetlenség A probléma: A bemeneti adatok (memóriában tartható, de nem ismert elemszámú) csoportokat alkotnak. A csoportok egymásután helyes sorrendben vannak, de csoporton belül rendezetlenül. Rendezzük az egészet! Típus TElem=? Eljárás CsoportosanRendez (Változó X:Bemenet Y:Kimenet): Változó t:Tömb(1..MaxN:TElem) e:TElem [előreolvasott] … [fájlnyitások] … hf. … [fájlzárások] Eljárás vége. Ötlet: előreolvasási technikával csoportonként (t,e)- be olvassuk, t-ben rendezzük, majd kiírjuk. Az ol- vasás és rendezés egyszerre is végezhető a „beszú- rásos rendezés” elvével. 2019.01.18. Adatfedolgozás