6. Elemi algoritmusok¶
Rendezési reláció
Egy olyan bináris rendezésről van szó, amely
reflexív,
tranzitív,
antiszimmetrikus.
Jellemzően teljes rendezést szoktunk vizsgálni, melyre teljesül a linearitás is.
A sorozatokról megköveteljük, hogy bármely két eleme összehasonlítható legyen.
Figyelem
Az, hogy egy sorozat elemein értelmezve van egy rendezési reláció, hogy vagy a sorozat rendezett, az két külön fogalom.
\(T\) tulajdonság
Jelölje \(A\) egy sorozat elemeinek a halmazát. \(T\) tulajdonság alatt egy olyan függvényt értünk, amely az \(A\) minden eleméhez hozzárendel egy logikai értéket.
Általános bináris művelet jelölése
Az algoritmusok egy részében egy konkrét bináris művelet helyett egy általánosat adunk meg, amelyet egy \(\square\) jellel jelölünk, például \(x \square y\).
Null elem
Főként inicializálásnál hasznos, hogy ha az adott művelethez meg tudjuk adni a null elemet, amelyre teljesül, hogy \(a \square Null = a\), bármilyen \(a \in A\) esetén.
Például:
\(A = \mathbb{R}, \square = +\) esetén \(Null = 0\).
\(A = \mathbb{R}, \square = \cdot\) esetén \(Null = 1\).
\(A = S, \square = \bullet\) esetében \(Null = ''\) (üres sztring, \(\varepsilon\)).
Elemi algoritmusok¶
Sorozatszámítás¶
A sorozat értékeit egy értékben „összesíti”.
Szokás még aggregációnak, redukciónak is nevezni.
\(\rhd\) Adjuk meg a szumma, produktum és a szövegek összefűzésének esetét!
Eldöntés¶
Egy sorozat elemeit vizsgáljuk meg, hogy teljesül-e rájuk valamilyen \(T\) tulajdonság.
Tulajdonképpen 2 algoritmusról van szó, amelyeket együtt érdemes említeni.
Létezik a sorozatban \(T\) tulajdonságú elem?
A sorozat minden eleme \(T\) tulajdonságú?
Kiválasztás¶
Egy \(T\) tulajdonságú elemet keres meg a sorozatban.
Az elem értékét, vagy indexét is visszaadhatja. (Az index esetünkben informatívabb, ezért itt most azt fogjuk visszaadni.)
Feltételezzük, hogy biztosan van \(T\) tulajdonságú elem a sorozatban.
Lineáris keresés¶
Az elem létezésének vizsgálatát és indexének a keresését kombinálja.
Megszámlálás¶
A sorozatban a \(T\) tulajdonságú elemek számát adja vissza.
Maximum kiválasztás¶
Feltételezzük, hogy a sorozat elemein értelmezve van egy teljes rendezés.
A maximális értékű elem indexével térünk vissza.
Feltételezzük, hogy a sorozatnak legalább egy eleme van.
\(\rhd\) Hogy ha több maximális értékű elem is van, akkor melyik indexe kerül visszaadásra?
\(\rhd\) Hogyan kezelhető az üres sorozatok esete?
\(\rhd\) Hasonlóképpen adjuk meg a minimum számítását is!
Másolás¶
A bemeneti sorozatot transzformálást követően egy kimeneti sorozatba másolja át.
A transzformációt egy \(f: A \rightarrow B\) függvény formájában adhatjuk meg.
Kiválogatás¶
A bemeneti sorozatból kigyűjtjük a \(T\) tulajdonságú elemeket a kimeneti sorozatba.
\(\rhd\) Hasonlóképpen adható algoritmus az indexek kigyűjtésére is.
Szétválogatás¶
A \(T\) és nem \(T\) tulajdonságú elemeket külön sorozatokba gyűjti.
Metszet¶
A két bemeneti sorozatról feltételezzük, hogy azokban csak különböző elemek vannak.
Tulajdonképpen a halmaz sorozat implementációját használjuk.
A bemenetként adott halmazok metszetét adjuk meg kimenetként.
Egyesítés¶
A két bemeneti sorozatról feltételezzük, hogy azokban csak különböző elemek vannak.
Tulajdonképpen a halmaz sorozat implementációját használjuk.
A bemenetként adott halmazok unióját adjuk meg kimenetként.
Összefuttatás¶
Két szigorúan monoton növekvő sorozatot egy harmadik rendezett sorozatba futtatunk/fűzünk össze.
Iteráció és rekurzió¶
Amennyiben egy problémát vissza tudunk vezetni egy azonos jellegű, de kisebb méretű problémára, akkor használhatunk rekurziót.
Faktoriális számítása¶
Rekurzív változat:
Fibonacci számsorozat¶
A Fibonacci sorozat \(n\)-edik elemét szeretnénk kiszámolni.
Rekurzív változat:
Bináris keresés¶
Feltételezzük, hogy van egy rendezett sorozatunk.
A lineáris kereséshez hasonlóan egy elemet szeretnénk megkeresni a sorozatban.
Kérdések¶
Hogyan írható fel a halmaz különbség, mint algoritmus?
Hogyan írható fel a szimmetrikus differencia képzés, mint algoritmus?
Hogyan írható fel a faktoriális számítása iteratív alakban?
Hogyan írható fel az \(n.\) Fibonacci szám kiszámítása iteratív alakban?
Hogyan írható fel a bináris keresés iteratív alakban?
Feladatok¶
Pszeudókód, folyamatábra¶
A következő feladatokat oldjuk meg a pszeudókód felírásával és a folyamatábra felrajzolásával! (Minden esetben egy-egy procedúrát adjunk meg!)
Cseréljük ki két változó értékét!
Számoljuk meg egy sorozatban a páros számok darabszámát!
Számoljuk ki egy sorozatban a páratlan számok összegét!
Határozzuk meg a negatív számok maximumát!
Vizsgáljuk meg, hogy egy sorozat tartalmaz-e egy bizonyos elemet!
Vizsgáljuk meg, hogy egy sorozat rendezett-e!
Ellenőrizzük, hogy egy sorozat minden eleme egyedi!
Egy sorozatból gyűjtsük ki azon elemeket, amelyek megegyeznek az indexükkel!
Számoljuk meg, hogy egy bináris vektorban mennyi 0 és 1 érték van!
Két azonos hosszúságú bemeneti sorozatot fűzzünk össze úgy, hogy az első sorozat elemei a páratlan, a második sorozat elemei a páros indexekre kerüljenek.
Rekurzív függvények, procedúrák¶
Adottak a következő függvények!
Számítsuk ki az \(f(30)\) és \(g(5)\) értékeket!
Számítsuk ki az \(\binom{5}{3}\) értékét!
Használjuk fel hozzá a következő rekurzív összefüggést!
Adjuk meg a procedúra pszeudó kódját, folyamatábráját! Ábrázoljuk a rekurzív hívási fát!