a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 148|回复: 3

[程序员] 计算机软考程序员辅导:串匹配算法

[复制链接]
发表于 2012-8-2 08:51:15 | 显示全部楼层 |阅读模式
Knuth-Morris-Pratt(缩写KMP)串匹配算法是一个基本的串操作算法,在各种含有串操作的程序中广泛使用。    KMP匹配的最大优点在于——主串无需回溯,故可以用于数据流的匹配,如可顺序读入文件的过程中实现匹配,提示同时它也是各种匹配算法中速度最快的。$ k" Z% S0 V5 O. m- i5 G
    此处给出了算法的C代码。另外,还写了一段汇编优化的参考代码,虽无太大用处但仍可作为汇编优化的参考。9 c* z9 O% q; B- i' N: d3 X

; I) `6 y) E) ?/ j    #define _USEASM_; `! O; n! X  ?
    //求模式串的Next数组
, i9 h% }$ D7 G% m) c    // p: 模式串$ \2 r- G& n2 B/ j0 f
    // lp: 模式串长度# p/ h+ @/ S9 p4 O# }8 X) C3 B
    inline int * getNext(const char * p, int lp=-1)6 P% R/ Q+ Y1 j
    {
. S6 U( G8 }/ J- `& W8 v+ g    if(lp==-1)
0 B$ ~( O' O7 v$ Y3 X    lp=(int)strlen(p);
$ K: x. m$ j6 j' m- ^0 ?    //前一个模式串的Next数组
( P2 S% V+ P# \9 H& l    static int * next=NULL;
3 C" ~' l6 f/ }3 I+ Q    //如果有数据先释放内存
0 F- p# H7 l5 A; j& k    if(next) delete[] next;
% I$ f* ?* R9 y  T8 N" O    //为Next数组分配存储空间
4 [: Z- m) g' H- S4 v1 E) Q    next=new int[lp];
% T9 C* Z( U1 E' H* R    //计算模式串
+ d. ]2 |0 F9 m" A    next[0]=-1;
7 z% P( v4 e+ P+ i4 m' m    int i=0; int j=-1;
1 }: P# r. q% L    while(i
回复

使用道具 举报

 楼主| 发表于 2012-8-2 08:51:16 | 显示全部楼层

计算机软考程序员辅导:串匹配算法

}
# g1 n* [! {$ B; L    else
3 w" v5 a2 R, k3 k5 t) v) T    j=next[j];
% R( l* d0 I: W# ]8 f7 O    }9 K' N, q! O1 u4 }9 H) \
    return next;
, Q# M% ~: @3 o) a: ?, M9 M    }
$ X6 z$ e5 S. x7 L5 J    //Knuth-Morris-Pratt模式匹配算法8 o: r" i; r( X' l& B
    // s: 源串( P9 m. r6 y' \2 {' q  f- C
    // p:模式串
1 v* [' x; J; t; C. R# ]% y: ^, z. X    int instr(const char * s, const char * p). g* K( w- C6 V9 O  T. u+ U8 f
    {. v! U# F5 e3 D9 {+ O" k" \
    int ls=(int)strlen(s);: d4 A0 b, |" Y0 `4 N- u4 V- T" K
    int lp=(int)strlen(p);
2 g! G. n/ L( q  `+ U    int * next=getNext(p,lp);
/ w" Y! K. I: @; j0 N    #ifndef _USEASM_% D  S/ L" W  ~, E* y. O
    int i=0; int j=0;( G$ y3 x6 a4 E& g0 d. L+ [+ Y
    while(i
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-2 08:51:17 | 显示全部楼层

计算机软考程序员辅导:串匹配算法

if(i
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-2 08:51:18 | 显示全部楼层

计算机软考程序员辅导:串匹配算法

cmp ah,al
& T* b6 D3 e* D. l) I    jnz _Else_
6 T& _; w: m. P$ p* @9 M! q    ;_If_
# w" i* ^$ G( }1 B& y7 g# D    inc ebx, o( m& S$ k( d" i1 K/ J, f6 e
    inc ecx7 d9 O$ p; R" u! d  R( R$ W$ T
    jmp _EndIf_3 H' [7 q/ i$ e2 h1 Y4 d. D
    _Else_:& s& `  o7 s3 @, D8 ~
    shl ecx, 2
9 ]: B: @9 x4 P3 t; B* E; X$ \    mov ecx, dword ptr[edx+ecx]  @$ k- `2 l9 ^+ b
    cmp ecx, -1
4 k2 r9 `, R# ]" A1 ]    jnz _EndIf_
" O1 n. W* Y  Y/ ?2 L    inc ebx! R1 Z9 y. t/ M; e9 t
    inc ecx. k- Q+ R0 J& v2 l
    _EndIf_:) w) @- t7 @) q# ~- n- R* w, ~8 [
    jmp _While_
) ~9 @+ c+ s3 p! @    _EndWhile_:& T$ r; l$ R$ {* ^4 q6 h$ E
    _If2_:
! N- E1 e( l' y* d    cmp ebx, dword ptr[ls]
, W% `: [, A' L$ ]* f+ h# O    jge _Else2_- ?. T6 C$ _- o0 c  l" E/ `+ U
    mov eax, ebx
' ~' H( X/ r4 q  d    sub eax, ecx7 {' }! m2 T0 y, ^+ E# l9 z
    jmp _EndIf2_
* o- W, m# G' g/ k. {# D) o    _Else2_:( r6 O$ {+ ^' w2 |1 B
    mov eax, -13 c! ?( @4 \$ T6 m+ y, P5 t
    _EndIf2_:
7 ?( c. Z* x/ b# V    pop edx8 \; V& c- p2 i- ?0 X
    pop ecx
) b6 e& j  {7 i: Y6 N    pop ebx
0 k/ P9 |9 p5 U9 Q! v- {    pop esi/ a8 T1 v% |3 i8 ?0 O& }8 @5 E
    pop edi
' K' u9 H" f. O, o    }
5 P5 F$ h7 }, B+ ~+ P: ^- M    #endif
9 r' T1 ?. u7 a7 b    }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-9-28 01:56 , Processed in 0.503746 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表