KMP二进制算法在文件搜索中的应用
#defineARRAY_NUM(a)((sizeof(a))/(sizeof(a[0])))typedefunsignedcharbyte;voidgetnext_bin(bytesub[],intsubSize,intnext[]){//得到next数据,其实本质是自身KMP匹配printf("subbinarray:");inti,j;i=0;j=-1;next[0]=-1;TRACE(_T("%d\n"),next[i]);while(i+1<subSize){if(j==-1||sub[i]==sub[j]){++i;++j;#if1if(sub[i]!=sub[j]){next[i]=j;}else{next[i]=next[j];}#elsenext[i]=j;#endifTRACE(_T(",%d\n"),next[i]);}else{j=next[j];}}printf("\n");}intkmp_bin(bytemain[],intmainSize,bytesub[],intsubSize,intnext[]){//返回s在m中的第一个数据的下标inti,j;i=0;j=0;intnIndex=-1;while(i<mainSize){if(j==-1||main[i]==sub[j]){++i;++j;if(j==subSize){nIndex=(i-j);break;}}else{j=next[j];}}returnnIndex;}
调用方法:
voidCtestDlg::OnBnClickedButton2(){FILE*fp;_wfopen_s(&fp,_T("c:\\Install.exe"),_T("rb"));fseek(fp,0,SEEK_END);INTlength=ftell(fp);fseek(fp,0,SEEK_SET);byte*pBuff=newbyte[length];memset(pBuff,0,length);fread(pBuff,length,1,fp);bytet[]={";!@Install@!UTF-8!;!@InstallEnd@!"};//二进制序列的KMPintnext[ARRAY_NUM(t)]={0};getnext_bin(t,sizeof(t),next);TRACE("kmp_bin=%d\n",kmp_bin(pBuff,length,t,33,next));fclose(fp);delete[]pBuff;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。