您的位置:首页 > 其它

2011 4-27 KMP 算法

2011-04-27 22:30 239 查看
核心就是两步

1 计算next数组,对pattern串进行分析。 复杂度为o(n)



2 对target串进行查找。复杂度为 o(m+n)



所以总共的复杂度为 o(m+n)



#include <iostream>

#include <stdio.h>

#include <string.h>

using namespace std;



int *GetNextArray(const char *const pattern, size_t length) {

// Create next array in heap and initialize its value to zero

int *next = new int[length]();

if (NULL == next)

{

return NULL;

}

for (size_t i=1; i<length; ++i)

{

if ( (0 != next[i-1]) &&

(pattern[next[i-1]] == pattern[i]) )

{

next[i] = next[i-1] + 1;

continue;

}

if (pattern[0] == pattern[i])

{

next[i] = 1;

}

else

{

next[i] = 0;

}

}



return next;

}



namespace {

const int Error_Get_Next_Array = -1;

const int START_INDEX = 0;

}



int KMP(const char *const target, const char *const pattern) {

size_t size_pattern = strlen(pattern);

size_t size_target = strlen(target);



int *next = GetNextArray(pattern, size_pattern);

if(NULL == next) {

return Error_Get_Next_Array;

}



int index_target = START_INDEX, index_pattern = START_INDEX;



while( (index_target<size_target) &&

(index_pattern<size_pattern) ) {

if (target[index_target] == pattern[index_pattern]) {

++index_pattern;

++index_target;

} else {

if (START_INDEX == index_pattern) {

++index_target;

continue;

}

index_pattern = next[index_pattern-1];

}

}

// delete next

delete [] next;

if (index_pattern == size_pattern) {

return index_target - size_pattern;

} else {

return -1;

}



}

int main()

{

const char *const pattern = "abaabcac";

const char *const target = "acabaabaabcacaabc";



size_t length = strlen(target);



int index = KMP(target, pattern);



if(Error_Get_Next_Array == index) {

cout<<"Error happened when try to calculate next array"<<endl;

return 0;

}



cout<<"The result is:"<<endl;

cout<<target<<endl;

for (size_t i=0; i<index; ++i)

{

cout<<" ";

}

cout<<pattern<<endl;

return 0;

}

只需对内存分配改一下,就是C代码了
PS C代码中的堆分配函数

calloc(numElements ,sizeOfElement); // 两个参数,并将内存初始化为0

   malloc(numElements *sizeOfElement) ; // 一个参数,不初始化内存
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: