基本的模式搜索算法

给定一个字符数组txt[0..n-1] 和一个模式pat [0..m-1],写一个搜索函数search(char pat [],char txt []),该函数在txt中打印所有出现的pat [] []。你可以假设n> m。

举个例子:

Input:  txt[] = "THIS IS A TEST TEXT"
        pat[] = "TEST"
Output: Pattern found at index 10

Input:  txt[] =  "AABAACAADAABAABA"
        pat[] =  "AABA"
Output: Pattern found at index 0
        Pattern found at index 9
        Pattern found at index 12

pattern-searching

模式搜索是在计算机科学领域的一个重要问题,当我们在notepad/word 文件中或者浏览器,数据库中进行搜索一个字符串时,模式搜索算法就被用来显示搜到的结果。

算法思想:

逐个将文字对比文本并检查匹配。如果找到匹配,则再依次递增1以检查随后的匹配。

下面是代码实现:

// C program for Naive Pattern Searching algorithm
#include<stdio.h>
#include<string.h>
void search(char *pat, char *txt)
{
    int M = strlen(pat);
    int N = strlen(txt);
    int i;
    /* A loop to slide pat[] one by one */
    for (i = 0; i <= N - M; i++)
    {
        int j;

        /* For current index i, check for pattern match */
        for (j = 0; j < M; j++)
            if (txt[i+j] != pat[j])
                break;

        if (j == M)  // if pat[0...M-1] = txt[i, i+1, ...i+M-1]
           printf("Pattern found at index %d \n", i);
    }
}
/* Driver program to test above function */
int main()
{
   char txt[] = "AABAACAADAABAAABAA";
   char pat[] = "AABA";
   search(pat, txt);
   return 0;
}

  输出:

Pattern found at index 0
Pattern found at index 9
Pattern found at index 13

算法分析:

1、什么是最好的情况?

最好的情况发生在模式的第一个字符根本不存在于文本中。

txt[]  = "AABCCAADDEE"
pat[] = "FAA"

在最好的情况下比较的数量是O(n)

2、什么是最坏的情况?
模式搜索的最坏情况发生在以下情况。
1)当文本和图案的所有字符相同时。

txt[] = "AAAAAAAAAAAAAAAAAA"
pat[] = "AAAAA".

2)只有最后一个字符不同时也会发生最坏的情况。

 
txt[] = "AAAAAAAAAAAAAAAAAB"
pat[] = "AAAAB"

最坏情况下的比较数是O(m *(n-m + 1))。尽管重复字符的字符串不可能出现在英文文本中,但是在其他应用程序(例如,二进制文本)中可能会出现该字符串。KMP匹配算法将最差情况改善为O(n)。我们将在下一篇文章中介绍KMP。此外,我们将写更多的帖子来涵盖所有的模式搜索算法和数据结构。

如果你有什么问题,那就给我留言吧。

 

posted @ 2017-11-08 10:28 wongyi 阅读(...) 评论(...) 编辑 收藏