TÖMBÖK Asszociatív adatszerkezetek Tömbök Legfontosabb tulajdonságuk a részhalmaz kiválaszthatósága Tömbök A részhalmazok kiválasztását egész számok egy sorozata biztosítja (ezek az indexek). Az indexek számát dimenziónak nevezzük Az egy dimenziós tömböt gyakran VEKTORnak nevezzük. A két dimenziós tömböt pedig MÁTRIXnak. 23:05
Háromszögmátrix Ha négyzetes (vagy kvadratikus) mátrix főátlója alatt vagy felett csupa 0 elem található, azt háromszögmátrixnak nevezzük. Megkülönböztetünk alsó és felső háromszögmátrixot, méghozzá aszerint, hogy hol helyezkednek el a nem-nulla értékű elemei Egy felső háromszögmátrix: A1,1 A1,2 A1,3 ….. A1,n A2,2 A2,3 A2,n A3,3 A3,n . An,n 23:05
Háromszögmátrix Felső háromszögmátrix: főátlójában és felette tetszőleges elemek lehetnek (ezek a lényeges (fő) elemek). Ezek darabszáma: n(n+1)/2. Ez csak kicsit több mint a mátrixban összesen elhelyezhető elem fele (n2/2). Éppen ezért, ha speciálisan tudjuk tárolni (csak az értékes elemeket), azzal tárhelyet tudunk spórolni. Az általános megoldás egy kölcsönösen egyértelmű leképezése a mátrix elemeinek egy vektorra: V: A11 A12 A22 A13 A23 A33 A14 A24 A34 A44 … Ann 23:05
A háromszögmátrix ábrázolása A felső háromszögmátrix elemeit oszlopfolytonosan bejárva egyesével, egymást követően helyezzük el egy V tömbbe. Ennek elemei száma: n(n+1)/2. Ebből a tömbből hogyan tudjuk ezt az információt visszanyerni? Hányadik eleme lesz a vektornak az eredeti háromszögmátrixban az r. sorban és j. oszlopban elhelyezkedő elem? Ha j>=r, akkor: j(j-1)/2+r j(j-1)/2: a j. oszlop előtt a mátrixban ennyi értékes elemet képeztünk már le a vektorba. r: a j. oszlopban ennyi elemet képezünk le. Ha j<r, akkor: ? V: A11 A12 A22 A13 A23 A33 A14 A24 A34 A44 … Ann 23:05
A háromszögmátrix ábrázolása Az alsó háromszögmátrix elemeit sorfolytonosan bejárva egyesével, egymást követően helyezzük el egy V tömbbe. Ennek elemei száma: n(n+1)/2. Ebből a tömbből hogyan tudjuk ezt az információt visszanyerni? Hányadik eleme lesz a vektornak az eredeti háromszögmátrixban az r. sorban és j. oszlopban elhelyezkedő elem? Ha j<=r, akkor: r(r-1)/2+j r(r-1)/2: az r. sor előtt a mátrixban ennyi értékes elemet képeztünk már le a vektorba. j: az r. sorban ennyi elemet képezünk le. Ha j>r, akkor: ? V: A11 A21 A22 A31 A32 A33 A41 A42 A43 A44 … Ann 23:05
Szimmetrikus mátrix V: ….. A1,1 A1,2 A1,3 ….. A1,n A2,1 A2,2 A2,3 A2,n A3,1 A3,2 A3,3 A3,n . An,1 An,2 An,3 An,n Az olyan négyzetes (vagy kvadratikus) mátrixot, melynek „szimmetrikus elemei„ megegyezőek, szimmetrikus mátrixnak nevezzük: Ai,j =Aj,i Ezek helytakarékos ábrázolása hasonlóan oldható meg, mint a háromszögmátrixoké. V: A11 A12 A22 A13 A23 A33 A14 A24 A34 A44 … Ann 23:05
Ritka mátrixok Ritka mátrixnak nevezzük az olyan 2 dimenziós (tetszőleges méretű) tömböt, amelyben sok azonos értékű elem (leggyakrabban 0) szerepel, és a sok azonos értékű elem között a tőlük különböző értékű elemek véletlenszerűen helyezkednek el. A ritka mátrixokat akkor érdemes külön (egyedi módszerekkel) kezelni, ha nagy az elemszáma és ezen belül arányában is nagy az azonos értékű elemek száma. A megoldandó probléma u.a. mint az előbb. Cél: a tárhelyek megtakarítása 23:05
Ritka mátrixok 2 3 1 A= -1 4 7 23:05
Ritka mátrixok ábrázolása A megoldandó probléma u.a. mint az előbb. Cél: a tárhelyek megtakarítása Megoldások: Háromsoros reprezentáció: folytonos tárolású, a következő elven működik: Letároljuk 3 db vektorban a ritka elemekre vonatkozó információt. Mindegyik tömb annyi elemű, ahány ritka elem van a mátrixban. A 3 tömb azonos indexű elemei írnak le egy-egy ritka mátrix-elemet, mégpedig az eredeti mátrix sorfolytonos bejárásának sorrendjében. SOR=(1,1,2,2, 3,3,3,5,5,5, 5) OSZLOP=(6,9,1,7, 2,5,7,4,6,7, 8) ÉRTÉK=(2,3,2,1,-1,4,1,3,7,1,-1) 23:05
Ritka mátrixok háromsoros reprezentációja 2 3 1 A= -1 4 7 SOR=(1,1,2,2, 3,3,3,5,5,5, 5) OSZLOP=(6,9,1,7, 2,5,7,4,6,7, 8) ÉRTÉK=(2,3,2,1,-1,4,1,3,7,1,-1) 23:05
Ritka mátrixok háromsoros reprezentációja OSZLOP=(6,9,1,7, 2,5,7,4,6,7, 8) ÉRTÉK=(2,3,2,1,-1,4,1,3,7,1,-1) 11 elemű vektorok, mert 11 értékes elem volt a ritka mátrixban. A 3 soros ábrázolásnak alapvetően 2 problémája van: Nem tudjuk közvetlenül elérni az eredeti mátrix i. sorában és j. oszlopában található elemeit. Nem tudjuk előre a ritka elemek számát, ezért a vektorok elemszámát sem tudjuk előre rögzíteni. (Ez a vektorok statikussága miatt lenne fontos). 23:05
Ritka mátrixok háromsoros reprezentációja Lehetséges megoldások: A 1. problémát nem tudjuk megoldani, ebben a reprezentációban mindig egy lineáris keresést kell végrehajtani. a, Túl foglaljuk a helyet, de ezzel ellentmondunk az eredeti célunknak. b, Szétszórt ábrázolást alkalmazunk, melyet egy irányban láncolt listával valósíthatjuk meg: SOR OSZLOP ÉRTÉK KÖVETKEZŐ 1 6 2 5 8 -1 NIL 2 1 1 9 3 Fej 2 7 1 23:05
Ritka mátrixok ábrázolása A 3 soros reprezentáció jól alkalmazható konstanssal ill. oszlopvektorral történő szorzásnál vagy összeadásnál ill. sorok tartalmának kiértékelésénél. Rosszul alkalmazható viszont olyan problémáknál, ahol oszlopokat kell kezelni. A négy soros reprezentáció: Ez a 3 soros reprezentációnak a továbbfejlesztése. A négy soros reprezentáció a sor és oszlop szerinti feldolgozást egyaránt segíti. A reprezentációban 4 db egy dimenziós tömböt fogunk használni. Az előbb említett 3 tömbhöz hozzáveszünk még egy vektort, ami az oszlopok szerinti összefűzést valósítja meg. 23:05
Ritka mátrixok négysoros reprezentációja A 4. vektor egy adott eleme megadja a négy soros reprezentációban azt az indexet, amely a ritka mátrix ugyanazon oszlopának következő ritka elemeit írja le. Ha ilyen elem nincs, akkor az értéke nulla (0). 4+2 soros reprezentáció Ahhoz, hogy a sorokat és az oszlopokat közvetlenül is elérhessük, további 2 egydimenziós tömböt is létrehozhatunk. Ezen tömbök elemei megadják a ritka mátrix i. sorában ill. oszlopában lévő első ritka elem indexét a négy soros reprezentációban. Erről a plusz két vektorról annyit kell tudni, hogy S-nek (sor) annyi eleme van, amennyi sora van az eredeti mátrixnak, és az O-nak (oszlop) annyi eleme van, ahány oszlopa van az eredeti mátrixnak. Azokban az oszlopokban, ill. sorokban, ahol nincsen ritka elem, ott 0 kerül ezekbe a vektorokba. (Mintapéldánkban 4x11+5+9=58 elemet tárolunk, az eredeti mátrixnak 9x5=45 eleme van összesen, a nullákkal együtt. És mennyivel egyszerűbb lenne azt kezelni…) 23:05
Ritka mátrixok 4+2 soros reprezentációja 2 3 1 A= -1 4 7 SOR=(1,1,2,2, 3,3, 3,5,5,5, 5) OSZLOP=(6,9,1,7, 2,5, 7,4,6,7, 8) ÉRTÉK=(2,3,2,1,-1,4, 1,3,7,1,-1) KÖVETKEZÖ=(9,0,0,7, 0,0,10,0,0,0, 0) S=(1,3,5,0,8) O=(3,5,0,8,6,1,4,11,2) 23:05
Ritka mátrixok szétszórt ábrázolása A ritka mátrix szerkezeti felépítése első sorban nem is a folytonos, hanem a szétszórt ábrázolást kínálja. A szétszórt ábrázoláshoz multilistát alkalmazhatunk Egy-egy tárhelyen a ”jobbra” mutató megadja az ugyanezen sorban lévő következő ritka elem címét, mégpedig balról jobbra haladva. A „le” mutató ugyanezt oszlopokra adja meg fentről lefelé haladva. Az ábrázoláshoz hozzátartozik még két olyan tárterület, ami kizárólag fej mutatókat tartalmaz (ugyanannyi fej, mint ahány sora ill. oszlopa van a ritka mátrixnak). A fej mutató az adott sorban található első ritka elemet tartalmazó tárhelyet címezi meg. Ha az adott sorban nincsen ritka elem, akkor NIL a tartalma. 23:05
SOR OSZLOP ÉRTÉK JOBBRA LE NIL 3 5 4 NIL NIL 2 7 1 NIL 1 6 2 3 7 1 NIL 1 9 3 NIL 2 1 NIL 5 8 -1 NIL 3 2 -1 NIL 5 7 1 NIL 5 4 3 NIL 5 6 7 NIL 23:05
Ritka mátrixok 2 3 1 A= -1 4 7 23:05
Dinamikus tömb Dinamikus tömb -bármilyen meglepő is ez- egy dinamikus alapszerkezet. Általában egydimenziós tömböket értünk alatta, más szóval: dinamikus vektorok. Ennél az adatszerkezetnél létezik a bővítés és a fizikai törlés művelete. Egyébiránt minden olyan információ igaz rá, amiket a tömbnél elmondtunk. Szűkebb értelemben a dinamikus tömb elemeinek száma mindig egy aktuális elemszám, amely nem a létrehozással, hanem a használat során alakul ki. 23:05
Dinamikus tömb Bővítéskor ebbe a tömbbe új elemet viszünk föl. Ez azt jelenti, hogy mindig az aktuális elemszámnak megfelelő tárhelyet foglalunk le. Tágabb értelemben az aktuális méretet explicit módon adhatjuk meg, átméretezhetjük a tömböt, amelyben így léteznek olyan helyek ahol van elem, és maradhatnak olyanok, amelyek üresek. Ebben az értelemben fizikai törlést követően a dinamikus tömbben lyukak lehetnek (maradhatnak). Egydimenziós tömbök segítségével az összes homogén adatszerkezet (a tömb önmaga is) szimulálható. 23:05
Táblázat 5 Alma 67 Körte 3 Szilva 15 Szőlő dinamikus adatszerkezet (homogén, viszont az elemei mindig összetettek) A táblázat elemei összetettek: két részből állnak kulcsrészből és adatrészből (érték). A kulcsrészbe csak egyedi értékek kerülhetnek (egy táblázatban nem megengedhető két azonos kulcsérték). A kulcs és az elem típusa egymástól különbözhet, viszont minden kulcs, és minden elem azonos típusú, és így a táblázat: homogén adatszerkezet. KULCS ÉRTÉK 5 Alma 67 Körte 3 Szilva 15 Szőlő 23:05
Táblázat A kulcsok szolgálnak arra, hogy az értékeket megkülönböztethessük egymástól. A kulcsok segítségével elvégezzük az osztályozásukat, ezért a táblázat olyan asszociatív adatszerkezet, ahol minden elem a kulcsán keresztül érhető el. (Az egydimenziós tömb általánosításának tekinthető.) Reprezentációja egyaránt lehet folytonos és szétszórt, nagyon gyakran két vektor segítségével implementáljuk. Különböző szervezésű táblázatokról beszélhetünk. 23:05
Soros táblázat Létrehozásakor az elemek táblázatbeli sorrendjét egy időbeli sorrend adja. Meg kell mondanunk a kulcs és az adatrész típusát, majd ezt követően az elemek érkezési sorrendjében töltjük fel a táblázatot. A soros táblázat bővítése az egyik végén történik. Fontos: Az új kulcs valóban új kell legyen! Törléskor tetszőleges elemet törölhetünk úgy, hogy megkeressük a törlendő elemet, és azt az utolsó elemmel felülírjuk. Egyúttal 1-gyel csökkentjük a táblázat elemszámát. Ez a technika folytonos ábrázolás esetén is alkalmazható. Szétszórt ábrázolás esetén más megoldások is használhatóak. 23:05
Soros táblázat A csere művelete megengedett: az adatrészt bármikor cserélhetjük, a kulcsot viszont csak akkor, ha az új kulcs még nincs a táblázatban. A rendezés nem értelmezett. Keresés: Teljes keresés, a kulcs alapján történik. Az elemek elérése szekvenciális, a bejárás soros, és a feldolgozás alapja a kulcs és a teljes keresés. Ábrázolása lehet folytonos és szétszórt egyaránt. Hol használatos? Ahol az adathalmaz minden elemét meg kell tudni különböztetni egymástól. Hátránya: Ha nem azonos az elemek feldolgozási gyakorisága, akkor a használat nem gazdaságos. 23:05
Önátrendező táblázat A soros táblázat ezen hátrányos tulajdonságát próbálja meg kiküszöbölni az önátrendező tábláza. Az önátrendező táblázatban az elemek keresési gyakoriságuk fordított sorrendjében helyezkednek el. Ez lenne a jó. Csakhogy az ilyenfajta sorba állításhoz ismerni kellene az elemek feldolgozási gyakoriságát. De nem ismerjük. Viszont a önátrendező táblázat segítségével ez a sorrend nagyon jól közelíthető: a táblázatot az elemek feldolgozásakor folyamatosan átrendezzük: ha egy elemre hivatkozás történik (fel akarjuk dolgozni), akkor azt a feldolgozást követően a táblázat elejére csúsztatjuk. 23:05
Önátrendező táblázat A többi elem egymáshoz viszonyított sorrendje változatlan marad. Az utoljára feldolgozott elem a táblázat elejére kerül. Sok feldolgozási lépés után nagy átlagban a nagyobb visszakeresési gyakorisággal rendelkező elemek a táblázat elején lesznek megtalálhatóak. Ábrázolása egyértelműen a szétszórt ábrázolással praktikus. 23:05
Rendezett táblázat A rendezett táblázat elemei a kulcs alapján rendezettek. A feldolgozás gyorsítása érdekében alkalmazzuk ezt az adatszerkezetet. Az adatelemek sorrendjét a kulcsok szerinti növekedési sorrend definiálja. Létrehozása és bővítése beszúró rendezéssel történik. Csere: Ugyanúgy mint a korábbi táblázatoknál. Megfelelő ábrázolás mellett többféle keresési algoritmus használható. Többnyire a lineáris és bináris a praktikus választás. Folytonos ábrázolásnál gyorsabb a keresés, viszont problematikus a bővítés és a fizikai törlés. Szétszórt ábrázolásnál pedig pont fordított a helyzet. Általában a megoldandó probléma jellege dönti el, hogy a két ábrázolási mód közül melyiket használjuk. 23:05