Algoritmusok és adatszerkezetek

Hasonló dokumentumok
Adatszerkezetek és algoritmusok

21. Adatszerkezetek Az adattípus absztrakciós szintjei Absztrakt adattípus (ADT) Absztrakt adatszerkezet (ADS) Egyszerű adattípusok Tömbök

7. BINÁRIS FÁK 7.1. A bináris fa absztrakt adattípus 7.2. A bináris fa absztrakt adatszerkezet

Buborékrendezés: Hanoi Tornyai: Asszimptótikus fv.ek: Láncolt ábrázolás: For ciklussal:

22. GRÁFOK ÁBRÁZOLÁSA

5. SOR. Üres: S Sorba: S E S Sorból: S S E Első: S E

Adatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

Adatszerkezetek és algoritmusok

GRÁFOK ÉS ALGORITMUSOK ELMÉLETE VIZSGAKÉRDÉSEK Matematika BSc Elemző szakirány II. év 1. félév

A számítástudomány alapjai. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem

2. AZ ADATTÍPUS ABSZTRAKCIÓS SZINTJEI...2

Kupac adatszerkezet. A[i] bal fia A[2i] A[i] jobb fia A[2i + 1]

4. VEREM. Üres: V Verembe: V E V Veremből: V V E Felső: V E

Amortizációs költségelemzés

Algoritmuselmélet 2. előadás

Algoritmusok és adatszerkezetek I. 1. előadás

26. MINIMÁLIS KÖLTSÉGŰ UTAK MINDEN CSÚCSPÁRRA

Programozás alapjai 9. előadás. Wagner György Általános Informatikai Tanszék

1. Alapfogalmak Algoritmus Számítási probléma Specifikáció Algoritmusok futási ideje

Adatszerkezetek 7a. Dr. IványiPéter

Érdekes informatika feladatok

Algoritmusok és adatszerkezetek gyakorlat 07

Nagyságrendek. Kiegészítő anyag az Algoritmuselmélet tárgyhoz. Friedl Katalin BME SZIT február 1.

A félév során előkerülő témakörök

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Rendezések. A rendezési probléma: Bemenet: Kimenet: n számot tartalmazó (a 1,a 2,,a n ) sorozat

Struktúra nélküli adatszerkezetek

19. AZ ÖSSZEHASONLÍTÁSOS RENDEZÉSEK MŰVELETIGÉNYÉNEK ALSÓ KORLÁTJAI

A C programozási nyelv III. Pointerek és tömbök.

15. A VERSENYRENDEZÉS

3. TÖMBÖK A tömb absztrakt adattípus Legyen T az E alaptípus feletti k ( 1) dimenziós tömb típus. Vezessük be az I I1

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Függvények növekedési korlátainak jellemzése

Taylor-polinomok. 1. Alapfeladatok április Feladat: Írjuk fel az f(x) = e 2x függvény másodfokú Maclaurinpolinomját!

Adatszerkezetek 1. Dr. Iványi Péter

Programozás alapjai II. (7. ea) C++

1.előadás Tornai Kálmán

10. előadás Speciális többágú fák

Aritmetikai kifejezések lengyelformára hozása

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

A C programozási nyelv III. Pointerek és tömbök.

2. Milyen értéket határoz meg az alábbi algoritmus, ha A egy vektor?. (2 pont)

Más szavakkal formálisan:, ahol olyan egész szám, hogy. Más szavakkal formálisan:, ahol olyan egész szám, hogy.

Bevezetés. 1. fejezet. Algebrai feladatok. Feladatok

1. ábra. Egy rekurzív preorder bejárás. Egy másik rekurzív preorder bejárás

A programozás alapjai előadás. [<struktúra változó azonosítók>] ; Dinamikus adatszerkezetek:

Ajánlott elemi feladatok az AAO tárgyhoz 41 feladat

Hierarchikus adatszerkezetek

Bevezetés a programozásba I.

KOVÁCS BÉLA, MATEMATIKA I.

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Felvételi tematika INFORMATIKA

Függvények július 13. f(x) = 1 x+x 2 f() = 1 ()+() 2 f(f(x)) = 1 (1 x+x 2 )+(1 x+x 2 ) 2 Rendezés után kapjuk, hogy:

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

Algoritmusok Tervezése. 6. Előadás Algoritmusok 101 Dr. Bécsi Tamás

Ellenőrző kérdések. 36. Ha t szintű indexet használunk, mennyi a keresési költség blokkműveletek számában mérve? (1 pont) log 2 (B(I (t) )) + t

1. feladatsor: Vektorterek, lineáris kombináció, mátrixok, determináns (megoldás)

2. AZ ADATTÍPUS ABSZTRAKCIÓS SZINTJEI

Algoritmusok és adatszerkezetek I. régebbi vizsgakérdések.

Web-programozó Web-programozó

Lineáris algebra 2. Filip Ferdinánd december 7. siva.banki.hu/jegyzetek

rank(a) == rank([a b])

Kiegészítő részelőadás 1. Az algoritmusok hatékonyságának mérése

Kupac adatszerkezet. 1. ábra.

Elemi adatszerkezetek

INFORMATIKA javítókulcs 2016

7. gyakorlat. Lineáris algebrai egyenletrendszerek megoldhatósága

Megoldott feladatok november 30. n+3 szigorúan monoton csökken, 5. n+3. lim a n = lim. n+3 = 2n+3 n+4 2n+1

1. tétel. 1. Egy derékszögű háromszög egyik szöge 50, a szög melletti befogója 7 cm. Mekkora a háromszög átfogója? (4 pont)

Absztrakt adatstruktúrák A bináris fák

7. gyakorlat. Lineáris algebrai egyenletrendszerek megoldhatósága

2005_01/1 Leírtunk egymás mellé hét racionális számot úgy, hogy a két szélső kivételével mindegyik eggyel nagyobb a két szomszédja szorzatánál.

Halmazok. Gyakorló feladatsor a 9-es évfolyamdolgozathoz

6. Függvények. 1. Az alábbi függvények közül melyik szigorúan monoton növekvő a 0;1 intervallumban?

Adatszerkezetek 2. Dr. Iványi Péter

17. A 2-3 fák és B-fák. 2-3 fák

Hatvány gyök logaritmus

Komplex számok. Wettl Ferenc előadása alapján Wettl Ferenc előadása alapján Komplex számok / 18

Egyirányban láncolt lista

6. LISTÁK ábra. A lista absztrakt adatszerkezet (ADS)

Adatbázis és szoftverfejlesztés elmélet. Programozási tételek

Adatszerkezetek 1. előadás

Vektorterek. Wettl Ferenc február 17. Wettl Ferenc Vektorterek február / 27

file:///d:/okt/ad/jegyzet/ad1/b+fa.html

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

Komputeralgebrai Algoritmusok

Algoritmuselmélet. 2-3 fák. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem. 8.

Adatszerkezetek I. 7. előadás. (Horváth Gyula anyagai felhasználásával)

Edényrendezés. Futási idő: Tegyük fel, hogy m = n, ekkor: legjobb eset Θ(n), legrosszabb eset Θ(n 2 ), átlagos eset Θ(n).

Határozott integrál és alkalmazásai

8. Egyenletek, egyenlőtlenségek, egyenletrendszerek II.

Rendezések. Összehasonlító rendezések

: s s t 2 s t. m m m. e f e f. a a ab a b c. a c b ac. 5. Végezzük el a kijelölt m veleteket a változók lehetséges értékei mellett!

Gyakori elemhalmazok kinyerése

Gyakorló feladatok ZH-ra

Átírás:

Algoritmusok és adatszerkezetek Feladatgy jtemény a gyakorlatokhoz Szerkeszti: Hunyadvári László és Fekete István (Ideiglenes változat) Programtervez matematikus szak Alkalmazott matematikus szak ELTE TTK Általános számítástudományi Tanszék Budapest, 2002.

Algoritmusok m veletigénye Ennek a tárgynak a keretében számos algoritmust ismernek meg a hallgatók. Minden egyes algoritmus esetén megállapításra kerül annak m veletigénye. Ez vagy számolást történik, vagy nyilvánvaló esetben korábbi tapasztalatainkra való hivatkozással. A bevezet el adásban két algoritmus kerül elemzésre, ezeket (E) jelöli az alábbi feladat sorban, gyakorlaton nem kell velük foglalkozni. 1. Elemezzük a lineáris keresés I. változatát. A csupa különböz elemeket tartalmazó A[1..n] tömbben keressük az els B tulajdonságú elemet, ha tudjuk, hogy van ilyen elem a tömbben. (Egyszer bb változatban: keressük egy olyan x érték els el fordulását, amelyet a tömb tartalmaz.) Hányszor kell a B tulajdonságot kiszámítani (ill. tömbelemet x-szel összehasonlítani) a legkedvez bb, a legrosszabb és az átlagos esetben? Az átlagos lépésszám kiszámításához tegyük fel, hogy minden elemet egyforma valószín séggel keresünk. 2. Elemezzük a lineáris keresés II. változatát. A csupa különböz elemet tartalmazó A[1..n] tömbben keressük az els B tulajdonságú elemet, de nem biztos, hogy van ilyen elem a tömbben. (Egyszer bb változatban: keressük egy olyan x érték els el fordulását, amelyet a tömb nem feltétlenül tartalmaz.) Hányszor kell a B tulajdonságot kiszámítani (ill. tömbelemet x-szel összehasonlítani) a legkedvez bb, a legrosszabb és az átlagos esetben? Az átlagos lépésszám kiszámítását végezzük el két különböz feltevés mellett is: a) Ugyanakkora valószín séggel ( 1 n + ) keresünk nem létez értéket, illetve keressük 1 bármelyik létez elemet. b) Egyaránt az esetek felében keresünk nem létez elemet, ill. létez elemet. Az utóbbi esetben minden elemet egyforma valószín séggel ( 1 ) keresünk. 3. Egy polinom helyettesítési értékét kell adott helyen kiszámítanunk. Adott az n számú a együttható, valamint az x valós szám, és a 0, a1,, a n 1 2n n 1 i= 0 meghatározni. a) Hány szorzást végez az az algoritmus, amely számolja? b) Írjuk meg a Horner-séma algoritmusát, amely a következ eljárást követi: n 1 i= 0 a x Hány szorzást végez ez az eljárás? ( ( a x a ) x a ) x a i i = n 1 + n 2 + + 1 + a i i x értékét szeretnénk i x értékét i számú ismételt szorzással 4. (E) Hány korongmozgatással lehet megoldani a Hanoi tornyai problémát? Vegyük alapul a probléma rekurzív megoldását és annak alapján írjuk fel a lépésszám rekurzív egyenletét. 5. (E) Határozzuk meg, hogy hány összehasonlítást, illetve cserét végez a buborékrendezés a legrosszabb, a legjobb és az átlagos esetben. Az átlagos eset számításához tegyük fel, hogy az elemek mind különböz k és minden permutációjuk egyformán valószín. 6. Adjunk rekurzív algoritmust a buborékrendezésre a következ ötlet alapján: az A[1..n] tömböt úgy rendezzük, hogy el bb rendezzük magával a buborékrendezéssel az A[2..n] résztömböt, majd az A[1] elemet szomszédos elemek cseréjével a helyére 0 2

"buborékoltatjuk" (rekurzív hívás + ciklus). Írjuk fel az összehasonlítások számának rekurzív egyenletét és oldjuk meg azt. 7. Módosítsuk a buborékrendezést úgy, hogy ha egy menetben már nem volt csere az A[1..j] résztömbben, akkor az eljárás megáll (mivel a tömb rendezett). Változik-e ez által a cserék száma? Változik-e az összehasonlítások száma a legrosszabb és legjobb esetben? (Az átlagos esetet nem kell vizsgálni.) 8. Elemezzük a beszúró rendezést. Határozzuk meg összehasonlítások és az elemmozgatások számát a legrosszabb, a legjobb és az átlagos esetben. Hasonlítsuk össze a buborék és a beszúró rendezés hatékonyságát. Vegyük úgy, hogy egy csere három elemmozgatással valósítható meg. 9. A számítógépes matematikai eljárások egy valós szám nemnegatív egész kitev s hatványát ügyes ismételt szorzásokkal számítják ki úgy, hogy közben magát a kitev t kett hatványainak összegeként alakítják ki. Határozzuk meg, hogy az alábbi Legendrealgoritmus hány szorzást végez a legjobb és a legrosszabb esetben. FvLegendre(a,k) a=0 s:=0 s:=1 k>0 2 k a:=a*a k:=k/2 s:=s*a k:=k-1 Return(s) 10. Nagyságrendben hány szorzással kapjuk meg a polinom helyettesítési értékét, ha a i számítást az eredeti képletnek megfelel en végezzük (lásd: 3. feladat), de az x értékeket a Legendre-algoritmussal (lásd: 9. feladat) számoljuk? 11. Elemezzük a bináris (logaritmikus) keresést speciális esetben, illetve "könnyített" módon. a) Hány összehasonlítást végez a bináris keresés a legrosszabb esetben, ha n=2 k -1 (k 1)? b) Ellen rizzük néhány más n-re is, hogy az összehasonlítások pontos száma a legrosszabb esetben: MÖ(n) = [log 2 n]+1 c) Írjunk fel az összehasonlítások maximális számára egy közelít rekurzív egyenletet, amelyben nem használjuk az egészrészt. Oldjuk meg ezt az egyenletet. d) Rajzoljuk le a bináris keresés "szerkezetét" bináris fával. Hogyan értelmezhetjük eddigi eredményeinket? 3

e) Mondjuk meg, hogy az összehasonlítások átlagos száma milyen nagyságrend lehet, milyen együtthatóval. Indokoljuk válaszunkat. Az aszimptotikus jelölések tulajdonságai Függvények aszimptotikus növekedése Az el adáson bevezetésre kerülnek az O,,, o, és jelölések, amelyek segítségével két függvény aszimptotikus viszonya jellemezhet. Ezekre a definíciókra alapozva építjük fel a függvények aszimtotikájának az elméletét. Az el adáson nem bizonyítjuk az elhangzó tételeket, tulajdonságokat. Az alábbi feladatok ezért jórészt ezeknek az állításoknak az igazolását t zik ki célul. A feladat sorszáma mellett álló "(E)" utal erre, vagyis azt jelenti, hogy a feladatban megfogalmazott állítás az el adáson kimondásra került. 1. (E) Bizonyítsuk be az aszimptotikus függvényosztályok alábbi tulajdonságait: a) Tranzitivitás: O,,, o, és. b) Reflexivitás: O,,. c) Szimmetria:. 2. (E) Bizonyítsuk be az ún. felcserélt szimmetria tulajdonságát: a) f = O( g) g = Ω( f ). b) f = o( g) g = ( f ). 3. (E) Bizonyítsuk be, hogy az O,,, o, és függvényosztályok zártak az összeadásra és a számmal való szorzásra nézve. Pl.: Legyen f = O(h) és g = O(h), valamint c > 0. Lássuk be, hogy ekkor f + g = O(h), ill. cf = O(h). 4. (E) Lássuk be, hogy összegben a nagyobb függvény meghatározza az aszimptotikát: max{ f, g} = Θ( f + g). (Két szekvenciába kapcsolt algoritmus m veletigénye aszimptotikusan ugyanannyi, mint a nagyobbik m veletigény.) 5. (E) Lássuk be, hogy a) f = Θ( g) f = O( g) és f = Ω(g), b) o( g) ω ( g) = Ø. 6. (E) Az aszimptotikus kapcsolat meghatározása a két függvény hányadosának határértéke alapján. Tegyük fel, hogy létezik a határérték (amelyet alább egyszer bb alakban írunk). Bizonyítsuk be, hogy ekkor a) f 0 lim = { g c > 0 b) f lim = { g c > 0 c) f lim = c > 0 g f = O(g) d) f lim = 0 g f = Ω(g) e) f = g f = Θ(g) f = o(g) lim f = ω(g) 4

7. (E) Lássuk be, hogy polinom esetén a legmagasabb fokú tag meghatározza a nagyságrendet: k k 1 k a n + a n + + a n + n = Θ( n ). k k 1 1 0 8. (E) Lássuk be, hogy log a n = Θ(logb n), ahol a, b > 1. (A logaritmus alapszámának nincs szerepe az aszimptotikus viselkedés szempontjából.) a a+ε a a+ε a a+ε 9. (E) Lássuk be, hogy n = o( n ) azaz n = O( n ) és n Θ( n ), ahol a 0 és ε > 0. (Polinomiális lépésszám esetén a legmagasabb fokú tag kitev jében a legcsekélyebb változás is éles aszimptotikus változást eredményez.) 10. (E) Hasonlítsuk össze aszimptotikusan a következ függvényeket: log n, n, log n, n, 2 n, 3 n, n. (Számíthatjuk a hányados határértékét és alkalmazhatjuk a L'Hospitalszabályt.) n 2,! 2 3 n 11. Adottak az alábbi fiktív futási id k: log 2 n, n, log 2 n, n, n, n, 2, n!. Tegyük fel, hogy a függvények értékeit 10-6 mp-ben értjük. Számítsuk ki a futási id ket n=1, 10, 100,...,1 000 000 esetén és váltsuk át a legnagyobb értelmes id egységbe (mp, perc, óra, nap, hónap, év, évszázad, évezred). 2 2 Absztrakt adattípus specifikálása A tananyagban szerepl egyszer típusok/adatszerkezetek a következ k: tömb, verem, sor, els bbségi sor, listák, fák, gráfok. Ezek közül a verem, sor és az els bbségi sor ADT szint specifikációit kell tudni vizsgán. (Az absztrakt verem típus specifikációja szerepel el adáson.) Ez a három feladat a feladatgy jteményben a megfelel adatszerkezeteknél szerepel. Itt most egy negyedik feladat következik. 1. A zsák olyan "halmazszer " típus, amelyben egy elem többször is el fordulhat. Az elemeknek tehát multiplicitásuk van. A következ típusm veleteket értelmezzük: - Üres: az üres zsák létrehozása, egyben az üres zsák jele/neve. - Üres-e (z): logikai érték függvény, annak lekérdezése, hogy a z zsák üres-e. - Szám (z,e): nemnegatív egész érték függvény, amely megadja, hogy a z zsák hány példányban tartalmazza az e elemet. - Be (z,e): a z szákban elhelyezi az e elemet, eredménye az egy elemmel b vített z zsák. - Ki (z,e): ha az e elem nem szerepel z-ben, akkor z változatlan marad, ha viszont z tartalmazza e-t, akkor a m velet egy el fordulást eltávolít és "eldobja" azt, az eredmény mindenképpen a z zsák új változata, változatlan vagy csökkentett mérettel. Adjuk meg a zsák adattípus algebrai (axiomatikus) specifikációját. 2. Adjuk meg az el z feladatban szerepl zsák típus funkcionális (el - utófeltételes) specifikációját. Használhatjuk az (elem, multiplicitás) rendezett párok halmazát, mint matematikai reprezentációt. 5

Tömbök Tömbök aritmetikai ábrázolása (címfüggvények) Az alábbi feladatokban általában valamilyen speciális tömböt kell tömören elhelyezni az (absztrakt) memória "celláinak" az egymás utáni sorában, adott címt l kezd d en. Az elhelyezés általában sorfolytonos, ritkán oszlopfolytonos. A feladat ilyen esetben a címfüggvény megadása az elhelyezés kezd címének és egy tömbelem helyfoglalásának (méretének) a figyelembe vételével. Egyszer sítsük a feladatot az indexfüggvény megadására! Tegyük fel, hogy adott egy kell méret vektor, amelynek alaptípusa ugyanaz, mint az elhelyezend adatelemek típusa. Az elhelyezést a vektor 1. elemét l kezdjük. Az indexfüggvény az elhelyezend tömb tetsz leges elemének az indexkifejezéséhez megadja azt az indexet a vektorban, amelyik mutatja azt a helyet, ahová az elem került. Az elhelyezés legyen mindig sorfolytonos, ha mást nem mondunk. Ügyeljünk arra, hogy az elhelyezend tömb "értéktelen" nulla elemeit is tegyük le egyszer a vektorban, és ennek az elemnek az indexét építsük be az indexfüggvénybe. Ne felejtsük el az indexek lehetséges értéktartományait mindig megadni. Az indexfüggvény helyességét célszer néhány érték behelyettesítésével ellen rizni. 1. Adjuk meg az A[1..m, 1..n] mátrix cím- és indexfüggvényét sor- és oszlopfolytonos elhelyezés mellett is. 2. Adott egy mxn-es mátrix sorfolytonos elhelyezése a B[1..m*n] tömbben. Írjuk át az elemeket a C[1..m*n] tömbbe oszlopfolytonos elhelyezés szerint. 3. Írjuk fel az A[1..l, 1..m, 1..n] 3-dimenziós tömb szekvenciális elhelyezésének az indexfüggvényét. 4. Adjuk meg az alsóháromszög-mátrix szekvenciális elhelyezésének az indexfüggvényét. Az A[1..n, 1..n] mátrix alsó háromszögét a f átló és az ez alatti elemek alkotják. Ha tudjuk, hogy csak itt lehetnek nullától különböz elemek, akkor az alsó háromszög mátrix minden "értékes" elemet tárol elegend tehát csak ezt a részt, valamint a nulla egy példányát tárolni. 5. Egy f átlójára szimmetrikus négyzetes mátrix takarékos tárolását valósítsuk meg az alsó háromszögének tömbös elhelyezésével. Mi lesz az indexfüggvény? Fejezzük ki A[i+1, j] és A[i, j+1] indexét A[i, j] indexének ismeretében. 6. A tridiagonális mátrix egy olyan négyzetes mátrix, amelynek a f átlójában és közvetlenül a felett és az alatt (vele párhuzamosan, ferdén) találhatunk nullától különböz elemeket. Milyen indexfüggvény írja le ezeknek az elemeknek (valamint egy példányban a nulla elemnek) az elhelyezését? 7. Írjuk fel az alsó Hessenberg-mátrix indexfüggvényét. Ez az alsó háromszög mátrixhoz képest még egy átlószer ferde sort tartalmaz, közvetlenül a f átló fölött. 8. A négyzetes pepita mátrix kétféle elemet tartalmaz: nullától különböz t és nullát. Az A[1,1] elem értéke nem nulla, mellette és alatta nullák állnak. Általában minden nem nulla elemnek a vízszintes és függ leges irányú szomszédjai nullák, és fordítva. (Átlósan nézve 6

pedig egynem ek az elemek.) Adjuk meg a takarékos ábrázolás indexfüggvényét. (Ne feledkezzünk el arról, hogy a 0-értéket is eltároljuk egyszer.) 9. Az A[1..n]-t blokkmátrixnak nevezzük, ha csak a f átlójára mentén tartalmaz nullától különböz elemeket, mégpedig átlósan a f átlóra fektetett, egymással érintkez négyzetekben. Az egyes négyzetek méretét a B[1..k] tömb tartalmazza. A B-beli elemek összege természetesen n-et ad. Írjuk meg a blokkmátrix aritmetikai ábrázolásának indexfüggvényét, mint függvény eljárást. Tömbök láncolt ábrázolása A ritka, vagy más néven hézagosan kitöltött mátrixok szokásos ábrázolási formája a következ. Képzeljük magunk elé a ritkásan kitöltött A[1..m,1..n] mátrixot. Alakítsunk ki egy olyan rekordszerkezetet, amelyben minden beírt nem-nulla értéket négy további mez kísér. Az els kett be írjuk be az elem sor- és oszlop-indexét. A másik kett ben pedig helyezzünk el egy-egy pointert, amelyek rendre a sor illetve az oszlop következ elemére mutatnak, ha pedig nem lenne ilyen további elem, akkor a megfelel pointer értéke NIL. Azért, hogy sorok illetve az oszlopok els elemeit el tudjuk érni, rájuk mutató pointerekkel egészítjük ki az ábrázolást. Képzeljünk el a mátrix bal oldalán egy függ leges S[1..m] vektort, és helyezzük el benne a sorok els elemeire mutató pointereket, illetve NIL-t, ha a sor üres. A mátrix fölé rajzoljuk vízszintesen az O[1..n] vektort, amelyben az oszlopok els elemeire mutató pointereket (illetve NIL-eket) tároljuk. Így már eljuthatunk a mátrix minden eleméhez. Megjegyezzük, hogy az S és az O vektorok alkalmazhatunk egy-egy (fejelem nélküli) listát, amelynek minden eleme két pointert tartalmaz: az egyiknek ugyanaz a szerepe, mint az iménti tömbös változatban, a másik pedig magában a listában mutat a következ elemre. 1. Milyen kitöltöttségi arány mellett érdemes a mátrixok láncolt ábrázolását használni? (Tegyük fel, hogy a mutatók 1 byte-ot, a mátrix-elemek pedig t byte-ot foglalnak el.) 2. Írjunk olyan függvény-eljárást, amely visszaadja az A[i,j] elem értékét. 3. Írjuk meg azt az eljárást, amelyik végrehajtja az A[i,j]:=a értékadást. (Ha az elem értéke nulláról változik meg, akkor létre kell hozni és be kell f zni a láncolt struktúrába, ha pedig most válik nullává az értéke, akkor törölni kell.) 4. Adjuk meg a konverzió algoritmusát, amellyel a hagyományos formájú mátrixot láncolt ábrázolásúvá alakítjuk. (Feladat lehet a másik irány is.) 5. Írjunk programot, amely egy láncolt ábrázolású mátrixról megállapítja, hogy szimmetrikus-e. 6. Írjuk meg a C:=A+B mátrix összeadás eljárását. Legyen C is láncolt ábrázolású. 7

Verem 1. (E) Adjuk meg a verem adattípus algebrai (axiomatikus) specifikációját. (M veletek: Empty, IsEmpty, Push, Pop, Top.) 2. Adjuk meg a verem funkcionális (el -, utófeltételes) specifikációját. Használjuk a verem következ matematikai reprezentációját. Az absztrakt verem olyan elempárok halmaza, amelyekben az 1. komponens a verembe betett tulajdonképpeni érték, a 2. komponens pedig a behelyezés id pontja. (Bármely két id pont különbözik). 3. Készítsük el a verem aritmetikai (tömbös) reprezentációját. A vermet a (megfelel alaptípusú) V[1..max] tömbben ábrázoljuk, az aktuális kitöltöttséget a fels elem "top" indexe jelzi. Adjuk meg a veremm veletek algoritmusait. A m veletek között megjelenik az IsFull lekérdezés. 4. Reprezentáljuk a vermet láncolt adatszerkezettel (fejelem nélküli listával). Írjuk fel a m veletek algoritmusait. 5. (E) Adjuk meg a helyes zárójelezés definícióját, többféleképpen is. 6. (E) A helyes zárójelezés tétele. Egy szekvenciális input sorozat a "(" és ")" karakterekb l álló helyes zárójelezést tartalmaz. Írjunk olyan, vermet használó eljárást, amely az összetartozó zárójel párok sorszámait egymás sorban mellé írja. Pl. ((())()) 3,4,2,5,6,7,1,8. 7. Döntsük el verem használatával egy "(" és ")" karakterekb l álló sorozatról, hogy helyes zárójelezés-e. 8. Döntsük el vermes algoritmussal, hogy egy "(,),[,]" karakterekb l összeállított sorozat helyes zárójelezés-e. Ehhez el bb terjesszük ki a fogalmat értelemszer en, azzal a megszorítással kiegészítve, hogy gömböly zárójel pár belsejében nem lehet szögletes zárójel pár. (Kiegészíthet a zárójelek köre még a "{,}" zárójelekkel is.) 9. Ellen rizzük verem segítségével, hogy egy szekvenciális input sorozat tükörszót tartalmaz-e. (A tükörszó mindig páros hosszúságú, pl. "abba" v. "indulaaludni"; nem tükörszó pl. a "görög".) a) A sorozat hossza adott. b) A sorozat hosszát nem ismerjük. 10. Definiáljuk a lengyel forma fogalmát olyan kifejezésekre, amelyek +,-,*,/ és (hatványozás) két-operandusú m veleti jeleket tartalmazzák - az operandusok és a (,) zárójelpárok mellett. Terjesszük ki a meghatározást az értékadásra is. A m veletek precedenciája: (1), (2) * és / egyforma, (3) + és - egyforma, (4) :=. Azonos precedenciájú m veleti jelek esetén általában balról-jobbra szabály érvényesül, kivétel a operátor, amelyek körében jobbról-balra szabály mérvadó. 11. Körvonalazzuk a lengyel formára hozás vermes algoritmusát: milyen tevékenységet hajtunk végre a kifejezés egyes elemeire. 12. Hozzuk lengyel formára a következ kifejezést: 8

x := (a*b+1)/((x^y^2+u*(v-1))*(f+g-(h+3)*4)) Adjuk meg lengyel formát olyan módon, hogy az operandusok fölé rajzoljuk oda a verem tartalmát az illet operandus kiírásakor. 13. Adott egy kifejezés lengyel formája szekvenciális input sorozat formájában. Tegyük fel, hogy sorozat minden eleme a lengyel forma egy egységét tartalmazza. Rendelkezünk továbbá olyan függvényekkel, amelyek segítségével ezek megkülönböztethet k: m veleti jelek, operandusok: konstansok és változók. Olyan függvényünk is van, amely egy változó értékét szolgáltatja. Írjunk olyan vermes algoritmust, amely kiszámítja egy lengyel formában felírt kifejezés értékét. Sor 1. Adjuk meg a sor adattípus algebrai (axiomatikus) specifikációját. (M veletek: Empty, IsEmpty, In, Out, First.) 2. Adjuk meg a sor funkcionális (el -, utófeltételes) specifikációját. Használjuk a sor következ matematikai reprezentációját. Az absztrakt sor olyan elempárok halmaza, amelyekben az 1. komponens a sorba beállított tulajdonképpeni érték, a 2. komponens pedig a behelyezés id pontja. (Bármely két id pont különbözik). 3. Készítsük el a sor aritmetikai (tömbös) reprezentációját. A sort a (megfelel alaptípusú) S[1..max] tömbben ábrázoljuk, az aktuális kitöltöttséget az utolsó elem "last" indexe jelzi. Adjuk meg a sor m veletek algoritmusait. A m veletek között megjelenik az IsFull lekérdezés. (A hibakezelést nem kell kidolgozni.) 4. Reprezentáljuk a sort láncolt adatszerkezettel (fejelem nélküli listával). Írjuk fel a m veletek algoritmusait. Ide sorolható még a bináris fa szintfolytonos bejárásának feladata. Lásd: Bináris fák, 3. feladat. Els bbségi sor 1. (E) Adjuk meg az els bbségi sor adattípus algebrai (axiomatikus) specifikációját. Éljünk azzal az egyszer sítéssel, hogy a sor elemei maguk a prioritási értékek (természetes számok). 2. Ábrázoljuk az els bbségi sort rendezetlen tömbbel. A P[1..max] tömb tartalmazza a beérkezett n számú prioritási értéket, méghozzá a beérkezés sorrendjében. Írjuk meg az egyes m veletek algoritmusait és adjuk meg a bennük szerepl összehasonlítások maximális és átlagos számát. 9

3. Ábrázoljuk az els bbségi sort rendezett tömbbel. A P[1..max] tömb tartalmazza a beérkezett n számú prioritási értéket, méghozzá nagyság szerint csökken sorrendjében. A rendezettséget tehát minden beszúrás és törlés után fenn kell tartani. Írjuk meg az egyes m veletek algoritmusait és adjuk meg a bennük szerepl összehasonlítások maximális és átlagos számát. Listák (láncolt ábrázolás) A cím magyarázata a következ. A láncolt (v. pointeres) ábrázolás egy olyan reprezentációs technika, amely minden adattípus esetén alkalmazható. A (többféle) lista viszont típus, beleértve a listam veleteket is. A listákat általában mutatók segítségével - tehát láncoltan - ábrázolják. A szakmai köztudatban ezért gyakran keveredik a két fogalom. Az el adáson az hangzik el, hogy típus = adatszerkezet + m veletek, és az adatszerkezethez csak a m veleteken keresztül lehet hozzáférni. Így a lista önmagában csak adatszerkezet, a m veleteivel együtt már típus. A következ feladatok megoldása során (ahol ez értelmes) mindig gondoljuk meg a két megoldási szint lehet ségét, egyszer ségét és hatékonyságát: I. közvetlen pointerkezelés az ábrázolás szintjén, II. megoldás a típus m veleteivel. Ha egy feladatban nem szerepel az, hogy van-e fejelem, akkor a megoldóra bízzuk az ezzel kapcsolatos megfontolásokat. 1. (E) Definiáljuk az egyirányú fejelem nélküli lista típust. Adjuk meg a bevezetett m veletek algoritmusait. 2. Tervezzük meg az egyirányú fejelemes lista típust. Vannak-e különbségek a felhasználói felületben a fejelem nélküli változathoz képest: tud-e a felhasználó a fejelem létér l, melyek a m veletek, hogyan m ködnek? 3. Tervezzük meg a fejelemes kétirányú ciklikus lista típust. Adjuk meg a m veletek algoritmusait. 4. Egy egyirányú lista egy polinom együtthatóit tartalmazza fokszám szerint csökken sorrendben. (Ha egy együttható nulla, akkor is szerepel a listában.) Írjuk meg a Hornereljárást, amely kiszámítja a polinom helyettesítési értékét egy adott helyen. 5. Írjunk meg azt az algoritmust, amely egy egyirányú listában megfordítja az elemek sorrendjét. 6. (E) Rendezett lista építése. Az S szekvenciális input file egész számokat tartalmaz. Minden egyes beolvasott számot azonnal elhelyezzük az L egyirányú listában, mégpedig úgy hogy a lista mindig rendezett legyen. 7. Adott két rendezett fejelemes lista. A listákban (külön-külön) minden érték (kulcs) egyedi, azaz egyik sem fordul el többször. Futtassuk össze a két listát egy harmadik fejelemes listába (unió képzése). 8. Oldjuk meg az el z feladatot azzal a módosítással, hogy a két lista unióját az els ben állítjuk el, azaz a második listát az els be f zzük. 10

9. Egy fejelemes kétirányú ciklikus listában a bal oldali pointerlánc megsérült. Állítsuk helyre azt a jobb oldali mutatók alapján. 10. Adott egy fejelemes kétirányú ciklikus lista, amelynek minden elemében egy-egy bet található. Döntsük el, hogy szimmetrikus-e a listában tárolt szó. (Pl.: ARRA és ARA ilyen.) 11. Adott egy egyirányú fejelemes lista, amelyben az értékek (pl. egészek) rendezetlen módon szerepelnek. Állítsuk sorba az elemeket a beszúró rendezés algoritmusával, természetesen úgy, hogy az elemek "helyben maradnak", csak a mutatók értéke változik. Bináris fák A bináris fákra vonatkozó feladatokat általában három reprezentációban lehet megoldani. A bináris fák szokásos rajza az ADS-szintnek felel meg. Az bináris fát lehet pointeresen ábrázolni, és ha elég sok csúcs van benne a magasságához képest, akkor el lehet tömbben is helyezni. (Szokásos módon ennél kicsit többet követelünk meg: az aritmetikai ábrázolást akkor alkalmazzuk, ha a fa teljes, vagy majdnem teljes és balra tömörített.) A következ feladatokat általában rekurzív algoritmussal lehet természetes módon megoldani. 1. Bizonyítsuk be, hogy ha egy teljes bináris fát szintfolytonosan elhelyezünk egy (egydimenziós) tömbben, akkor minden bels c csúcs bal gyerekének indexe kétszerese a szül indexének (a jobb gyerek indexe pedig még 1-gyel nagyobb): ind(bal(c)) = 2*ind(c) ind(jobb(c)) = 2*ind(c)+1 (Hogyan általánosítható a feladat tetsz leges r-áris fákra?) 2. Adjuk meg a bináris fák preorder, inorder és postorder bejárásának rekurzív algoritmusát; mindegyiket egy másik reprezentációban. 3. Írjunk olyan iteratív algoritmust, amely egy sor adatszerkezet felhasználásával megvalósítja egy teljes bináris fa szintfolytonos bejárását. 4. Készítsünk olyan algoritmust, amelyik megszámolja egy bináris fában a a) csúcsokat b) leveleket. 5. Adjunk olyan eljárást, amelyik megszámolja egy bináris fa adott szintjén lév a) csúcsokat b) leveleket. 6. Adott két bináris fa. Döntsük el, hogy azonos-e a szerkezetük. 11

7. Határozzuk meg egy bináris fa szintjeinek a számát, azaz a maximális szintszámot, amelyen levél található. (Az egyetlen pontból álló fára ez a szám 1, az üres fára pedig nulla.) 8. Adjuk meg egy bináris fa csúcsaiban (bels pontjaiban, leveleiben) szerepl értékek maximumát. 9. Határozzuk meg azt a legkisebb magasságot, amelyben egy megadott bináris fa már tartalmaz levelet. (Üres fára ez az érték legyen -1, egy pontból álló fára pedig nulla.) 10. Döntsük el egy bináris fáról, hogy piramis-e. (Minden bels csúcsban kisebb vagy egyenl érték található, mint a gyerekeiben.) 11. Adott egy kifejezésfa. Írjuk ki a kifejezés teljesen zárójelezett alakját. (Az operandusok nincsenek zárójelben.) 12. Adott egy kifejezés lengyel formája egy szekvenciális input sorozatban. Építsük fel a kifejezésfát. 13. Adott egy keres fa preorder bejárása egy tömbben. Építsük fel a fát. (A keres fa bármely bels csúcsában nagyobb vagy egyenl érték van, mint a csúcs alatti bal oldali részfa bármely csúcsában, és kisebb vagy egyenl, mint a jobb oldali részfájának bármely eleme.) 14. Adott egy teljes bináris fa szintfolytonos elhelyezése egy tömbben. Építsük fel a fát. 15. Egy bináris fában csupa különböz érték található. Adott a fa preorder és inorder bejárása egy-egy tömbben. Építsük fel a fát. Rendezés Ideiglenes feladatsor A "lassú" (O(n 2 )-es) rendezések: buborék, beszúró, max. kiv. rendezés már voltak. Az el adáson elhangzott/elhangzó rendezések, amelyek gyakorolhatók: - verseny rendezés (tournament sort) - kupac rendezés (heap sort) - gyors rendezés (quick sort) - összefésül rendezés (merge sort) 1. Játsszuk le a verseny rendezést 8 elemre az els 3 érték meghatározásáig. A teljes rendezés hány összehasonlítást igényel? Hányszor írunk be értéket a fa csúcsaiba ill. tömb elemeibe? (Az adott kezd kitöltés nem számít ide, viszont a "mínusz végtelen" beírása igen.) Végezzünk kupac rendezést a következ input adatsorra: 3, 1, 7, 6, 2, 10, 9, 8, 5, 4. Kell számú ábrán szemléltessük a fában elvégzett cseréket. Mutassuk be, hogy hogyan alakul ki a 12

kezd heap, majd kövessük az algoritmus m ködését addig, amíg a két legnagyobb elem a végs helyére kerül és többi elem újra heap-et alkot. Hány cserét hajt végre a kupac rendezés 7 elemre a legrosszabb esetben? Vessük össze ezt a számot a Keresés Egyéb 13