user-0 提问: KMP算法在二进制匹配中是否有改进的空间

回复:
user: user-1
content: 字符串的模式匹配终究是匹配字符串，匹配条件都是求相等序列，就算是int数组也都是一个流程，感觉不能怎么优化。  要说优化的话，只能从存储方式下手，位运算效率最高，比较二进制还是应该在位作为单位的环境下存储和比较。  lz把二进制转成数组，最终还要转成二进制的吧，效率多低。

user: user-2
content: #include <iostream.h> #include <string.h>  void get_nextval(const char *T, int next[]) { 	// 求模式串T的next函数值并存入数组 next。 	int j = 0, k = -1; 	next[0] = -1; 	while ( T[j] != '\0' ) 	{ 		 		if (k == -1 || T[j] == T[k]) 		{ 			++j; ++k; 			if (T[j]!=T[k]) 				next[j] = k; 			else 				next[j] = next[k]; 			cout<<next[j]<<"  "; 		 		} 		else 		{ 			k = next[k]; 		} 	} }  int KMP(const char *Text,const char* Pattern) //const 表示函数内部不会改变这个参数的值。 { 	if( !Text||!Pattern||  Pattern[0]=='\0'  ||  Text[0]=='\0' )// 		return -1;//空指针或空串，返回-1。 	int len=0; 	const char * c=Pattern; 	while(*c++!='\0')//移动指针比移动下标快。 	{     		++len;//字符串长度。 	} 	int *next=new int[len+1]; 	get_nextval(Pattern,next);//求Pattern的next函数值 	 	int index=0,i=0,j=0; 	while(Text[i]!='\0'  && Pattern[j]!='\0' ) 	{ 		if(Text[i]== Pattern[j]) 		{ 			++i;// 继续比较后继字符 			++j; 		} 		else 		{ 			index += j-next[j]; //已匹配数 			if(next[j]!=-1) 			{ 				j=next[j];// 模式串向右移动 			} 			else 			{ 				j=0; 				++i; 			} 		} 	}//while 	 	delete []next; 	if(Pattern[j]=='\0') 		return index;// 匹配成功 	else 		return -1;       } int main()//abCabCad { 	char* text="l love youyouyour";     char*pattern="your"; 	//getNext(pattern,n);     //get_nextval(pattern,n); 	cout<<KMP(text,pattern)<<endl; 	return 0; }

user: user-0
content: 引用 6 楼 SKATE11 的回复:#include <iostream.h> #include <string.h>  void get_nextval(const char *T, int next[]) { 	// 求模式串T的next函数值并存入数组 next。 	int j = 0, k = -1; 	next[0] = -1; 	while ( T[j] != '\0' ) 	{ 		 		if (k == -1 || T[j] == T[k]) 		{ 			++j; ++k; 			if (T[j]!=T[k]) 				next[j] = k; 			else 				next[j] = next[k]; 			cout<<next[j]<<"  "; 		 		} 		else 		{ 			k = next[k]; 		} 	} }  int KMP(const char *Text,const char* Pattern) //const 表示函数内部不会改变这个参数的值。 { 	if( !Text||!Pattern||  Pattern[0]=='\0'  ||  Text[0]=='\0' )// 		return -1;//空指针或空串，返回-1。 	int len=0; 	const char * c=Pattern; 	while(*c++!='\0')//移动指针比移动下标快。 	{     		++len;//字符串长度。 	} 	int *next=new int[len+1]; 	get_nextval(Pattern,next);//求Pattern的next函数值 	 	int index=0,i=0,j=0; 	while(Text[i]!='\0'  && Pattern[j]!='\0' ) 	{ 		if(Text[i]== Pattern[j]) 		{ 			++i;// 继续比较后继字符 			++j; 		} 		else 		{ 			index += j-next[j]; //已匹配数 			if(next[j]!=-1) 			{ 				j=next[j];// 模式串向右移动 			} 			else 			{ 				j=0; 				++i; 			} 		} 	}//while 	 	delete []next; 	if(Pattern[j]=='\0') 		return index;// 匹配成功 	else 		return -1;       } int main()//abCabCad { 	char* text="l love youyouyour";     char*pattern="your"; 	//getNext(pattern,n);     //get_nextval(pattern,n); 	cout<<KMP(text,pattern)<<endl; 	return 0; } 仁兄，看清帖子好么？？！ 谢谢

user: user-0
content: 引用 4 楼 diplopod 的回复:你可以试下用Sunday匹配算法，比KMP要简单并且速度快。  嗯，谢谢，  其实，我这项目最适合用最大公共子串解决  只不过原来用的KMP  暂时没决定换哪种更好的解决方案呢

user: user-3
content: 你可以试下用Sunday匹配算法，比KMP要简单并且速度快。

user: user-0
content: 引用 2 楼 xiayuanzhong 的回复:字符串的模式匹配终究是匹配字符串，匹配条件都是求相等序列，就算是int数组也都是一个流程，感觉不能怎么优化。  要说优化的话，只能从存储方式下手，位运算效率最高，比较二进制还是应该在位作为单位的环境下存储和比较。  lz把二进制转成数组，最终还要转成二进制的吧，效率多低。 谢谢！  我的原始数据就是bit流，所以不是比较将整形数据转化为二进制之后用二进制比较的  而是取到bit流之后开始匹配  因为我想着二进制串组成就只有1和0  其实，就想问，模式串的Next数组值与组成模式串的字符种类的多少是否有关系呢

user: user-0
content: //