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

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

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Programozási segédlet

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

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..

PROGRAMOZÁSI TÉTELEK

1. Feladat: beolvas két számot úgy, hogy a-ba kerüljön a nagyobb

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

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

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

Adatbázis rendszerek Gy: Algoritmusok C-ben

Algoritmuselmélet 2. előadás

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

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

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus adatszerkezetek. Dinamikus adatszerkezetek. Önhivatkozó struktúrák. Önhivatkozó struktúrák

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

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

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

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Programozás I gyakorlat

Algoritmusok és adatszerkezetek gyakorlat 07

Információs Technológia

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

Alkalmazott modul: Programozás. Programozási tételek, rendezések. Programozási tételek Algoritmusok és programozási tételek

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

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

10. gyakorlat Tömb, mint függvény argumentum

Számláló rendezés. Példa

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

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

értékel függvény: rátermettségi függvény (tness function)

Ö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.

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

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós szeptember 27. Széchenyi István Egyetem, Gy r

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

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

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.

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

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

14. Mediánok és rendezett minták

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

C programozás. { Márton Gyöngyvér, 2009 } { Sapientia, Erdélyi Magyar Tudományegyetem }

Programozás I gyakorlat

Programozás I gyakorlat. 10. Stringek, mutatók

Hatékonyság 1. előadás

INFORMATIKA javítókulcs 2016

Alkalmazott modul: Programozás. Programozási tételek, rendezések Giachetta Roberto

Adminisztrációs feladatok Strukturált programok A C programnyelv elemei

Ö Ó Ó Ó

Információs Technológia

Ó Ó É ü É ü ü

Ö

Ö Ö É Ő Ú É

Ó ű ű ű ű ű ű É É É

Ü ű Ü É ű ű É Ü Ü

ű ű ű Ö ű ű ű Ú ű ű ű Ö ű ű ű ű ű ű ű

Ü Ü Ó Ü Ó

Ó ú É ú É É É Ő ú ú ű Ó Ö É É ú Ü ú É ú

Ú Ú Ü Ü ű ű ű É Ú É ű

Ó Ó ú ú ú ú ú É ú

É ö

Ó ú É Ú

Algoritmusok vektorokkal keresések 1

A programozás alapjai előadás. Amiről szólesz: A tárgy címe: A programozás alapjai

ű ő ű ű ű ö ő ú ö ő ő ő ő ő ő ő ű ő ő ő ő ü ü ő ü ü ő ú ü ő ő ü ü ü ő ú ü

ELEMI PROGRAMOZÁSI TÉTELEK

Adatszerkezetek 7a. Dr. IványiPéter

Programozás alapjai 9.Gy: Struktúra 2.

Programozás 6. Dr. Iványi Péter

Láncolt listák. Egyszerű, rendezett és speciális láncolt listák. Programozás II. előadás. Szénási Sándor

Programozás alapjai. 8. előadás

Egyirányban láncolt lista

Programozás I. zárthelyi dolgozat

Ugrólisták. RSL Insert Example. insert(22) with 3 flips. Runtime?

Számjegyes vagy radix rendezés

Szövegek C++ -ban, a string osztály

Haladó rendezések. PPT 2007/2008 tavasz.

BBTE Matek-Infó verseny mintatételsor Informatika írásbeli vizsga

Kupacrendezés. Az s sorban lévő elemeket rendezzük a k kupac segítségével! k.empty. not s.isempty. e:=s.out k.insert(e) not k.

Rendezések. Sergyán Szabolcs Óbudai Egyetem Neumann János Informatikai Kar október 24.

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

Adatszerkezetek 1. előadás

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Tuesday, March 6, 12. Hasító táblázatok

Programozás alapjai C nyelv 9. gyakorlat. Rekurzió. Rekurzív algoritmus

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Adatszerkezetek Hasító táblák. Dr. Iványi Péter

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Programozás 5. Dr. Iványi Péter

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

INFORMATIKA tétel 2019

8. gyakorlat Pointerek, dinamikus memóriakezelés

Algoritmuselmélet 1. előadás

Körkörös listák. fej. utolsó. utolsó. fej

Nagy HF ke szı te si u tmutato

Írjon olyan programot a standard könyvtár alkalmazásával, amely konzolról megadott valós adatokból meghatározza és kiírja a minimális értékűt!

Átírás:

Keresés Rendezés Feladat 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 2016. november 7. Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 1 / 26

Keresés Rendezés Feladat Tartalom 1 Keresés adatvektorban Lineáris keresés Logaritmikus keresés 2 Rendezés Bevezetés Közvetlen kiválasztás Közvetlen beszúrás Buborékrendezés Összevetés Indextömbök 3 Feladat Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 2 / 26

Keresés Rendezés Feladat Lineáris Logaritmikus 1. fejezet Keresés adatvektorban Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 3 / 26

Keresés Rendezés Feladat Lineáris Logaritmikus Vektoralgoritmusok Emlékeztet : eldöntési feladat Van-e a vektornak olyan eleme, amely rendelkezik egy adott tulajdonsággal? Keresési feladat Van-e a vektornak olyan eleme, amely rendelkezik egy adott tulajdonsággal? Ha van, melyik az els ilyen? tulajdonság: a tárolt elem valamelyik része (a keresés kulcsa) megegyezik egy konkrét értékkel. Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 4 / 26

Keresés Rendezés Feladat Lineáris Logaritmikus Lineáris keresés Az els elemt l kezdve egyesével vizsgáljuk az elemeket, amíg a keresett elemet meg nem találjuk, vagy ki nem derül, hogy nincs ilyen elem. A vektor elemtípusa struktúra, amelynek egyik tagja a kulcs, nagyon egyszer esetben maga a kulcs típusa. 1 typedef int kulcs_ tipus ; /* pl. cikksz ám */ 2 3 typedef struct { 4 kulcs_ tipus kulcs ; 5 double ar ; 6 } tombelem ; Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 5 / 26

Keresés Rendezés Feladat Lineáris Logaritmikus Keresés függvénnyel Ha függvényként valósítjuk meg milyen paramétereket adjunk át? mi legyen a visszatérési érték? Visszaadhatjuk a megtalált elemet 1 tombelem lin_ keres_ elem ( tombelem t [], int n, 2 kulcs_ tipus kul ) 3 { 4 int i; 5 for (i =0; i <n; i ++) 6 if (t[i ]. kulcs == kul ) 7 return t[ i ]; 8 return t [0]; /* ajjaj */ 9 } kényelmes, de nem tudjuk, hol volt Mit adjunk vissza, ha nem találtunk megfelel t?! Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 6 / 26

Keresés Rendezés Feladat Lineáris Logaritmikus Keresés hivatkozás visszaadásával A függvény visszaadhatja a megtalált elem indexét 1 int lin_keres_ind ( tombelem t [], int n, 2 kulcs_ tipus kul ) 3 { 4 int i; 5 for (i =0; i <n; i ++) 6 if (t[i ]. kulcs == kul ) 7 return i; 8 return n; 9 } Az elemet indexeléssel elérhetjük. Ha nem találtunk megfelel t, visszaadhatunk negatív indexet (pl. -1) n-et, ilyen index elem már nincs Visszaadhatjuk a megtalált elem címét Az elemet indirekcióval elérhetjük. Ha nem találtunk megfelel t, visszaadhatunk null-pointert, ezt könny tesztelni is Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 7 / 26

Keresés Rendezés Feladat Lineáris Logaritmikus A lineáris keresés várható lépésszáma Fontos, hogy olyan kulcs érték, amely nincs tárolva a tömbben, általában sokkal több létezik, mint olyan, amely tárolva van. Ha a tömb mérete N, a várható lépésszám N. 2-1 -3 4-2 3-5 Ha a tömb a kulcs szerint rendezett, a lépésszám csökkenthet N/2-re. a tárolt kulcsok megtalálásához átlagosan N/2 lépés szükséges nem tárolt kulcsok keresésekor átlagosan N/2 lépés után d l el, hogy nincsenek meg (meghaladtuk) -5-3 -2-1 2 3 4 Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 8 / 26

Keresés Rendezés Feladat Lineáris Logaritmikus Keresés rendezett tömbben 1 tombelem * linrend_ keres ( tombelem t [], int n, 2 kulcs_ tipus kul ) 3 { 4 int i; 5 for (i =0; i < n; i ++) 6 if (t[i ]. kulcs >= kul ) 7 return t+i; 8 return NULL ; 9 } ha megvan a keresett kulcsú elem, akkor hivatkozást adhatunk vissza az elemre ha nincs, akkor hivatkozást adhatunk vissza arra a tömbelemre, ahol lennie kéne ez további vizsgálatot igényelhet a hívás helyén, de kés bb még jól jöhet Ha a tömb rendezett, van még ennél is jobb módszer Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 9 / 26

Keresés Rendezés Feladat Lineáris Logaritmikus Egy régi ismer s feladat 1 int main () { 2 int a =1, f =127; 3 printf (" Gondolj egy szamra %d es %d kozott!\ n",a,f ); 4 5 while (1) { 6 int v, k = (a+f )/2; 7 printf ("%d?\ t", k ); 8 scanf ("%d", &v ); 9 if (v ==0) 10 break ; 11 if (v >0) 12 a=k +1; 13 else 14 f=k -1; 15 } 16 return 0; 17 } link Számkitaláló játék adott intervallumon... Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 10 / 26

Keresés Rendezés Feladat Lineáris Logaritmikus Logaritmikus (bináris) keresés Ugyanígy, csak nem egy számot, hanem egy indexet keresve Minden egyes összehasonlító lépésben a keresési tartomány középs elemét vizsgáljuk A keresési tartomány minden egyes lépésben felez dik 1 int log_ keres ( tombelem t [], int n, 2 kulcs_ tipus kul ) { 3 int a =0, f=n -1, k; 4 while (a <f) { 5 k = (a+f )/2; 6 if ( kul == t[k ]. kulcs ) 7 return k; 8 if ( kul > t[k ]. kulcs ) 9 a=k +1; 10 else 11 f=k -1; 12 } 13 return kul <= t[ k ]. kulcs? k : k +1; 14 } link Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 11 / 26

Keresés Rendezés Feladat Bevezetés kivál. beszúr buborék összevet index 2. fejezet Rendezés Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 12 / 26

Keresés Rendezés Feladat Bevezetés kivál. beszúr buborék összevet index Rendezés Rendezni érdemes...... mert rendezett N elem tömbben log 2 N lépésben megtalálunk egy elemet (vagy megtudjuk, hogy nincs benne)... mert rendezett N elem listában N/2 lépésben megtalálunk egy elemet (vagy megtudjuk, hogy nincs benne) Rendezni költséges...... de tipikus, hogy ritkán rendezünk, és rengetegszer keresünk Mibe kerül a rendezés?... = összehasonlítások száma egy összehasonlítás költsége + mozgatások (cserék) száma egy mozgatás költsége Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 13 / 26

Keresés Rendezés Feladat Bevezetés kivál. beszúr buborék összevet index Mi kerül sokba? Az összehasonlítás A mozgatás 13.25 20.10 17.30 Nincs legjobb rendez módszer Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 14 / 26

Keresés Rendezés Feladat Bevezetés kivál. beszúr buborék összevet index Rendezés közvetlen kiválasztással Cser é ld ki a 0. elemmel a tö mb minimum át Cser é ld ki az 1. elemmel az utols ó N -1 elem minimum át Cser é ld ki a 2. elemmel az utols ó N -2 elem minimum át... Cser é ld ki az N -2. elemmel az utols ó 2 elem minimum át -3-1 0 7 2 1 5 3 MINDEN i - re 0-tól N -2 - ig imin i MINDEN j - re i +1 - t l N -1 - ig HA t[j] < t[ imin ] imin j; t[i] t[ imin ]; 1 for (i =0; i <N -1; ++ i) { 2 imin = i; 3 for (j=i +1; j <N; ++ j) 4 if (t[j] < t[ imin ]) 5 imin = j; 6 xchg (t+i, t+ imin ); 7 } Összehasonlítások száma: O ( N 2) N 2 /2 Cserék száma: O (N) N 1 Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 15 / 26

Keresés Rendezés Feladat Bevezetés kivál. beszúr buborék összevet index Közvetlen beszúrás A tömb egy i(= 4) hosszú rendezett szakaszból és egy N i hosszú rendezetlen szakaszból áll. 5. x 1. 1 3 4 7 2 1 5 3 4. 3. 2. A rendezetlen rész els elemét szúrjuk be a rendezett részbe, a megfelel pozícióba Ezzel a rendezett szakasz hossza eggyel n tt Kezdetben i = 1, az egyelem tömb ugyanis rendezett Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 16 / 26

Keresés Rendezés Feladat Bevezetés kivál. beszúr buborék összevet index Közvetlen beszúrás 5. x 1. 1 3 4 7 2 1 5 3 4. 3. 2. A rendezett részben az új elem helyét log 2 i lépésben megtaláljuk Összehasonlítások száma: O (N log 2 N) A beszúráshoz átlagosan i/2 elemet el kell húzni Mozgatások száma: O ( N 2) (max. (N 2 /2) mozgatás) Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 17 / 26

Keresés Rendezés Feladat Bevezetés kivál. beszúr buborék összevet index Közvetlen beszúrás A közvetlen beszúrás C-kódja 1 for (i =1; i <N; i ++) 2 { 3 s = t[i ]; /* besz ú rand ó elem */ 4 for (a =0, f=i; a <f ;) /* log keres és 0 i közö tt */ 5 { 6 k = (a+f )/2; 7 if ( t[ k] < s) 8 a = k +1; 9 else 10 f = k; 11 } 12 for (j=i; j >a; j - -) /* ré szt ö mb húzá sa */ 13 t[ j] = t[j -1]; 14 t[ a ]= s; /* besz úrás */ 15 } Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 18 / 26

Keresés Rendezés Feladat Bevezetés kivál. beszúr buborék összevet index Buborékrendezés Szomszédos elemeket vizsgálunk. Ha rossz sorrendben állnak, csere 1 for ( iter = 0; iter < n -1; ++ iter ) 2 for ( i = 0; i < N - iter -1; ++ i) 3 if (t[i] > t[i +1]) 4 xchg (t+i, t+i +1); i = 0 1 2 4 7 7 8 9 N-iter-1 = 1 Összehasonlítások száma: O ( N 2) N 2 /2 Cserék száma: O ( N 2) max. (N 2 /2) Az utolsó három körben nem cseréltünk semmit. Nem derül ez ki korábban? Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 19 / 26

Keresés Rendezés Feladat Bevezetés kivál. beszúr buborék összevet index Javított buborékrendezés cserék gyelésével 1 stop = n -1; 2 while ( stop!= 0) { 3 nextstop = 0; /* utols ó csere indexe */ 4 for ( i = 0; i < stop ; ++ i) 5 if (t[i] > t[i +1]) { 6 xchg (t+i, t+i +1) 7 nextstop = i; 8 } 9 stop = nextstop ; 10 } i = 0 1 2 4 7 7 8 9 stop = 0 nextstop = 0 Az összehasonlítások száma csökkent A cserék száma maradt Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 20 / 26

Keresés Rendezés Feladat Bevezetés kivál. beszúr buborék összevet index Rendez algoritmusok összehasonlítása N = 100 000 összehasonlítások mozgatások száma közvetlen kiválasztás 4 999 950 000 299 997 közvetlen beszúrás 1 522 642 2 499 618 992 buborék 4 999 950 000 7 504 295 712 javított buborék 4 999 097 550 7 504 295 712 gyorsrendezés 3 147 663 1 295 967 összehasonlító program Nincs legjobb algoritmus 1. 1 csak legrosszabb Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 21 / 26

Keresés Rendezés Feladat Bevezetés kivál. beszúr buborék összevet index Indextömbök Az adatmozgatások száma jelent sen csökkenthet, ha nem a tömbelemeket, hanem azok indexeit rendezzük 0 ABC123 Aladár 1 QE8BZX Dzsenifer 2 S45FDO Kristóf 3 KJ967F Gyöngyvér 4 FEK671 Éva 5 F34K98 Mihály 6 D678EF Berci eredeti adatvektor 0 0 1 6 2 1 rendezés 3 4 4 3 5 2 6 5 név szerint rendez indextömb 1 for ( i = 0; i < n; ++ i) /* né vsor */ 2 printf ("%s\n", data [ index [i ]]. name ); Indexek helyett rendezhetünk mutatókat is, ha az eredeti tömb (vagy lista) a memóriában van Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 22 / 26

Keresés Rendezés Feladat Bevezetés kivál. beszúr buborék összevet index Rendezés több szempont szerint Több kulcs szerint rendezés indextömbökkel Gyors keresés érdekében érdemes az indextömbökben a kulcsokat is tárolni, és az indextömböket kulcs szerint rendezve tartani 0 ABC123 Aladár 1 QE8BZX Dzsenifer 2 S45FDO Kristóf 3 KJ967F Gyöngyvér 4 FEK671 Éva 5 F34K98 Mihály 6 D678EF Berci Aladár 0 Berci 6 Dzsenifer 1 Éva 4 Gyöngyvér 3 Kristóf 2 Mihály 5 ABC123 0 D678EF 6 FEK671 4 F34K98 5 KJ967F 3 QE8BZX 1 S45FDO 2 Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 23 / 26

Keresés Rendezés Feladat 3. fejezet Feladat Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 24 / 26

Keresés Rendezés Feladat Egy összetettebb feladat Írjunk programot, mely egy szöveges fájl összes max. 50 bet s szavának gyakoriságáról statisztikát készít Tervezés Szavak száma csak menet közben derül ki láncolt lista Gyorsabb keresés miatt névsor szerint rendezett Rendezett beszúrások miatt elöl strázsás Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 25 / 26

Keresés Rendezés Feladat Köszönöm a gyelmet. Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 2016. november 7. 26 / 26