Programozási tételek Mik is ezek? A programozásban előforduló típusfeladatokra adnak általános megoldást Az adott feladattípusnak matematikailag bizonyíthatóan helyes és a legoptimálisabb megoldását adják Miért most tanuljuk? A tételek többsége több bemenő adattal végez el valamilyen átalakítást, és ehhez a tömb adatszerkezet ismerete szükséges
Programozási tételek Csoportosításuk Aszerint csoportosítjuk őket, hogy mi a bemenő és kimenő adatuk, eszerint megkülönböztetünk: adatsorozathoz egy adatot rendelő tételeket; adatsorozathoz adatsorozatot rendelő tételeket
Programozási tételek Adatsorozathoz egy értéket rendelő tételek Sorozatszámítás tétel Bemenő adat: egy N elemű adatsorozat (A tömb) Kimenő adat: Egy érték, amelynek kiszámításához az adatsorozat minden elemét felhasználjuk Szükséges hozzá még egy kiszámítási szabály, amely megmondja, hogy az értéket hogy kapjuk meg a sorozat elemeiből (F) Példák: összeg, számtani közép (átlag), mértani közép, négyzetösszeg, harmonikus közép, stb.
Programozási tételek Adatsorozathoz egy értéket rendelő tételek Sorozatszámítás tétel Általános algoritmusa (összegre megírva): Eljárás Sorozatszámítás Összeg:=0 Ciklus i:=1-től N-ig Összeg:=Összeg+A(i) Ciklus vége Eljárás vége
Programozási tételek Adatsorozathoz egy értéket rendelő tételek Eldöntés tétel Bemenő adat: egy N elemű adatsorozat (A tömb) Kimenő adat: Egy logikai érték, amely megmondja, hogy egy adott T tulajdonságú elem előfordul-e az adatsorozatban Példák: van-e páros, páratlan, hárommal osztható, vagy olyan elem, aminek az előző eleme páratlan, stb. (tetszőlegesen bonyolultat ki lehet találni)
Programozási tételek Adatsorozathoz egy értéket rendelő tételek Eldöntés tétel Általános algoritmusa: Eljárás Eldöntés i:=1 Ciklus amíg i<=N és A[i] nem T tulajdonságú i:=i+1 Ciklus vége VAN:=i<=N Eljárás vége
Programozási tételek Adatsorozathoz egy értéket rendelő tételek Kiválasztás tétel Bemenő adat: egy N elemű adatsorozat (A tömb) Kimenő adat: Egy adott T tulajdonságú elem sorszáma Előfeltétel: VAN T tulajdonságú elem az adatsorozatban Példák: számelméleti feladatok, amelyekhez nem kell tömb: keressük meg egy pozitív természetes szám legkisebb prímosztóját, stb.
Kitekintés: Programozási tételek Adatsorozathoz egy értéket rendelő tételek Kiválasztás tétel Általános algoritmusa: Eljárás Kiválasztás i:=1 Ciklus amíg A[i] nem T tulajdonságú i:=i+1 Ciklus vége SORSZÁM:=i Eljárás vége
Programozási tételek Adatsorozathoz egy értéket rendelő tételek (Lineáris) keresés tétel Bemenő adat: egy N elemű adatsorozat (A tömb) Kimenő adat: Egy adott T tulajdonságú elem sorszáma, és egy logikai érték, amely megmondja, volt-e T tulajdonságú elem Példák: tömbben páros elem keresése, olyan elem keresése, amely két szomszédjának számtani közepe, stb.
Programozási tételek Adatsorozathoz egy értéket rendelő tételek (Lineáris) keresés tétel Általános algoritmusa: Eljárás Keresés i:=1 Ciklus amíg i<=N és A[i] nem T tulajdonságú i:=i+1 Ciklus vége VAN:=i<=N Ha VAN akkor SORSZÁM:=i Eljárás vége
Programozási tételek Adatsorozathoz egy értéket rendelő tételek Megszámolás tétel Bemenő adat: egy N elemű adatsorozat (A tömb) Kimenő adat: Annak darabszáma, hogy egy adott T tulajdonságú elemből mennyi van Példák: tömbben páros elemek megszámolása, karakterláncban magánhangzó számolás, stb.
Programozási tételek Adatsorozathoz egy értéket rendelő tételek Megszámolás tétel Általános algoritmusa: Eljárás Megszámolás DB:=0 Ciklus i:=1-től N-ig Ha A(i) T tulajdonságú, akkor DB:=DB+1 Ciklus vége Eljárás vége
Programozási tételek Adatsorozathoz egy értéket rendelő tételek Maximum(minimum)kiválasztás tétel Bemenő adat: egy N elemű adatsorozat (A tömb) Szükséges hozzá egy olyan összehasonlíthatósági tulajdonság, amely szerint a kisebb és nagyobb reláció értelmezve van Kimenő adat: Valamilyen szempontból a legnagyobb(legkisebb) elem értéke és/vagy sorszáma
Programozási tételek Adatsorozathoz egy értéket rendelő tételek Maximum(minimum)kiválasztás tétel Általános algoritmusa (1. változat): Eljárás Maximumkiválasztás MAXIMUM:=A(1) INDEX:=1 Ciklus i:=2-től N-ig Ha A(i)>MAXIMUM akkor MAXIMUM:=A(i) INDEX:=i Ciklus vége Eljárás vége
Programozási tételek Adatsorozathoz egy értéket rendelő tételek Maximum(minimum)kiválasztás tétel Általános algoritmusa (2. változat): Eljárás Maximumkiválasztás INDEX:=1 Ciklus i:=2-től N-ig Ha A(i)>A(INDEX) akkor INDEX:=i Ciklus vége MAXIMUM:=A(INDEX) Eljárás vége
Programozási tételek Adatsorozathoz adatsorozatot rendelő tételek Kiválogatás tétel Bemenő adat: egy N elemű adatsorozat (A tömb) Kimenő adat: Az összes T tulajdonságú elem egy új tömbben (B) A kimenő adatok tárolásához ugyanakkora tömb szükséges, mint a bemenő adatokhoz, mert nem tudjuk előre, hány T tulajdonságú elem lesz Példák: válogassuk ki a párosakat, prímeket, stb. egy számsorozatból.
Programozási tételek Adatsorozathoz adatsorozatot rendelő tételek Kiválogatás tétel Általános algoritmusa Eljárás Kiválogatás j:=0 Ciklus i:=1-től N-ig Ha A(i) T tulajdonságú akkor j:=j+1 B(j):=A(i) Ciklus vége Eljárás vége
Programozási tételek Adatsorozathoz adatsorozatot rendelő tételek Szétválogatás tétel Bemenő adat: egy N elemű adatsorozat (A tömb) Kimenő adat: Az összes T tulajdonságú elem egy új tömbben (B), és egy másikban (C) az összes nem T tulajdonságú elem A kimenő adatok tárolásához ugyanakkora tömbök szükségesek, mint a bemenő adatokhoz, mert nem tudjuk előre, hány T tulajdonságú elem lesz Példák: válogassuk szét a párosakat és nem párosokat, prímeket és nem prímeket, stb. egy számsorozatból.
Programozási tételek Adatsorozathoz adatsorozatot rendelő tételek Szétválogatás tétel Általános algoritmusa Eljárás Kiválogatás j:=0 k:=0 Ciklus i:=1-től N-ig Ha A(i) T tulajdonságú akkor j:=j+1 B(j):=A(i) egyébként k:=k+1 C(k):=A(i) Elágazás vége Ciklus vége Eljárás vége
Programozási tételek Adatsorozathoz adatsorozatot rendelő tételek Metszet Bemenő adat: két adatsorozat, egy N elemű (A tömb), és egy M elemű (B), amelyek azonos elemtípusúak Kimenő adat: Az összes olyan elem egy új tömbben (C), amely mindkét tömbben előfordul A kimenő adatok tárolásához szükséges tömb mérete N és M közül a kisebb töm elemszámával egyezik meg A feladat átfogalmazható: válogassuk ki A azon elemeit, amelyek benne vannak B-ben, vagyis két elemi tétel összeépítésével megoldható Példák: számok közös osztóinak megadása, két ember határidőnaplójának ismeretében azon esték meghatározása, amikor el tudnak menni együtt vacsorázni
Programozási tételek Adatsorozathoz adatsorozatot rendelő tételek Unió Bemenő adat: két adatsorozat, egy N elemű (A tömb), és egy M elemű (B), amelyek azonos elemtípusúak Kimenő adat: Az összes olyan elem egy új tömbben (C), amely legalább az egyik tömbben előfordul A kimenő adatok tárolásához szükséges tömb mérete N+M A feladat átfogalmazható: másoljuk le A elemeit, majd válogassuk ki B-ből azokat az elemeket, amelyek nincsenek benne A-ban. Vagyis egy sorozatszámítás, majd egy kiválogatás, ami egy eldöntést tartalmaz. Példák: számok közös osztóinak megadása, két ember határidőnaplójának ismeretében azon esték meghatározása, amikor el tudnak menni együtt vacsorázni
Programozási tételek Rendezések Az alapfeladat: N elemű adatsorozat (A tömb) nagyság szerinti sorba rendezése(szükséges, hogy létezzen a <,<= reláció a sorozat elemtípusára) Léteznek olyan módszerek, amelyek új tömbbe rendezik az adatsorozatot, vagy létrehoznak egy számsorozatot, amely leírja a sorrendet (indexelés) A következő algoritmusok azonban helyben rendeznek, a rendezett sorozat magában az eredeti tömbben keletkezik Minden esetben, ha két elemet ezek során fel kell cserélni, a következő eljárást alkalmazzuk: Eljárás Csere(A,B) Seged:=A A:=B B:=Seged Eljárás vége
Programozási tételek Rendezések Egyszerű cserés rendezés Alapelv: hasonlítsuk össze a sorozat első elemét sorban minden utána következő elemmel, és ha szükséges (nála kisebbet találtunk), akkor cseréljünk. Ezzel elérjük, hogy a sorozat legkisebb eleme az első helyre kerül. Folytassuk ugyanezt a módszert a második, harmadik…stb. elemekre A rendezéseket aszerint jellemezzük, hogy mekkora a helyfoglalása a memóriában, hány összehasonlítás és hány mozgatás szükséges hozzá. Ezek a jellemzők az egyszerű cserés rendezésre: Helyfoglalás: N+1 elem Összehasonlítások száma: N*(N-1)/2 (N*N-nel arányos) Mozgatások száma: 0 – 3*N*(N-1)/2, függ az eredeti sorozat rendezettségétől
Programozási tételek Rendezések Egyszerű cserés rendezés Általános algoritmusa Eljárás Egyszerű cserés rendezés Ciklus i:=1-től N-1-ig Ciklus j:=i+1-től N-ig Ha A(i)>A(j) akkor Csere(A(i),A(j)) Ciklus vége Eljárás vége
Programozási tételek Rendezések Minimumkiválasztásos rendezés Az előző módszer hátránya a sok felesleges csere. Ennek csökkentésére új elv: keressük meg a sorozat legkisebb elemét, majd cseréljük fel az első elemmel Ezután keressük meg a második elemmel kezdődő sorozat legkisebb elemét, és ezt cseréljük fel a második elemmel Helyfoglalás: N+1 elem Összehasonlítások száma: N*(N-1)/2 (N*N-nel arányos) Mozgatások száma: 3*(N-1), nem függ az eredeti sorozat rendezettségétől
Programozási tételek Rendezések Minimumkiválasztásos rendezés Általános algoritmusa Eljárás Minimumkiválasztásos rendezés Ciklus i:=1-től N-1-ig MIN:=I Ciklus j:=i+1-től N-ig Ha A(MIN)>A(j) akkor MIN:=j Ciklus vége Csere(A(i),A(MIN) Eljárás vége
Programozási tételek Rendezések Buborékrendezés Új alapelv: mindig szomszédos elemeket cseréljünk Először induljunk az első elemtől, és csináljuk a szomszédok hasonlítását a sorozat végéig. Ekkor a legnagyobb elem az utolsó helyre kerül, a többi pedig a helye felé mozdul el ( a kisebbek az eleje, a nagyobbak a vége felé, innen a buborékmódszer elnevezés) Ezután ismételjük meg a cseréket, de most már csak az elsőtől az utolsó előtti elemig, mert az utolsó már jó helyen van, és így tovább Helyfoglalás: N+1 elem Összehasonlítások száma: N*(N-1)/2 (N*N-nel arányos) Mozgatások száma: 0 -3*N*(N-1), függ az eredeti sorozat rendezettségétől
Programozási tételek Rendezések Buborékrendezés Általános algoritmusa Eljárás Buborékrendezés Ciklus i:=N-től 2-ig -1-esével Ciklus j:=1-től i-1-ig Ha A(j)>A(j+1) akkor Csere(A(j,A(j+1)) Ciklus vége Eljárás vége
Programozási tételek Rendezések Beillesztéses rendezés Új alapelv: egyetlen elem mindig rendezett, és ha van egy rendezett részsorozatunk, abba illesszük be a megfelelő helyre az aktuális elemet Ez a beillesztés úgy működik, hogy az útban lévő elemeket a sorozat vége felé léptetjük Helyfoglalás: N+1 elem Összehasonlítások száma: 0 - N*(N-1)/2 (N*N- nel arányos, függ a rendezettségtől) Mozgatások száma: 0 -3*N*(N-1), függ az eredeti sorozat rendezettségétől
Programozási tételek Rendezések Beillesztéses rendezés Általános algoritmusa Eljárás Beillesztéses rendezés Ciklus i:=2-től N-ig j:=i-1 Ciklus amíg j>0 és A(j)>A(j+1) Csere(A(j,A(j+1)) j:=j-1 Ciklus vége Eljárás vége
Programozási tételek Keresések Ebben a részben speciális keresési feladatokkal foglalkozunk Már tanultuk a lineáris keresést, ami rendezetlen sorozatban keres Vannak azonban rendezett sorozatra ennél hatékonyabb keresési módszerek, illetve van olyan keresés is, amelynek nem egy elem, hanem egy adatsorozat az eredménye
Programozási tételek Keresések Keresés rendezett sorozatban Bináris, vagy logaritmikus keresésnek is nevezik Elve: az intervallumfelezés Megvizsgáljuk a sorozat középső elemét: ha a keresett elem ennél nagyobb, akkor a továbbiakban csak a sorozat második felével foglalkozunk, ha nem, akkor az elejével Bemenő adat: egy N elemű RENDEZETT adatsorozat (A tömb) (feltételeztük, hogy az elemek valamilyen tulajdonság alapján sorba rendezhetők) Kimenő adat: Egy Y értékkel megegyező elem sorszáma (SORSZAM), és egy logikai érték, amely megmondja, volt-e Y értékkel megegyező elem (VAN)
Programozási tételek Keresések Visszalépéses keresés (back-track) Ez nem igazi keresés: itt egy speciális feladat megoldását keressük Ez a megoldás minden esetben maga is egy sorozat E sorozat minden egyes tagját valamilyen sorozatból kell kikeresni, de az egyes keresések összefüggnek egymással Minden egyes új választás az összes korábbitól függhet, a későbbiektől azonban nem (ezt egy speciális F függvénnyel írjuk le) Egyes esetekben a választás a saját jellemzőjétől is függhet (ezt egy speciális G függvénnyel írjuk majd le)
Programozási tételek Keresések Visszalépéses keresés (back-track) Példafeladatok: Helyezzünk el egy 8x8-as sakktáblán 8 vezért úgy, hogy egyik se üsse a másikat! (lehet más bábu is) Egy vállalat N db munkára szeretne munkásokat felvenni. Jelentkezik N db munkás, mindegyik megadja, hogy milyen munkát tudna elvégezni. Osszuk el közöttük a munkát úgy, hogy minden munka el legyen végezve, és mindenkinek jusson munka! N bolt M pékségtől rendel kenyeret. Ismerjük a boltok kenyérigényét, a pékségek sütési kapacitását, valamint azt, hogy melyik bolt melyik pékséggel áll kapcsolatban. Adjuk meg, melyik bolt pékségből rendelje a kenyeret, ha minden bolt csak egy pékségtől rendelhet!
Programozási tételek Keresések Visszalépéses keresés (back-track) Általános algoritmusa: A használt változók: N:egész [a sorozatok száma, pl. a 8 oszlop a sakktáblán] M:tömb(1..N:egész) [az egyes sorozatok elemszáma, pl. a sakktábla oszlopainak hossza] X:tömb(1..N:egész) [a választott elemek sorszáma, pl. a mező sorszáma, ahova az adott oszlopban elhelyezzük a vezért] VAN:logikai [akkor igaz, ha minden sorozatból megtaláltuk a megfelelőt
Programozási tételek Keresések Visszalépéses keresés (back-track) Általános algoritmusa: Az algoritmus megírásához három eljárást kell megírnunk: A legfelső szinten megkeressük az i. sorozatból a megfelelő elemet. Ha találtunk ilyet, akkor továbblépünk az i+1. sorozatra, ha nem találtunk, akkor visszalépünk az i-1.-re, és abban keresünk tovább Az i. sorozatban való keresés egy lineáris keresés, külön eljárásban Lesz még egy, a feladattól függő RosszEset függvény, amely azt írja le, hogy mi a nem megfelelő eset (pl. mikor ütik egymást a királynők)
Programozási tételek Keresések Visszalépéses keresés (back-track) Általános algoritmusa: Eljárás BackTrack(N,M,X,VAN) i:=1 X(1..N):=(0,..,0) {0 jelzi, hogy az adott sorozatban nem találtunk még megfelelőt} Ciklus amíg i>=1 és i<=N JóEsetKeresés(M,X,i,melyik,VAN) {a melyik változóban adja vissza, hogy az i. sorozatban melyik a megfelelő} Ha VAN akkor X(i):=melyik i:=i+1 {előre lépünk} egyébként X(I):=0 i:=i-1 {visszalépünk} Elágazás vége Eljárás vége
Programozási tételek Keresések Visszalépéses keresés (back-track) Általános algoritmusa: Eljárás JóEsetKeresés(M,X,i,melyik,VAN) melyik :=X(i)+1 Ciklus amíg melyik<=M(i) és RosszEset(i,X,melyik) és nem G(i,X(i) melyik:=melyik+1 Ciklus vége VAN:=(melyik<=M(I)) Eljárás vége Függvény RosszEset(i,X,melyik):Logikai j:=1 Ciklus amíg j<i és F(i, melyik,j,X(j)) j:=j+1 RosszEset:=(j<i) Függvény vége