170 likes | 341 Views
TDA şir. Structuri de date şi algoritmi 1 -laborator- s.l. dr. ing. Ciprian-Bogdan Chiril ă Universitatea “Ioan Slavici” Timi ş oara 2012. Cuprins. TDA şir model matematic n ota ţii operatori implementare cu tablouri Tehnici de căutare în şiruri c ăutarea de şiruri directă
E N D
TDA şir Structuri de date şi algoritmi 1 -laborator- s.l. dr. ing. Ciprian-Bogdan Chirilă Universitatea “Ioan Slavici” Timişoara 2012
Cuprins • TDA şir • model matematic • notaţii • operatori • implementare cu tablouri • Tehnici de căutare în şiruri • căutarea de şiruri directă • căutarea de şiruri Boyer-Moore • Concluzii
TDA şir – modelul matematic • Un şir este o secvenţă finită de caractere (c1,c2,…,cn) unde: • ci este un caracter • n precizează lungimea secvenţei • Când n=0 secvenţa corespunzătoare desemnează şirul vid
TDA şir - notaţii • s, sub, u – şiruri • c – valoare de tip caracter • b – valoare booleană • poz, lung – întregi pozitivi
TDA şir - operatori • CreazaSirVid(s) • SirVid(s)->b • LungSir(s)->lung • Pozitie(sub,s)->poz • Concat(u,s) • CopiazaSubsir(u,s,poz, lung) • StergeSir(s,poz,lung) • InsereazaSir(sub,s,poz) • FurnizeazaCar(s,poz) • AdaugaCaractere(s,c) • StergeSubsir(sub,s,poz) • StergeToateSubsir(s,sub)
TDA şir – implementare cu tablouri char s[100]; // declaratie tablou char c; // declaratie variabila tip caracter int i; // declaratie variabila de tip indice strcpy(s,"Hello World!\n"); printf("%s",s); s[5]='&'; printf("%s",s); i=6; c=s[i]; printf("%c\n",s[i]);
Căutare de şiruri directă • Se cere să se determine poziţia primei apariţii în şirul s a modelului p. • În căutarea directă modelul este deplasat “paralel cu şirul”, cu câte o poziţie până la găsirea lui sau până la când numărul poziţiilor netestate din şir e mai mic decât lungimea modelului.
Căutare de şiruri directă - cod int CautareDirecta(char *s, int n, char *p, int m) { int i,j; i=-1; do { i++;j=0; while((j<m) && (s[i+j]==p[j])) j++; } while((j<m) && (i<n-m)); return j==m ? i : -1; }
MARE_E_MAREA_MARMARA MARMARA MARE_E_MAREA_MARMARA MARMARA MARE_E_MAREA_MARMARA MARMARA MARE_E_MAREA_MARMARA MARMARA Căutare de şiruri directă – demo 1
MARE_E_MAREA_MARMARA MARMARA MARE_E_MAREA_MARMARA MARMARA MARE_E_MAREA_MARMARA MARMARA MARE_E_MAREA_MARMARA MARMARA Căutare de şiruri directă – demo 2
MARE_E_MAREA_MARMARA MARMARA MARE_E_MAREA_MARMARA MARMARA MARE_E_MAREA_MARMARA MARMARA MARE_E_MAREA_MARMARA MARMARA Căutare de şiruri directă – demo 3
MARE_E_MAREA_MARMARA MARMARA MARE_E_MAREA_MARMARA MARMARA Căutare de şiruri directă – demo 4
Căutare de şiruri Boyer-Moore • Este o metodă mai performantă care se bazează pe informaţii obţinute din precompilarea modelului de căutat; • Se compară perechi de caractere pornind de la ultimul caracter din model; • Dacă apare inegalitate, modelul va fi deplasat spre dreapta a.î. în dreptul caracterului unde a apărut nepotrivirea, să se afle un caracter identic din model;
Căutare de şiruri Boyer-Moore - cod int CautareBoyerMoore(char *s, int n, char *p, int m) { int d[256]; int i,j,k; for(i=0;i<256;i++) d[i]=m; for(j=0;j<m-1;j++) d[p[j]]=m-j-1;
Căutare de şiruri Boyer-Moore - cod i=m;j=m; while((j>0) && (i<=n)) { j=m; k=i; while((j>0) && (s[k-1]==p[j-1])) { k--; j--; } if(j>0) { i=i+d[s[k-1]]; } } return j==0 ? i-m : -1; }
MARE_E_MAREA_MARMARA MARMARA MARE_E_MAREA_MARMARA MARMARA MARE_E_MAREA_MARMARA MARMARA MARE_E_MAREA_MARMARA MARMARA Căutare de şiruri Boyer-Moore – demo
Concluzii • Salturi mai mari la căutarea Boyer-Moore faţă de cea directă; • Aplicaţii practice ale şirurilor de caractere: • baze de date(câmpuri de tip şir de caractere); • procesoarede texte (Word, PageMaker, etc); • compilatoare, interpretoare(textul sursă al programelor sunt văzute ca şiruri de caractere !!!)