170 likes | 307 Views
Nevezetes algoritmusok. Lineáris keresés A legalapvetőbb keresési algoritmus. Adott elemet keresünk egy halmazban úgy, hogy minden elemet végignézünk, amíg a keresettet meg nem találjuk.
E N D
Lineáris keresés A legalapvetőbb keresési algoritmus. Adott elemet keresünk egy halmazban úgy, hogy minden elemet végignézünk, amíg a keresettet meg nem találjuk. Legrosszabb eset: A halmaz minden elemével hasonlítunk, ez n összehason-lítást jelent. Átlagban: n/2+1 keresés. Ha listában vagy külső táras állomány-ban kell rendeznünk. (Ekkor nehézkes a lista középső tagjának vizsgálata.)
Bináris keresés Rendezett halmazban keresünk. A keresett elemet a középső elemhez hasonlítjuk. Ha egyezik, akkor megtaláltuk; ha nem, akkor abban a felében folytatjuk a keresést, amelyet a keresett érték kijelöl: ha a keresett érték kisebb, mint a középső elem, akkor az első felében, egyébként a másodikban. Az eljárást ilyen módon folytatjuk tovább. [Log2n]+1 összehasonlítás. Ha a középső elem vizsgálata nem okoz nehézséget. Pl.: tömbben tároljuk.
Beszúrás Van egy n elemű rendezett halmazunk. Be akarunk szúrni egy n+1-edik elemet. Egyik lehetőség: végigszaladunk a halmazon, és betesszük a beszúrandó elemet az elé az elem elé, ami már nem előzi meg. Általában n/2, de a legrosszabb esetben n összehasonlításra van szükség. Másik lehetőség: a kérdéses elemet a középső elemmel hasonlítjuk össze. Ha az új elem megelőzi a középsőt, akkor a halmaz első felében keressük a helyét a továbbiakban, stb. A lépésszám log2n, vagy az erre következő első egész szám, azaz [log2n], ha n nem 2 hatványa.
Beszúrásos rendezés A rendezés során sorrendbeli hibát keresünk a halmazban. Ennek során használhatunk lineáris (n(n-1)/2 összehasonlítás), illetve bináris keresést (n-1k=1log2(k+1) összehasonlítás). A kialakult sorrendtől eltérő helyet megjegyezzük, az ott lévő elemet elmentjük, majd addig keresünk attól visszafelé, amíg nála nagyobbat nem találunk, az elé kell majd beszúrnunk. Amikor a helyet megtaláltuk, akkor a közbeeső elemeket feljebb tolva, az imént kiemelt elemet a felszabaduló helyre illesztjük. Túl sok mozgatást igényel.
Shell rendezés A beszúrásos módszer lépésenként finomított változata. A halmaznak csak minden d-edik elemét vizsgáljuk, azaz d lépésközzel végezzük el a beszúrásos rendezést. Ezután csökkentjük a lépésközt, és úgy végezzük el a rendezést. A folyamat addig tart, amíg a lépésköz 1 nem lesz.
Összefésülés Van két n elemű halmazunk: (a1, ... , an) és (b1, ... ,bn). Ezeket kell egyesíteni. Hasonlítsuk össze az b1 elemet rendre az a1, a2, ... elemekkel. Beszúrjuk b1-et az elé az ai elé, amelyet közvetlenül megelőz. Ettől az ai-től folytatjuk tovább b2-re, stb. Legfeljebb 2n-1 összehasonlításra van szükség.
Minimum (maximum) elven alapuló rendezés Egy adott részhalmazban (kezdetben a teljes halmaz) megkeressük a legkisebb (legnagyobb) elemet és ezt tesszük az első helyre. A következő lépésben a második elemtől kezdve vizsgáljuk és ismét a legkisebb (legnagyobb) elemet visszük előre, stb. A mindenkori legkisebb elem keresése lineáris kereséssel történik.
Buborékrendezés Növekvő sorrend: halmaz elejéről indulva rendre összehasonlítjuk a szomszédos elemeket, s ha a kisebb van hátrább, megcseréljük őket. Az eljárást mindaddig folytatjuk, amíg a rendezettség ki nem alakul. (Csökkenő sorrend fordítva!) Összehasonlítások száma n(n-1)/2. Kis sorozatok (max. 10-20 elemű) esetén használható, egyébként sok összehasonlítást igényel. Módosított buborékrendezés Az alapelv hasonló, de a pásztázás többirányú és váltakozó.
Gyorsrendezés (quick-sort) Kiválasztjuk a halmaz tetszőleges elemét. Ezt nevezzük alapelemnek, mert ehhez viszonyítjuk a többit. Először balról lépegetünk addig, amíg ennél az alapelemnél csupa kisebbet találunk. Ha egy nagyobb vagy egyenlő elemhez érünk, jobbról vizsgálódunk, és keressük az alapelemnél nem nagyobb elemet. Ha megtaláltuk, kicseréljük a kettőt és a következő, eggyel nagyobb, illetve kisebb elemtől kezdjük a keresést és a cserét.
Kupac A fa olyan gráf, amely körmentes, azaz bármely két csúcsa között pontosan egy élsorozaton át lehet eljutni. A bináris fa olyan fa, amelynek csúcspontjaiból maximum 2 részfa nyílik (azaz fokszáma 2). A kupac egy olyan teljes bináris fa, amelyben egy tetszőleges csúcsban lévő érték nem lehet nagyobb a fiaiban lévő elemeknél.
Egy f gyökerű részfa kupaccá alakítása a következő módon történik (a, az f-ben tárolt érték, f1 és f2 f fiai, a bennük tárolt érték a1,a2): Felszivárog(f){Ha min(a1,a2)<a, akkor min{a1,a2} és a helyet cserél.Ha az a elem ai-vel cserélt helyet, akkor felszivárog(fi)} A következő eljárás az egész fát kupaccá teszi: Kupacépítés(f){Az f fa v csúcsaira lentről felfelé, jobbról balra felszivárog(v)} A kupacra két alapművelet jellemző: 1. a legkisebb elem törlése, amely a fa gyökerében van;2. új elem hozzáadása a kupachoz.
Részfa: t részfája a-nak, ha a a gyökere, azaz közvetlen megelőző eleme t-nek, vagy t részfája a valamely részfájának. Elágazásszám: közvetlen részfák száma. Fokszám: egy fa fokszáma pontjai max. elágazásszámával egyezik meg (a bináris fák fokszáma ezért 2). Szülő/ős: egy fában, a gyökeret kivéve valamennyi csomópontnak egyedi szülője van, amelyet megelőző csomópontnak nevezünk. (N őse L-nek, ha L közvetlen leszármazottja N-nek).
Leszármazott (gyermek):az L csomópontot akkor nevezzük az N csomópont leszármazottjának, ha L az N-et közvetlenül követő elem, vagyis L az N gyermeke. Megkülönböztethetünk bal, illetve jobb oldali gyermekeket. A gyermekek egymásnak testvérei. Szukcesszor: a fa egy elemének jobb/bal oldali szukcesszora az elemből kiinduló jobb/bal részfa gyökéreleme, amennyiben a részfa nem üres. Él: egy csomópontból az azt követőbe húzott vonalat élnek nevezzük
Kupacrendezés Bemenet a rendezendő sorozatot tartalmazó A[1..n] tömb. Először kupacot építünk, utána n-szer kivesszük a legkisebb elemet a kupacból, és újra kupaccá alakítunk. Az eljárás nem csökkenő sorrendben adja vissza az elemeket. A kupacrendezés a leggyorsabb ismert rendező módszer.
Ládarendezés A módszer akkor hasznos, ha a lehetséges elemek tartománya a rendezendő elemek számához képest nem túl nagy. Tegyük fel, hogy az A[1..n] tömböt szeretnénk rendezni, és tudjuk, hogy A elemei az m elemű U halmazból kerülnek ki. Ekkor lefoglalhatunk egy U elemeivel indexelt B tömböt. Ennek elemei - a ládák - U-beli elemek listái lesznek. Kezdetben minden láda üres. Az eljárás első fázisában végigolvassuk az A tömböt, és az s=A[i] elemet a B[s] lista végére fűzzük. A második fázisban azelejéről a végéig növő sorrendben végigmegyünk B-n és a B[i] listák tartalmát visszaírjuk A-ba.A módszer akkor hasznos, ha a lehetséges elemtípusok száma nem túl nagy a rendezendő elemek számához képest.