Advertisement
Guest User

Untitled

a guest
May 26th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.42 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. int licznik=0;
  5.  
  6. int usunznak(char* tekst, int dlugosc){
  7. int miejsce=0;
  8. for(int i=0;i<dlugosc;i++){
  9. if(tekst[i]=='\n'){
  10. miejsce++;
  11. }else{
  12. tekst[miejsce]=tekst[i];
  13. miejsce++;
  14. }
  15. }
  16. return miejsce;//nowa dlugosc tekstu
  17. }
  18.  
  19.  
  20.  
  21. void Naiwny(char* P,char* T,int m,int n){
  22. n = usunznak(T,n);
  23. m = usunznak(P,m);
  24. // P - wzorzec, tablica [1..m],
  25. // T - tekst, tablica [1..n],
  26. for(int s=0;s<n-m;s++){
  27. for(int i=0;i<m;i++){
  28. if(T[s+i]!=P[i]){
  29. break;
  30. }
  31. if(i==m-1){
  32. printf("znaleźliśmy wzorzec na miejscu: %d\n", s);
  33.  
  34. }
  35. }
  36. }
  37. }
  38.  
  39. void RabinKarp(char* P,char* T,int d,int q, int m, int n){
  40. // P - wzorzec, tablica [1..m],
  41. // T- tekst, tablica [1..n],
  42. // d - rozmiar alfabetu (np. 128),
  43. // q - liczba pierwsza (np. 27077)
  44. n = usunznak(T,n);
  45. m = usunznak(P,m);
  46. int h=1;
  47. for(int i=0;i<m-1;i++){
  48. h = (h*d)%q; // wyliczy h = (d do potęgi m-1) modulo q
  49. }
  50. int p=0;
  51. int t=0;
  52. for(int i=0;i<m;i++){
  53. p = (d*p+P[i])%q;
  54. t = (d*t+T[i])%q;
  55. }
  56. // wyliczone: wartość p "kodująca" P[1..m]
  57. // oraz wartość t "kodująca" T[s+1..s+m] dla s==0
  58. // kodowanie niejednoznaczne! (haszowanie)
  59. for(int s=0;s<n-m;s++){
  60. if(p==t){
  61. for(int i=0;i<m;i++){
  62. if(T[s+i]!=P[i]){
  63. break;
  64. }
  65. if(i==m-1){
  66. printf("znaleźliśmy wzorzec na miejscu: %d\n", s);
  67. }
  68. }
  69. }
  70.  
  71. if(s<n-m){ // czy tekst się nie skończył?
  72. int t1=(T[s+1]*h)%q;
  73. if(t<t1){
  74. t=t+q;
  75. }
  76. t = (d*(t-t1)+T[s+m+1])%q;
  77. }
  78. }
  79. }
  80. // czyli t = (d*(t-T[s+1]*h)+T[s+1+m])%q, gdzie arytmetyka jest
  81. // modulo q (mnożenie i odejmowanie)
  82. // to wylicza wartość t "kodującą" T[s+2, ... , s+m,s+1+m]
  83. // na podstawie wartości t "kodującej" T[s+1,s+2, ... , s+m]
  84.  
  85.  
  86. int* PrefixFunction(char*P, int m){
  87. // P - wzorzec, tablica [1..m]
  88. int* pi=calloc(m,sizeof(int));
  89. pi[0]=0;
  90. int k=0;
  91. for(int q=1;q<m;q++){
  92. // mamy: P[1..k]==P[...q-1], k==pi[q-1]
  93. while(k>0 && P[k] != P[q-1]){
  94. k=pi[k];
  95. }
  96. if(P[k] == P[q-1]){
  97. k=k+1;
  98. }
  99. pi[q]=k;
  100. }
  101. return pi;
  102. }
  103.  
  104.  
  105. //Wyszukiwanie wzorca
  106. void KMP(char* T,char* P, int n, int m){
  107. n = usunznak(T,n);
  108. m = usunznak(P,m);
  109. // T - tekst, tablica [1..n]
  110. // P - wzorzec, tablica [1..m]
  111. int* pi = PrefixFunction(P, m);
  112. int q=0;
  113. for(int i=0;i<n;i++){
  114. // mamy: P[1..q]==T[...i-1]
  115. while(q>0 && P[q] != T[i]){
  116. q=pi[q-1];
  117. }
  118. if(P[q] == T[i]){
  119. q=q+1;
  120. }
  121. if(q==m){
  122. printf("znaleźliśmy wzorzec na miejscu: %d\n", i-m+1);
  123. q=pi[q-1];
  124. }
  125. }
  126. }
  127. int wczytaj(FILE* fileptr, char** buffer)
  128. {
  129. char a;
  130. int C=0;
  131. long filelen;
  132.  
  133. fseek(fileptr, 0, SEEK_END); // Jump to the end of the file
  134. filelen = ftell(fileptr); // Get the current byte offset in the file
  135. rewind(fileptr); // Jump back to the beginning of the file
  136.  
  137. *buffer = (char *)malloc((filelen+1)*sizeof(char)); // Enough memory for file + \0
  138. fread(*buffer, filelen, 1, fileptr); // Read in the entire file
  139. fclose(fileptr); // Close the file
  140. return filelen;
  141. }
  142. int main(){
  143. char* wzorzec;
  144. char* tekst;
  145.  
  146. FILE* f=fopen("wzorzec.txt", "r");
  147. int dlugoscw = wczytaj(f, &wzorzec);
  148. FILE* f2=fopen("tekst.txt", "r");
  149. int dlugosct = wczytaj(f2, &tekst);
  150.  
  151. //Naiwny(wzorzec,tekst,dlugoscw, dlugosct);
  152. //RabinKarp(wzorzec,tekst,128,27077,dlugoscw, dlugosct);
  153. KMP(tekst,wzorzec,dlugosct, dlugoscw);
  154.  
  155.  
  156.  
  157.  
  158.  
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement