Keresés Rendezés Feladat Keresés Rendezés Feladat Tartalom 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 1 Keresés adatvektorban Lineáris keresés Logaritmikus keresés Rendezés Bevezetés Közvetlen kiválasztás Közvetlen beszúrás Buborékrendezés Összevetés Indextömbök 3 Feladat 016. november 7. Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 016. november 7. 1 / 5 Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 016. november 7. / 5 Vektoralgoritmusok 1. fejezet Emlékeztet : eldöntési feladat Van-e a vektornak olyan eleme, amely rendelkezik egy adott tulajdonsággal? Keresés adatvektorban 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 016. november 7. 3 / 5 Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 016. november 7. 4 / 5
Lineáris keresés Keresés függvénnyel 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 */ 3 typedef struct { 4 kulcs_ tipus kulcs ; 5 double ar ; 6 } tombelem ; 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, 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 016. november 7. 5 / 5 Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 016. november 7. 6 / 5 Keresés hivatkozás visszaadásával A lineáris keresés várható lépésszáma A függvény visszaadhatja a megtalált elem indexét 1 int lin_keres_ind ( tombelem t [], int n, 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 016. november 7. 7 / 5 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. -1-3 4-3 -5 Ha a tömb a kulcs szerint rendezett, a lépésszám csökkenthet N/-re. a tárolt kulcsok megtalálásához átlagosan N/ lépés szükséges nem tárolt kulcsok keresésekor átlagosan N/ lépés után d l el, hogy nincsenek meg (meghaladtuk) -5-3 - -1 3 4 Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 016. november 7. 8 / 5
Keresés rendezett tömbben Egy régi ismer s feladat 1 tombelem * linrend_ keres ( tombelem t [], int n, 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 016. november 7. 9 / 5 1 int main () { int a =1, f =17; 3 printf (" Gondolj egy szamra %d es %d kozott!\ n",a,f ); 4 5 while (1) { 6 int v, k = (a+f )/; 7 printf ("%d?\ t", k ); 8 scanf ("%d", &v ); 9 if (v ==0) 10 break ; 11 if (v >0) 1 a=k +1; 13 else 14 f=k -1; 15 } 16 return 0; 17 } Számkitaláló játék adott intervallumon... Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 016. november 7. 10 / 5 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, kulcs_ tipus kul ) { 3 int a =0, f=n -1, k; 4 while (a <f) { 5 k = (a+f )/; 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; 1 } 13 return kul <= t[ k ]. kulcs? k : k +1; 14 } Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 016. november 7. 11 / 5 A keresés várható lépésszáma log N. fejezet Rendezés Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 016. november 7. 1 / 5
Rendezés Mi kerül sokba? Rendezni érdemes...... mert rendezett N elem tömbben log N lépésben megtalálunk egy elemet (vagy megtudjuk, hogy nincs benne) Az összehasonlítás... mert rendezett N elem listában N/ 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 A mozgatás 13.5 0.10 17.30 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 Nincs legjobb rendez módszer Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 016. november 7. 13 / 5 Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 016. november 7. 14 / 5 Rendezés közvetlen kiválasztással Közvetlen beszúrás 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. elemmel az utols ó N - elem minimum át... Cser é ld ki az N -. elemmel az utols ó elem minimum át A tömb egy i(= 4) hosszú rendezett szakaszból és egy N i hosszú rendezetlen szakaszból áll. 5. x 1. -3-1 0 7 1 5 3 1 3 4 7 1 5 3 MINDEN i - re 0-tól N - - 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) { 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 } 4. 3.. 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 Összehasonlítások száma: O ( N ) N / Cserék száma: O (N) N 1 Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 016. november 7. 15 / 5 Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 016. november 7. 16 / 5
Közvetlen beszúrás Közvetlen beszúrás A közvetlen beszúrás C-kódja 5. x 1 3 4 7 1 5 3 4. 3.. A rendezett részben az új elem helyét log i lépésben megtaláljuk Összehasonlítások száma: O (N log N) A beszúráshoz átlagosan i/ elemet el kell húzni Mozgatások száma: O ( N ) (max. (N /) mozgatás) 1. 1 for (i =1; i <N; i ++) { 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 )/; 7 if ( t[ k] < s) 8 a = k +1; 9 else 10 f = k; 11 } 1 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 016. november 7. 17 / 5 Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 016. november 7. 18 / 5 Buborékrendezés Javított buborékrendezés cserék gyelésével Szomszédos elemeket vizsgálunk. Ha rossz sorrendben állnak, csere 1 for ( iter = 0; iter < n -1; ++ iter ) for ( i = 0; i < N - iter -1; ++ i) 3 if (t[i] > t[i +1]) 4 xchg (t+i, t+i +1); 1 i = 0 4 7 7 8 9 N-iter-1 = 1 Összehasonlítások száma: O ( N ) N / Cserék száma: O ( N ) max. (N /) 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 016. november 7. 19 / 5 1 stop = n -1; 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 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 016. november 7. 0 / 5
Rendez algoritmusok összehasonlítása Indextömbök N = 100 000 összehasonlítások mozgatások száma közvetlen kiválasztás 4 999 950 000 99 997 közvetlen beszúrás 1 5 64 499 618 99 buborék 4 999 950 000 7 504 95 71 javított buborék 4 999 097 550 7 504 95 71 gyorsrendezés 3 147 663 1 95 967 Nincs legjobb algoritmus 1. összehasonlító program 1 csak legrosszabb Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 016. november 7. 1 / 5 Az adatmozgatások száma jelent sen csökkenthet, ha nem a tömbelemeket, hanem azok indexeit rendezzük 0 ABC13 Aladár 1 QE8BZX Dzsenifer S45FDO Kristóf 3 KJ967F Gyöngyvér 4 FEK671 Éva 5 F34K98 Mihály 6 D678EF Berci eredeti adatvektor 0 0 1 6 1 rendezés 3 4 4 3 5 6 5 név szerint rendez indextömb 1 for ( i = 0; i < n; ++ i) /* né vsor */ 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 016. november 7. / 5 Keresés Rendezés Feladat 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 ABC13 Aladár 1 QE8BZX Dzsenifer 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 Mihály 5 ABC13 0 D678EF 6 FEK671 4 F34K98 5 KJ967F 3 QE8BZX 1 S45FDO 3. fejezet Feladat Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 016. november 7. 3 / 5 Farkas B., Fiala P., Vitéz A., Zsóka Z. Keresés és rendezés 016. november 7. 4 / 5
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 016. november 7. 5 / 5