a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 134|回复: 3

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

[复制链接]
发表于 2012-8-2 08:51:15 | 显示全部楼层 |阅读模式
Knuth-Morris-Pratt(缩写KMP)串匹配算法是一个基本的串操作算法,在各种含有串操作的程序中广泛使用。    KMP匹配的最大优点在于——主串无需回溯,故可以用于数据流的匹配,如可顺序读入文件的过程中实现匹配,提示同时它也是各种匹配算法中速度最快的。/ c! n5 v: R0 b! ]; ~' X9 P  K
    此处给出了算法的C代码。另外,还写了一段汇编优化的参考代码,虽无太大用处但仍可作为汇编优化的参考。) p. V+ F) A+ B8 y( I% ?

1 ^. ]  G8 r& {1 a7 G    #define _USEASM_
  w3 ~) h( z: N& F    //求模式串的Next数组
1 {% l3 ]1 ~: k    // p: 模式串- a  Q4 @% _; X3 v. U# u8 g5 T
    // lp: 模式串长度6 k* U* }6 Z6 e; \3 M: \8 O' t+ b
    inline int * getNext(const char * p, int lp=-1)
8 E4 \0 x4 e& S% v3 L6 A. M    {  b7 d4 t- f( z1 ^, C) ]
    if(lp==-1)
2 v" U; [4 @. ^5 J( F+ E, h    lp=(int)strlen(p);
; S" d/ z# Q' L  I) [    //前一个模式串的Next数组& s9 f. d* W* r5 X5 n6 M
    static int * next=NULL;- r7 ^( i0 U# V
    //如果有数据先释放内存. X6 L: ?) K- g! J9 U! z4 w$ F2 J
    if(next) delete[] next;2 W  |9 l& x2 z/ A
    //为Next数组分配存储空间  d4 n# J+ a' Z/ U
    next=new int[lp];+ [3 ?; B$ c6 W2 A7 o  `6 v3 X
    //计算模式串
( J$ K/ Y# ^7 t; _+ R2 t    next[0]=-1;- h/ q) k" v: G( F2 ~& L
    int i=0; int j=-1;
8 q" f% ?4 A  T9 Y0 [/ H3 D    while(i
回复

使用道具 举报

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

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

}0 X2 r( i, y. b+ P! z" V9 b
    else
; H+ J' I) c7 U: w' j    j=next[j];2 [' f- ?. A! f$ Y
    }* ^, ^0 [! g( I6 q* E7 k
    return next;2 h2 I4 L7 x1 [" r% u2 A
    }
* j* E6 k' v& [$ m; C5 c2 ~! e    //Knuth-Morris-Pratt模式匹配算法
7 t# @5 M0 W# `" X/ V7 ^% r# X    // s: 源串
. @6 L6 c  b  ]    // p:模式串" \- ^, |6 A& h6 Y( x" }
    int instr(const char * s, const char * p)1 h6 `! B( `; P1 Z' w
    {. X$ _4 g, Z9 f! P5 G% n9 D
    int ls=(int)strlen(s);3 H& j2 Y" a$ r0 P
    int lp=(int)strlen(p);3 [+ Z. P/ O& |7 J
    int * next=getNext(p,lp);3 U9 `3 Q" H. e/ O9 X7 B
    #ifndef _USEASM_! `5 D' t" u& e5 _% Q2 w% r
    int i=0; int j=0;
/ F5 M' |2 n# g( ]5 e& q2 M    while(i
回复 支持 反对

使用道具 举报

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

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

if(i
回复 支持 反对

使用道具 举报

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

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

cmp ah,al6 ]1 @7 ]" P# L( A4 h
    jnz _Else_
* W$ S# D  n; z4 t. {1 B. x    ;_If_
* J( y8 H& \. x5 Z4 a    inc ebx
1 W# H/ N, L) O9 i6 l9 r/ o    inc ecx
+ T' [3 \0 {: s, q  d+ e3 j    jmp _EndIf_
- W+ j5 T- n* U  f    _Else_:/ w1 ]6 \- \  _/ A" m
    shl ecx, 2( C& ^! H( b  a
    mov ecx, dword ptr[edx+ecx]7 |8 ?) [/ f8 `# {3 r. B1 d
    cmp ecx, -17 D2 E1 F  \# p9 Y
    jnz _EndIf_. E1 c6 I0 S! {; l6 ~
    inc ebx
7 s, j: m  W* f* S9 K    inc ecx9 q# Y% J2 {, P
    _EndIf_:
% ?+ A" R0 Y* W) s0 }    jmp _While_( ^, C9 r- t( q% x5 H) u3 Q% v
    _EndWhile_:* I; k1 I9 i: C: i6 e" t7 i
    _If2_:
0 W3 N. q6 J: N- i# c    cmp ebx, dword ptr[ls]
5 `- {7 u. s9 k    jge _Else2_5 }7 P8 E- h+ L5 _
    mov eax, ebx6 S; |+ P' U4 P$ K% v- X
    sub eax, ecx
3 G9 ]: M( K/ t: ~    jmp _EndIf2_
' ]/ `2 h5 @7 [3 o2 e" E* h    _Else2_:
" e0 G6 I2 d5 M) `; b6 s    mov eax, -1
* S/ v; b" Y9 u+ i6 K% W0 h! a# R    _EndIf2_:4 u: V3 S: x+ j9 T! U# a8 U, n
    pop edx
$ @' p0 [7 y- S1 i* s1 C4 [: T- n9 x    pop ecx4 e# K; F" X5 M: y  H, n# u1 ]$ m
    pop ebx
2 n6 Y: `! t2 y    pop esi
9 e7 t2 a- H! s2 @6 }7 M4 z3 F    pop edi
% P" k" n4 U: N/ H    }
/ b" i7 M+ F; ~' U/ e6 o- |# q    #endif: L& J! M0 p2 Q- X
    }
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-17 18:06 , Processed in 0.407628 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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