C++ Algorithms on Searching
Posted by Superadmin on August 08 2022 04:52:47

C++ Algorithms on Searching

 

 

 

 

This C++ Program demonstrates the implementation of Knuth–Morris–Pratt Algorithm popularly known as KMP.

 

Here is source code of the C++ Program to implement Knuth–Morris–Pratt Algorithm (KMP). The C++ program is successfully compiled and run on a Linux system. The program output is also shown below.

  1. /*
  2.  * C++ Program to Implement Knuth–Morris–Pratt Algorithm (KMP)
  3.  */
  4. #include <iostream>
  5. #include <cstring>
  6. using namespace std;
  7. void preKMP(string pattern, int f[])
  8. {
  9.     int m = pattern.length(), k;
  10.     f[0] = -1;
  11.     for (int i = 1; i < m; i++)
  12.     {
  13.         k = f[i - 1];
  14.         while (k >= 0)
  15.         {
  16.             if (pattern[k] == pattern[i - 1])
  17.                 break;
  18.             else
  19.                 k = f[k];
  20.         }
  21.         f[i] = k + 1;
  22.     }
  23. }
  24.  
  25. //check whether target string contains pattern 
  26. bool KMP(string pattern, string target)
  27. {
  28.     int m = pattern.length();
  29.     int n = target.length();
  30.     int f[m];     
  31.     preKMP(pattern, f);     
  32.     int i = 0;
  33.     int k = 0;        
  34.     while (i < n)
  35.     {
  36.         if (k == -1)
  37.         {
  38.             i++;
  39.             k = 0;
  40.         }
  41.         else if (target[i] == pattern[k])
  42.         {
  43.             i++;
  44.             k++;
  45.             if (k == m)
  46.                 return 1;
  47.         }
  48.         else
  49.             k = f[k];
  50.     }
  51.     return 0;
  52. }
  53.  
  54. int main()
  55. {
  56.     string tar = "san and linux training";
  57.     string pat = "lin";
  58.     if (KMP(pat, tar))
  59.         cout<<"'"<<pat<<"' found in string '"<<tar<<"'"<<endl;
  60.     else
  61.         cout<<"'"<<pat<<"' not found in string '"<<tar<<"'"<<endl;
  62.     pat = "sanfoundry";
  63.     if (KMP(pat, tar))
  64.         cout<<"'"<<pat<<"' found in string '"<<tar<<"'"<<endl;
  65.     else
  66.         cout<<"'"<<pat<<"' not found in string '"<<tar<<"'"<<endl;
  67.     return 0;
  68. }

 

$ g++ kmp.cpp
$ a.out
 
'lin' found in string 'san and linux training'
'sanfoundry' not found in string 'san and linux training'
 
------------------
(program exited with code: 1)
Press return to continue
This C++ Program demonstrates the implementation of Rabin-Karp Algorithm.

 

Here is source code of the C++ Program to demonstrate the implementation of Rabin-Karp Algorithm. The C++ program is successfully compiled and run on a Linux system. The program output is also shown below.

  1. /*
  2.  * C++ Program to Implement Rabin-Karp Algorithm
  3.  */
  4. #include <iostream>
  5. #include <cstdio>
  6. #include <cstring>
  7. #include <cstdlib>
  8. using namespace std;
  9. #define d 256
  10. /*
  11.  * search a substring in a string 
  12.  */
  13. void search(char *pat, char *txt, int q)
  14. {
  15.     int M = strlen(pat);
  16.     int N = strlen(txt);
  17.     int i, j;
  18.     int p = 0;
  19.     int t = 0;
  20.     int h = 1;
  21.     for (i = 0; i < M - 1; i++)
  22.         h = (h * d) % q;
  23.     for (i = 0; i < M; i++)
  24.     {
  25.         p = (d *p + pat[i]) % q;
  26.         t = (d * t + txt[i]) % q;
  27.     }
  28.     for (i = 0; i <= N - M; i++)
  29.     {
  30.         if (p == t)
  31.         {
  32.             for (j = 0; j < M; j++)
  33.             {
  34.                 if (txt[i + j] != pat[j])
  35.                     break;
  36.             }
  37.             if (j == M)
  38.             {
  39.                 cout<<"Pattern found at index: "<<i<<endl;
  40.             }
  41.         }
  42.         if (i < N - M)
  43.         {
  44.             t = (d * (t - txt[i] * h) + txt[i + M]) % q;
  45.             if (t < 0)
  46.               t = (t + q);
  47.         }
  48.     }
  49. }
  50.  
  51. /* Main */
  52. int main()
  53. {
  54.     char *txt = "Sanfoundry Linux Training";
  55.     char *pat = "nux";
  56.     int q = 101;
  57.     search(pat, txt, q);
  58.     return 0;
  59. }

 

$ g++ rabinkarp.cpp
$ a.out
 
Pattern found at index: 13
 
------------------
(program exited with code: 1)
Press return to continue