Professional Documents
Culture Documents
Algo Lényeg v4.0 Kibővitett
Algo Lényeg v4.0 Kibővitett
Algo Lényeg v4.0 Kibővitett
1. Összegzés tétele
• Kétoperandusú művelet
2. Megszámlálás tétele
• Ha az aktuális elem T tulajdonságú, akkor db++;
3. Kiválogatás tétele
• Ha az A sorozat aktuális eleme T tulajdonságú, akkor azt hozzáadjuk a B[db] indexhez.
4. Minimum és maximum kiválasztás tétele (érték és hely)
A. Érték meghatározás
B. Hely
Kereső algoritmusok:
1. Eldöntés
• Ha van a sorozatban T tulajdonságú elem, akkor a visszatérési érték igaz.
2. Lineáris keresés
• Eldöntésnél nem használtunk ki minden információt, amely az algoritmus végrehajtása során keletkezett.
Ha a ciklusból azért léptünk ki, mert T-tulajdonságú elemet találtunk, az I értéke őrzi annak előfordulási
helyét. Ennek értékét adja vissza a lineáris keresés algoritmusa.
3. Kiválasztás
• Biztosan tudjuk, hogy a sorozatnak van T tulajdonságú eleme. Az algoritmus kimenete a T tulajdonságú
elem helye.
• Mivel a sorozatnak van T tulajdonságú eleme, így biztosan találunk egyet, mielőtt az I>N teljesülne, ezért
annak vizsgálata, hogy I értékével sorozatbeli elemre hivatkozunk-e, szükségtelen.
4. Strázsás keresés
• A kiválasztás tételének tapasztalatait fölhasználva a lineáris keresést hatékonyabbá tehetjük
• Tároljunk az adatszerkezet (n + 1) pozícióján egy T-tulajdonságú elemet. Így ha az eredeti sorozat nem is,
de az úgynevezett strázsaelemmel kibővített sorozat biztosan tartalmazza a keresett elemet. Ami a strázsás
keresés hatékonyságát illeti, a tapasztalat valóban azt mutatja, hogy a futási ideje megközelítőleg 2/3 -a a
lineáris keresésének.
Rendező algoritmusok:
1. Közvetlen kiválasztás
• Az algoritmus a sorozat J pozíciójára eljuttat egy elemet, de ha a későbbiekben ennél kisebbet talál,
azt ezzel ismét megcseréli. Mire a megfelelő elemet sikerül a helyére juttatni addig több fölösleges
cserét is végre fogunk hajtani. A közvetlen kiválasztás hatékonyabb változata a minimum
kiválasztással történő rendezés.
2.
Rendezés minimum kiválasztással
• Ugyan annyi összehasonlítást végzünk, mit a közvetlen kiválasztásnál, de adatmozgatás szempontjából
kedvezőbb. Értékadások maximális száma 3 (n - 1). Az algoritmus tárigénye n + 1
3.
Buborékrendezés
• Az algoritmus először a sorozat elejétől kezdve minden elemet összehasonlít a rákövetkezőjével, és ha
a sorrendjük nem megfelelő, akkor meg is cseréli azokat. Ez a műveletsor n−1 összehasonlítás és
legfeljebb ugyanennyi csere árán biztosítja, hogy a sorozat legnagyobb eleme a sorozat végére
kerüljön. Ezt követően már csak – az utolsó elem figyelmen kívül hagyásával az első n − 1 elemmel kell
megismételnünk a műveletsort, miközben n − 2 összehasonlítást és legfeljebb ugyanennyi cserét
végzünk el. Ekkorra a sorozat második legnagyobb eleme került a végleges helyére. Hasonló módon a
sorozat többi eleme is végleges helyére „buborékoltatható”. Utolsóként a sorozat első két eleméből
álló részsorozatban végezve a műveletsort a második és az első elem is helyére kerül.
Megjegyzés: Mivel C#-ban 0-tól indexelünk, ezért az első for ciklust 1-től indítjuk és a tömb.Length-ig
futtatjuk. Egyébként OutOfRangeException-t kapunk.
Beszúró rendezés
4.
• A beszúró rendezés elve szerint mindig a következő elem helyét kell megkeresnünk egy már rendezett
részsorozatban.
• Ezt egy n elemű sorozat esetében n − 1-szer kell megtennünk, mert az első a1 rendezett sorozatnak
számít.
• A j-edik lépésben tehát a sorozat j+1-edik elemét szeretnénk a rendezett részsorozatban elhelyezni.
• Megkell keresni az aj+1 helyét egy már rendezett sorozatban és helyet kell neki biztosítanunk.
• ha aj < aj+1, akkor nem kell az aj -t föntebb „csúsztatni” mert a megfelelő helyen van
• ha aj+1 < a1, akkor pedig j számú elem mindegyikét egy-egy hellyel jobbra kell léptetni
• Ilyen módon fölszabadul a hely a beillesztendő elem számára a megfelelő helyen, és ekkor helyére
kerülhet az x-ben átmenetileg tárolt elem
Shell rendezés
5.
6. Összefuttatás
• A rendezett sorozatok feldolgozása során szükségessé válhat két rendezett sorozat elemeinek egy
rendezett sorozatban való egyesítése.
Verem és a sor:
Verem
LIFO: Last In First Out
A verem olyan homogén, szekvenciális adatszerkezet, amely esetében az adatszerkezetben tárolt elemek sorozatához
csak az egyik végénél férhetünk hozzá. Bővíthetjük a vermet egy újabb elemmel, ekkor azt mondjuk, hogy adatot
helyezünk a verem tetejére, vagy kiolvashatjuk a verem tetején lévő elemet. Ez tehát azt jelenti, hogy leghamarabb az
adatszerkezetben legutoljára elhelyezett elemhez férhetünk hozzá, illetve a benne legelőször elhelyezett adatot
olvashatjuk ki legutoljára
3. Amikor pedig operátor következik, akkor kiolvasunk a verem tetejéről két operandust és levégezzük közöttük
az operátor által kijelölt műveletet, amelynek az első operandusa a másodjára kiolvasott érték lesz, a második
operandus pedig az, amit elsőként olvastunk a veremből.
2. Végzárójel olvasása esetén megvizsgáljuk, hogy a verem tetejéről kiolvasott nyitózárójelnek ez lehet-e a párja.
Sor
FIFO: First In First Out
A sor szintén homogén és szekvenciális, de esetében a bővítés az elemek sorozatának egyik, míg az olvasás a másik
végén lehetséges. Az adatszerkezetbe elhelyezhetünk új elemet az egyik végén, de elem kiolvasására csak az
adatszerkezet másik végén van lehetőség. Ez azt eredményezi, hogy az adatszerkezetbe legelőször elhelyezett elem
olvasható ki leghamarabb, és a legutoljára beírt adathoz férhetünk hozzá legutoljára.
Egyszerű sor:
Egyszer használatos sor, ha elértük az adatszerkezet végét nem tudok bele többet tenni.
Léptető sor:
Előzőre megoldás, ha kiveszek egy elemet ,akkor minden elemet egyel lentebb lapátolok, az elején soha nem marad
üres és csak akkor teli, ha minden sor foglalt. Hiányossága, hogy ha kellően hosszú a sor, akkor túl sokat kell lapátolni,
minden egyes elem kiolvasásakor minden elemet egyel előre kell mozgatni, sok adatmozgatás.
Ciklikus sor:
Csak akkor telik meg, ha valóban megtelik, ha az elejéről veszek ki elemet, akkor oda rakok be ahonnan kivettem.
Buborék rendezés felhasználásával rendezd visszafelé az elemeket úgy, hogy az első elem az elejére a
második elem a végére kerüljön és igy tovább.
Kétirányú buborékrendezés: az egyik végéről a1, a3, a5... index növekvő elemek, mig a másik végéről ...a6,
a4, a2. index csökkenő elemek.
Tehát meg kell nézni, hogy az elem páros-e. ha nem, növekvő buborék rendezés az indexeken, ha páros
csökkenő buborék rendezés az indexeken.
Számold össze egy sorozatban, hogy a középső elemtől hány kisebb illetve nagyobb elem van. Úgy hogy az elemek
száma páratlan.
Megkeresed a k középső elemet (n div 2)+1. Ez után végig mész a cikluson úgy, hogy a középsőt kihagyod (2
ciklus, csak egyenlőtlenséget vizsgálsz stb.) és nagyonDarab és kisebbDarab érteket számolsz.
(megszámlálás). A feladatnál a sorozat elemei különbözőek, tehát elég kiszámolni a kisebbDB-ot, mert
nagyobbDB = N - kisebbDB -1;
Eljárás Megszamlalas(A:Sorozat,
Kissebb:Egész, Nagyobb: Egész)
I, J, K,KisDb, NagyDb: Egész;
Kozepso: Elemtip;
Algoritmus
K = N Div2 +1;
Kozepso <- A[K]
Ciklus I <- 1…K-1;
Ha A[I] < Kozepso Akkor
Kisdb <- KisDb + 1;
CVége;
Ciklus I <- K+1…N;
Ha A[I] < Kozepso Akkor
Kisdb <- KisDb + 1;
CVége;
NagyDb = N – KisDb -1;
Ha J != MaxI Akkor
C <- A[J];
A[J] <- A[MaxI];
A[MaxI] <- C;
Hvége
CVége;
EVége;
szétszórt. reprezentációjú adatszerkezet elemei elvileg a tár tetszőleges részén lehetnek, az egyes elemek eléréséhez
szükséges információt a többi elem tárolja.
2.5.3. Leírónyelv
Ennek az eszköznek a segítségével programozási nyelvektől függetlenül, még-
is azokhoz igen hasonló formában adhatjuk meg algoritmusainkat a konkrét programozási nyelvek kötöttségei nélkül.
2.5.4. Vezérlési szerkezetek
2.5.5. Szekvencia
4. Keresés, rendezés
Az alábbiakon kívül természetesen számtalan kapcsolat van a matematika és
az informatika tudománya között, hiszen az informatika minden részterüle-
tének matematikailag megalapozottnak kell lennie. A továbbiakban néhány,
elsősorban az algoritmizálás szempontjából fontos matematikai fogalmat, is-
meretet tárgyalunk az informatika szempontjából praktikus megközelítés-
ben.
4.1. Sorozat
a:N→H
halmaz
komplementere: A := {x|x /∈ A}
két halmaz
uniója: A ∪ B := {x|x ∈ A ∨ x ∈ B}
két halmaz
metszete: A ∩ B := {x|x ∈ A ∧ x ∈ B}
két halmaz
különbsége: A \ B := {x|x ∈ A ∧ x /∈ B}
részhalmaz: A ⊂ B, ha ∀x ∈ A esetén x ∈ B
halmaz
elemszáma: |A|
üres halmaz: ∅, |∅| = 0 (üres halmaz elemszáma nulla)
diszjunkt
halmazok: A ∩ B = ∅ (metszetük az üres halmaz).