Advertisement
dzieciol

knuth morris pratt&&abyermoore

May 31st, 2016
433
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.13 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5.  
  6. /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  7.  
  8. int knuth_morris_pratt(char *wzor, char *napis ){
  9. int m=strlen(wzor);
  10. int n=strlen(napis);
  11. int p[m];
  12. int t=0;
  13. int i;
  14. int x=0;
  15. p[0]= 0 ;
  16. p[1]= 0;
  17.  //tworzenie tablicy P dla szybszego przeglądania tekstu.
  18. for (i=2;i <= m;i++){
  19.     while((t > 0) && (wzor[t] != wzor[i-1])){t=p[t];}
  20.     if(wzor[t]==wzor[i-1]){t++;}
  21.     p[i]=t;
  22.  
  23. }
  24. // właściwe szukanie
  25.     int j;
  26.     i=1;
  27.     j=0;
  28.     while (i<=n-m+1){
  29.     j=p[j];
  30.     while ((wzor[j]==napis[i+j-1]) && (j<m)){ j++;}
  31.     if (j==m)
  32.         {
  33.         printf("znaleziono dopasowanie na %d miejscu \n",i);
  34.         x=-1;
  35.         }
  36.     if(j-p[j]>1)i=i+j-p[j];else i++;
  37.     }
  38.     return x;
  39. }
  40.  
  41.  
  42. void bayer_moore(char *wzor, char *napis)
  43. {
  44.    //int *movTab = createMovementTab(pattern);
  45.  
  46.   int n = strlen(wzor);
  47.   int m = strlen(napis);
  48.   int tablicaWystapien[255];
  49.   //tabela bayera moora odwrotnie niz w NS
  50.   int i;
  51.   for (i = 0; i < 255; i++) {
  52.     tablicaWystapien[i] = n + 1;
  53.   }
  54.  
  55.   for (i = 0; i < n; i++) {
  56.     tablicaWystapien[(int) wzor[i]] = n - i;
  57.   }
  58.  
  59.   i = n - 1;
  60.   while (i < m - n + 1) {
  61.     int trafienie = 1;
  62.     int pozycja_w_tekscie = i;
  63.  
  64.     int j;
  65.     for (j = i; j > i - n; j--) {
  66.       int pozycja_we_wzorze = j - i + n - 1;
  67.       if (napis[j] != wzor[pozycja_we_wzorze]) {
  68.         pozycja_w_tekscie = pozycja_we_wzorze;//heurystyka oststniego wystąpienia przesunięcie do oststniego wystąpienia niezgodnego znaku  we wzorcu
  69.         trafienie = 0;
  70.         break;
  71.       }
  72.     }
  73.  
  74.     if (trafienie == 1) {
  75.       printf("Zaleziono na pozycji %d\n", i - n + 1);
  76.       i += n;
  77.     } else {
  78.       i += tablicaWystapien[(int) wzor[pozycja_w_tekscie]];//heurystyka dobrego przyrostka
  79.     }
  80.   }
  81. }
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88. int main(int argc, char *argv[]) {
  89.      char tekst[] = "ababababca";
  90.      char wzorzec[] = "bab";
  91.     //bayer_moore(wzorzec,tekst);
  92.     // if(knuth_morris_pratt(wzorzec,tekst)==0)
  93.      //printf("zakonczono sprawdzanie tekstu");else
  94.      //printf(" ");
  95.  
  96.     return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement