Add Boyer Moore search algo and simple Makefile

This commit is contained in:
danghai 2019-05-17 14:25:36 -07:00
parent 24b5a4ebda
commit 9001ae9094
2 changed files with 71 additions and 0 deletions

View File

@ -0,0 +1,14 @@
CC = gcc
FLAG = -o
all: naive_search rabin_karp_search boyer_moore_search
naive_search : naive_search.c
$(CC) $(FLAG) naive_search naive_search.c
rabin_karp_search : rabin_karp_search
$(CC) $(FLAG) rabin_karp_search rabin_karp_search.c
boyer_moore_search: boyer_moore_search boyer_moore_search.c
$(CC) $(FLAG) boyer_moore_search boyer_moore_search.c
clean:
rm naive_search rabin_karp_search boyer_moore_search

View File

@ -0,0 +1,57 @@
#include <stdio.h>
#include <string.h>
#define NUM_OF_CHARS 256
int max(int a, int b) {return (a>b)? a:b;}
void computeArray(char *pattern, int size, int arr[NUM_OF_CHARS])
{
int i;
for(i = 0; i < NUM_OF_CHARS; i++)
arr[i] = -1;
/* Fill the actual value of last occurrence of a character */
for(i = 0; i < size; i++)
arr[(int) pattern[i]] = i;
}
/* Boyer Moore Search algorithm */
void boyer_moore_search(char *str, char *pattern)
{
int n = strlen(str);
int m = strlen(pattern);
int shift = 0;
int arr[NUM_OF_CHARS];
computeArray(pattern, m, arr);
while(shift <= (n - m))
{
int j = m - 1;
while (j >= 0 && pattern[j] == str[shift + j])
j--;
if (j < 0)
{
printf("--Pattern is found at: %d\n", shift);
shift += (shift + m < n) ? m - arr[str[shift + m]] : 1;
} else {
shift += max(1, j - arr[str[shift +j]]);
}
}
}
int main()
{
char str[] = "AABCAB12AFAABCABFFEGABCAB";
char pat1[] = "ABCAB";
char pat2[] = "FFF"; /* not found */
char pat3[] = "CAB";
printf("String test: %s\n", str);
printf("Test1: search pattern %s\n", pat1);
boyer_moore_search(str, pat1);
printf("Test2: search pattern %s\n", pat2);
boyer_moore_search(str, pat2);
printf("Test3: search pattern %s\n", pat3);
boyer_moore_search(str, pat3);
return 0;
}