Adatfeldolgozs 3 Szlvi Pter ELTE Informatika Szakmdszertani Csoport

  • Slides: 32
Download presentation
Adatfeldolgozás 3. Szlávi Péter ELTE Informatika Szakmódszertani Csoport szlavi@ludens. elte. hu http: //izzo. inf.

Adatfeldolgozás 3. 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 Adatfedolgozás

 Tartalom 1. Adatfeldolgozás problémája, alapfogalmak 1. 1 Adatfeldolgozás típusfeladatai 1. 2 Elemenkénti feldolgozhatóság

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 2021. 10. 27. Adatfedolgozás 2

 Tartalom 4. Külső rendezések 4. 1 Négy munkafájlos rendezés 4. 2 Három munkafájlos

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 2021. 10. 27. Adatfedolgozás 3

 3. Időszerűsítés A feladat: Időszerűsítés: Régi x Módosító Új Régi=TBe. Elem 1*, Módosító=TBe.

3. Időszerűsítés A feladat: Időszerűsítés: Régi x Módosító Új Régi=TBe. Elem 1*, Módosító=TBe. Elem 2 * Új=TKi. Elem* TBe. Elem 1 TBe. Elem 2 Időszerűsítési funkciók: TBe. Elem=TKi. Elem : közös mező – adott elem törlése – adott elem javítása – adott elem beszúrása Adott mező: „kulcs” (-mező) TBe. Elem 1 TBe. Elem 2 2021. 10. 27. Adatfedolgozás 4

 Időszerűsítés (folytatás) A ’Z=F(X)’ tétel alkalmazható? A „keresztbe kasul” hivatkozás miatt f: Xx.

Időszerűsítés (folytatás) A ’Z=F(X)’ tétel alkalmazható? A „keresztbe kasul” hivatkozás miatt f: Xx. Y Z : 2021. 10. 27. Adatfedolgozás 5

 Időszerűsítés (folytatás) Konfliktus: Összefonódási (elsősorban) a bemeneti oldalon, X és Y elemei között,

Időszerűsítés (folytatás) Konfliktus: Összefonódási (elsősorban) a bemeneti oldalon, X és Y elemei között, továbbá az Y és Z elemei között. Feloldása: 1. Szétválogatás(ok) – X-Y „párba illeszkedő” (azonos kulcsú v. üres) elemei. 2. Ef: kulcs-szerinti rendezettség + párosítás (kulcs-szerint v. üres). 2021. 10. 27. Adatfedolgozás 6

 Időszerűsítés (folytatás) Típus Adatok=File(Elem) Finomítás Elem=Rekord (kulcs: ? egyéb: ? ) Módosítás=(Törlés, Javítás,

Időszerűsítés (folytatás) Típus Adatok=File(Elem) Finomítás Elem=Rekord (kulcs: ? egyéb: ? ) Módosítás=(Törlés, Javítás, Beszúrás) Módosítók=File(Mód. Elem) Mód. Elem=Rekord (mód. Tip: Módosítás tart: Elem) Algoritmus: 1. Z=F(X) tétel alapján; 2. Összefuttatás tétel alapján. 2021. 10. 27. Adatfedolgozás 7

 3. 1 Megoldása a „Z=F(X)” tétel alapján A párosítás elvégezhető (az „Üres” elem

3. 1 Megoldása a „Z=F(X)” tétel alapján A párosítás elvégezhető (az „Üres” elem bevezetésével), ui. f: X×Y Z : X {Üres} × Y {Üres} Z {Üres} Az „Üres” elem bevezetése egy „gyenge” tagolási konfliktusra utal virtuális típus mind a be-, mind a kimeneti oldalon. Ui. kell tudni X-Y-beli elempárt (esetleg üreset) olvasni, és kell tudni Z-belit (esetleg üreset) írni. 2021. 10. 27. Adatfedolgozás 8

3. 1 Megoldása a „Z=F(X)” tétel alapján (folytatás) A feldolgozás vázlata: (X, Y) Olvas

3. 1 Megoldása a „Z=F(X)” tétel alapján (folytatás) A feldolgozás vázlata: (X, Y) Olvas elempár Feldolgoz kielem Ír (Z Sehová) Típus Elempár=Rekord Kielem=Rekord (bem: Rekord (üres: Logikai Fel lett (kész: Logikai tart: Elem) dolgozva az tart: Elem) elem. Nincs output-elem. mód: Rekord (kész: Logikai Fel lett dolgozva az tart: Mód. Elem)) elem. 2021. 10. 27. Adatfedolgozás 9

3. 1 Megoldása a „Z=F(X)” tétel alapján (folytatás) Implementáció: Eljárás Időszerűsítés (Változó X: Adatok,

3. 1 Megoldása a „Z=F(X)” tétel alapján (folytatás) Implementáció: Eljárás Időszerűsítés (Változó X: Adatok, Y: Módosítók, Z: Adatok): Változó adpár: Elempár kiad: Ki. Elem Nyitás(X, Y, . . . ); Nyit(Z, . . . ) Ciklus amíg nem Vége? (X, Y) Olvasás(X, Y, adpár) Feldolgoz(adpár, kiad) Írás(Z, kiad) Ciklus vége Zárás(X, Y); Zár(Z) Eljárás vége. 2021. 10. 27. Adatfedolgozás 10

3. 1 Megoldása a „Z=F(X)” tétel alapján (folytatás) A következők beolvashatók. Eljárás Nyitás( Változó

3. 1 Megoldása a „Z=F(X)” tétel alapján (folytatás) A következők beolvashatók. Eljárás Nyitás( Változó X: Adatok, Y: Módosítók): Nyit(X, …); adpár. bem. kész: =Igaz Nyit(Y, …); adpár. mod. kész: =Igaz Eljárás vége. Eljárás Zárás( Változó X: Adatok, Y: Módosítók): Zár(X); Zár(Y) Eljárás vége. 2021. 10. 27. Adatfedolgozás 11

3. 1 Megoldása a „Z=F(X)” tétel alapján (folytatás) Eljárás Olvasás(Változó X: Adatok, Y: Módosítók,

3. 1 Megoldása a „Z=F(X)” tétel alapján (folytatás) Eljárás Olvasás(Változó X: Adatok, Y: Módosítók, adpár: Elempár); Ha adpár. bem. kész akkor Ha nem Vége? (X) akkor Olvas(X, adpár. bem. tart) adpár. bem. kész: =Hamis X {Üres} × Y {Üres} Z {Üres} [különben adpár. bem. kész: =Igaz] Elágazás vége Ha adpár. mód. kész akkor Ha nem Vége? (Y) akkor Olvas(Y, adpár. mód. tart) adpár. mód. kész: =Hamis X {Üres} × Y {Üres} Z {Üres} [különben adpár. mód. kész: =Igaz] Elágazás vége Eljárás vége. 2021. 10. 27. Adatfedolgozás 12

3. 1 Megoldása a „Z=F(X)” tétel alapján (folytatás) Eljárás Írás(Változó Z: Adatok, Konstans kiad:

3. 1 Megoldása a „Z=F(X)” tétel alapján (folytatás) Eljárás Írás(Változó Z: Adatok, Konstans kiad: Ki. Elem): Ha nem kiad. üres akkor Ír(Z, kiad. tart) [különben Ír(Sehová, kiad. tart)] X {Üres} × Y {Üres} Z {Üres} Eljárás vége. Eljárás Feldolgoz(Változó adpár: Elempár, kiad: Ki. Elem): Elágazás X vége utáni beszúrás. adpár. bem. kész esetén kiad: =Ki. Elem(Hamis, adpár. mód. tart) adpár. mód. kész: =Igaz Y vége: módosítás nélküli másolás. adpár. mód. kész esetén kiad: =Ki. Elem(Hamis, adpár. bem. tart) adpár. bem. kész: =Igaz Nincs módosítás: másolás. adpár. bem. tart. kulcs<adpár. mód. tart. kulcs esetén … 2021. 10. 27. kiad: =Ki. Elem(Hamis, adpár. bem. tart) adpár. bem. kész: =Igaz Adatfedolgozás 13

3. 1 Megoldása a „Z=F(X)” tétel alapján (folytatás) … adpár. bem. tart. kulcs>adpár. mód.

3. 1 Megoldása a „Z=F(X)” tétel alapján (folytatás) … adpár. bem. tart. kulcs>adpár. mód. tart. kulcs esetén Beszúrás. kiad: =Ki. Elem(Hamis, adpár. mód. tart) adpár. mód. kész: =Igaz adpár. bem. tart. kulcs=adpár. mód. tart. kulcs és adpár. mód. tart. módtip=Törlés esetén Törlés. kiad: =Ki. Elem(Igaz, akármi) adpár. mód. kész: =Igaz adpár. bem. tart. kulcs=adpár. mód. tart. kulcs és adpár. mód. tart. módtip=Javítás esetén kiad: =Ki. Elem(Hamis, adpár. mód. tart) adpár. mód. kész: =Igaz adpár. bem. kész: =Igaz Ellenőrzések Elágazás vége nincsenek! Eljárás vége. Javítás. 2021. 10. 27. Adatfedolgozás 14

3. 2 Megoldása az „Összefuttatás” tétel alapján Analógiák: 2021. 10. 27. Adatfedolgozás 15

3. 2 Megoldása az „Összefuttatás” tétel alapján Analógiák: 2021. 10. 27. Adatfedolgozás 15

3. 2 Megoldása az „Összefuttatás” tétel alapján (folytatás) Ti. a bemeneti fájl kész-e? Ti.

3. 2 Megoldása az „Összefuttatás” tétel alapján (folytatás) Ti. a bemeneti fájl kész-e? Ti. a módosító fájl kész-e? Típus Puffer=Rekord Mód. Puffer=Rekord (kész: Logikai tart: Elem) tart: Mód. Elem) Eljárás Időszerűsítés(Változó X: Adatok, Y: Módosítók, Z: Adatok): Változó i: Puffer Csak módszertani j: Mód. Puffer okok miatt nem Nyit(X, . . . ); Előre. Olvas. X(X, i) Nyit(Y, . . . ); Előre. Olvas. Y(Y, j) „ágyazzuk be” az Nyit(Z, . . . ) előreolvasást a nyitásokba. . . 2021. 10. 27. Adatfedolgozás 16

3. 2 Megoldása az „Összefuttatás” tétel alapján (folytatás) … Ciklus amíg nem i. kész

3. 2 Megoldása az „Összefuttatás” tétel alapján (folytatás) … Ciklus amíg nem i. kész és nem j. kész Elágazás Emlékeztető: i. tart. kulcs<j. tart. kulcs esetén Puffer=Rekord Ír(Z, i. tart); Előre. Olvas. X(X, i) (kész: Logikai i. tart. kulcs=j. tart. kulcs esetén tart: Elem) Elem=Rekord Ha j. tart. mód. Tip=Javítás akkor (kulcs: ? , egyéb: ? ) Ír(Z, j. tart) Mód. Puffer=Rekord Elágazás vége (kész: Logikai Előre. Olvas. X(X, i) tart: Mód. Elem) Mód. Elem=Rekord Előre. Olvas. Y(Y, j) (mód. Tip: Módosítás i. tart. kulcs>j. tart. kulcs esetén tart: Elem) Ír(Z, j. tart); Előre. Olvas. Y(Y, j) Módosítás=(…) Elágazás vége Ciklus vége … 2021. 10. 27. Adatfedolgozás 17

3. 2 Megoldása az „Összefuttatás” tétel alapján (folytatás) … Elágazás nem i. kész esetén

3. 2 Megoldása az „Összefuttatás” tétel alapján (folytatás) … Elágazás nem i. kész esetén Ciklus amíg nem i. kész Ír(Z, i. tart) Előre. Olvas. X(X, i) Ciklus vége nem j. kész esetén Ciklus amíg nem j. kész Ír(Z, j. tart) Előre. Olvas. Y(Y, j) Ciklus vége Elágazás vége Zár(X); Zár(Y); Zár(Z) Eljárás vége. 2021. 10. 27. Adatfedolgozás 18

3. 2 Megoldása az „Összefuttatás” tétel alapján (folytatás) Eljárás Előre. Olvas. X(Változó X: Adatok,

3. 2 Megoldása az „Összefuttatás” tétel alapján (folytatás) Eljárás Előre. Olvas. X(Változó X: Adatok, i: Puffer): Ha Vége? (X) akkor i. kész: =Igaz különben i. kész: =Hamis; Olvas(X, i. tart) Eljárás vége. Eljárás Előre. Olvas. Y(Változó Y: Módosítók, j: Mód. Puffer): Ha Vége? (Y) akkor j. kész: =Igaz különben j. kész: =Hamis Olvas(Y, j. tart) Eljárás vége. 2021. 10. 27. Adatfedolgozás 19

 4. Külső rendezések Probléma az adatsorozat 1. terjedelmessége (nem fér a memóriába), 2.

4. Külső rendezések Probléma az adatsorozat 1. terjedelmessége (nem fér a memóriába), 2. szekvencialitása (nincs közvetlen hozzáférés). Miért nem erőltethetők a belső rendezések? Elvileg is gyakorlatilag is reménytelen. Megoldásvázlat: ad 1. A memóriába beférő darabot belső rendezéssel rendezni, így kapunk egy futamot. ad 2. Egy szekvenciális módszerrel fokozatosan növelni a futamok hosszát, amíg egyetlen rendezett sorozattá nem lesz, ez a módszer lehet az összefésülés. 2021. 10. 27. Adatfedolgozás 20

 4. 1 Négy munkafájlos rendezés A lényeg: A rendezés (F): a bemenet futamokra

4. 1 Négy munkafájlos rendezés A lényeg: A rendezés (F): a bemenet futamokra szedése 2 munkafájlba (H), majd a fájlbeli futamok összefésülése (G). F(X): =H • G(X) 1. A H megkonstruálása: Típus [H-hoz] Bemenet=File(Elem) Elem=? Kimenet=File(Futam) Futam=File(Elem) Tagolási konfliktus Virtuális típus: Futam File • futamonként egy-egy fájl ( kivitelezhetetlen) • sok futam egy fájlban ( virtuális fájlkezelés) 2021. 10. 27. Adatfedolgozás 21

 4. 1 Négy munkafájlos rendezés (folytatás) G=összefésülés (legalább) 2 fájl kell hozzá •

4. 1 Négy munkafájlos rendezés (folytatás) G=összefésülés (legalább) 2 fájl kell hozzá • 2 fájlban választjuk szét a futamokat. Típus [H-hoz] Bemenet=File(Elem) Kimenet=File(Futam)× File(Futam) Elem=? Futam=File(Elem) A futamok felváltva: hol egyikbe, hol másikba… 2. A G megkonstruálása: Típus [G-hez] Bemenet=File(Futam)× File(Futam) Kimenet=File(Elem) Futam=File(Elem) Elem=? Tagolási + rendezetlenségi konfliktus 2021. 10. 27. Adatfedolgozás 22

 4. 1 Négy munkafájlos rendezés (folytatás) G mint futamokon értelmezett leképezés: X ,

4. 1 Négy munkafájlos rendezés (folytatás) G mint futamokon értelmezett leképezés: X , ha Futam. Szám(X)=1 Futam. Szám(Y)=0 G(X, Y): = G(G 1(X, Y)) , egyébként G 1: (Xi, Yi) (Öf(Xi, Yi), Üres), ha Xi, Yi páratlanadik futam (Üres, Öf(Xi, Yi)), ha Xi, Yi párosadik futam Öf: összefésülés Típus [G 1 -hez] Bemenet=File(Futam)×File(Futam) Kimenet=File(Futam)×File(Futam) Futam=File(Elem) {Üres} Elem=? Tehát 4 munkafájl szükséges a megvalósításhoz. 2021. 10. 27. Adatfedolgozás 23

 4. 1 Négy munkafájlos rendezés (folytatás) Példa a részletezés elé: Legyen X=(x 1,

4. 1 Négy munkafájlos rendezés (folytatás) Példa a részletezés elé: Legyen X=(x 1, . . . , x. N) a rendezendő sorozat; M 1, M 2, M 3 és M 4 a munkafájlok; a memóriába k db fér be. Kezdetben M 1. . 4=( ). 0. lépés: M 1. . 2 előállítása: M 1=(x 1, . . . , xk, x 2 k+1, . . . , x 3 k, . . . ) M 2=(xk+1, . . . , x 2 k, x 3 k+1, . . . , x 4 k, . . . ) 1. lépés: M 1. . 2 összefésülése: M 3=(x 1, . . . , x 2 k, x 4 k+1, . . . , x 6 k, . . . ) M 4=(x 2 k+1, . . . , x 4 k, x 6 k+1, . . . , x 8 k, . . . ) 2. . i. lépés: M 1. . 2 M 3. . 4 szerepcserés összefésülése. Az i. lépésben a futamhossz: 2 ik max(i)=n: 2 nk N n log 2(N/k) 2021. 10. 27. Adatfedolgozás 24

 4. 1 Négy munkafájlos rendezés (folytatás) Reprezentáció: Típus SFV=Tömb(1. . 4: SF) [SFV=Segédfájl-Vektor]

4. 1 Négy munkafájlos rendezés (folytatás) Reprezentáció: Típus SFV=Tömb(1. . 4: SF) [SFV=Segédfájl-Vektor] SF=Rekord(fájl: Kimenet, db: Egész) [SF=Segédfájl] fájlbeli futamszám Implementáció: Eljárás Négyfájlos. Rendezés(Változó X: Bemenet, M: SFV, K: Egész): Szétrak(X, M, K) SoxorÖsszefésül(M, K) Töröl(M(2). fájl, M(3). fájl, M(4). fájl) Eljárás vége. Kezdő futamhossz 2021. 10. 27. Adatfedolgozás 25

 4. 1 Négy munkafájlos rendezés (folytatás) A H függvény kiszámítása. Eljárás Szétrak(Változó X:

4. 1 Négy munkafájlos rendezés (folytatás) A H függvény kiszámítása. Eljárás Szétrak(Változó X: Bemenet, M: SFV, K: Egész): … [fájlnyitások] M(1). db: =0; M(2). db: =0; MI: =1 Ciklus amíg nem Vége? (X) hf Futam. Olvasás(X, R, K) [R=puffer] Futam. Rendezés(R) hf FutamÍrás(M(MI). fájl, R); M(MI). db: +1; MI: =3 -MI Ciklus vége hf … [fájlzárások] Eljárás vége. A G függvény kiszámítása. Eljárás SoxorÖsszefésül(Változó M: SFV, K: Egész): Ciklus Páronként(M, K) [(1, 2) (3, 4)] Csere(1, 3) [„megcseréli” a fájlokat]; K: =2*K amíg M(1). db+M(2). db≠ 1 Ciklus vége Eljárás vége. 2021. 10. 27. Adatfedolgozás 26

 4. 1 Négy munkafájlos rendezés (folytatás) A G 1 függvény kiszámítása. Eljárás Páronként(Változó

4. 1 Négy munkafájlos rendezés (folytatás) A G 1 függvény kiszámítása. Eljárás Páronként(Változó M: SFV, Konstans K: Egész): … [fájlnyitások] HOVA: =3; HONNAN: =1 M(HOVA). db: =0; M(HOVA+1). db: =0 Ciklus I=1 -től M(HONNAN+1). db-ig [a „rövidebbig”] Ha I Mod 2=1 akkor CÉL: =HOVA különben CÉL: =HOVA+1 Két. FutamotÖsszefésül(M, K, HONNAN, CÉL); M(CÉL). db: +1 Ciklus vége hf Ha M(HONNAN). db>M(HONNAN+1). db akkor [utolsó egyke] Ha M(HONNAN). db Mod 2=1 akkor CÉL: =HOVA hf különben CÉL: =HOVA+1 Másol(M(HONNAN). fájl, M(CÉL). fájl); M(CÉL). db: +1 Elágazás vége … [fájlzárások] Eljárás vége. 2021. 10. 27. Adatfedolgozás 27

 4. 2 Három munkafájlos rendezés F(X): =H • G(X) A lényeg: Az előzőhöz

4. 2 Három munkafájlos rendezés F(X): =H • G(X) A lényeg: Az előzőhöz hasonlóan a rendezés (F): a bemenet futamokra szedése 2 munkafájlba (H), majd a fájlbeli futamok összefésülése (G). A részletek megértéséhez egy példa: Visszafelé követve a fájlokbeli futamszám alakulását 1. fájl 2. fájl 3. fájl 1 0 1 3 0 5 2021. 10. 27. 0 1 0 2 5 0 0 1 2 0 3 8 Végállapot Összefésülés: (2, 3) 1 Összefésülés: (3, 1) 2 Összefésülés: (1, 2) 3 Összefésülés: (2, 3) 1 Összefésülés: (3, 1) 2 Adatfedolgozás 28

4. 2 Három munkafájlos rendezés (folytatás) Megfigyelés: • Az összefésülésben résztvevő fájlok ciklikusan következnek.

4. 2 Három munkafájlos rendezés (folytatás) Megfigyelés: • Az összefésülésben résztvevő fájlok ciklikusan következnek. • A futamok száma az egymást követő Fibonacciszámok. Következmény: • A kezdeti Fibonacci-futamszám „mesterséges” (0 hosszúságú) futamok hozzáillesztésével érhető el. • Nem azonos hosszúak a futamok: tárolni kell a futamhosszat vagy egy futamvégjelet. 2021. 10. 27. Adatfedolgozás 29

4. 2 Három munkafájlos rendezés (folytatás) A G, G 1 megfontolása: l. korábban. Implementáció:

4. 2 Három munkafájlos rendezés (folytatás) A G, G 1 megfontolása: l. korábban. Implementáció: Eljárás SoxorÖsszefésül(Változó M: SFV): Ciklus amíg M(1). db+M(2). db+M(3). db≠ 1 Páronként(M) [(1, 2) 3] Ciklikus. Léptetés(M) [1 2 3 1] Ciklus vége Eljárás vége. 2021. 10. 27. Adatfedolgozás 30

 4. 3 Prioritási soros rendezés A lényeg: · a memóriában egy rendezett (prioritási)

4. 3 Prioritási soros rendezés A lényeg: · a memóriában egy rendezett (prioritási) sor van, · a legkisebb elemét kiírjuk a munkafájlba, és · rendezettségnek (prioritásának) megfelelő helyre, beillesztjük következőként a beolvasott elemet. · Amikor a fájlt végigolvastuk, · a memóriában a legnagyobbak találhatók, és · a kiírt fájlban minden elem (legalább a memóriabeli darabszám-1 -gyel) közelebb kerül a végleges helyéhez. 2021. 10. 27. Adatfedolgozás 31

 4. 3 Prioritási soros rendezés (folytatás) Implemetáció: Eljárás Pr. Soros. Rendezés(Változó X: Bemenet,

4. 3 Prioritási soros rendezés (folytatás) Implemetáció: Eljárás Pr. Soros. Rendezés(Változó X: Bemenet, Y: Kimenet): Ciklus amíg … kell? … … [fájlnyitások] hf db: =0; Üres. Pr. Sor Ciklus amíg nem Vége? (X) és db<K Olvas(X, adat); Pr. Sorba(adat); db: +1 Ciklus vége Ciklus amíg nem Vége? (X) Pr. Sorból(adat); Ír(Y, adat) Olvas(X, adat); Pr. Sorba(adat) Ciklus vége Ciklus amíg nem Üres. Pr. Sor? Pr. Sorból(adat); Ír(Y, adat) Ciklus vége … [fájlzárások] Ciklus vége Eljárás vége. 2021. 10. 27. Adatfedolgozás 32