游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5868|回复: 12

字符串匹配算法

[复制链接]

139

主题

2005

帖子

2057

积分

金牌会员

Rank: 6Rank: 6

积分
2057
QQ
发表于 2005-3-24 08:12:00 | 显示全部楼层 |阅读模式
我们假设要在字符串dest里寻找子串op。OK,展开我们的讨论。

传统的匹配算法是从dest的开头与op进行比较,若匹配就返回true,若不匹配就从dest的下一个字符开始继续匹配。可以想象,若dest的长度是N,op的长度是M,这将是O(M*N)的时间复杂度。确实比较难以接受。于是我考虑了以下算法。

首先仍然是从dest的开头进行匹配,若遇到某个字符不匹配,那么我们就从该字符的下一个字符开始匹配。为什么可以这么做?很好理解。手画一下,假设是从p处开始进行匹配,在q处失配,那么你可以看到,把op在p到q内向右平移,不管怎么移动都是不会匹配的。手画一下就很好理解了。那么基于以上原理,我们可以进行以下算法。可以在O(M+N)的时间复杂度内匹配执行完毕……似乎是这个复杂度~呵呵



StringSubString PROC FAR



获得dest与op的长度

初始化p=0



While (dest[p]!=’\0’)

Begin

从p开始匹配op

如果在i处(距op头的偏移量)不匹配

Begin

  if(i==0) ++pos
else
  Pos+=i

Else //字符仍然匹配

  如果i已经是op的最后一个字符了 那么显然匹配成功 ,return true

End

End



Return false

StringSubString ENDP



这就是我写出的伪代码……顺便附上可执行的代码。考虑到这种字符串操作、内存操作这类函数非常常用,所以个人觉得有汇编写的必要。看了一下VS.NET 2003生成的汇编代码,在release下打开所有可能优化选项代码还比较满意。其他情况……略…… DDD

本人语文还是比较差滴……所以有什么错误和问题,请让我知道……谢谢



樱,于2005-3-24 清晨8点2夜没睡时
[em17] [em17]

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2005-3-24 08:44:00 | 显示全部楼层

Re:字符串匹配算法

:) 你可以去看看KMP算法,在The Art of Computer Programming一书中有介绍,个人记得好象是在第一卷,网上也有很多KMP的介绍。

13

主题

153

帖子

153

积分

注册会员

Rank: 2

积分
153
QQ
发表于 2005-3-24 11:46:00 | 显示全部楼层

Re:字符串匹配算法

难道 tarkey 把 The Art of Computer Programming 看完了? 厉害!比尔老兄说你看完这套书就可以直接找他面试了...

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2005-3-24 13:25:00 | 显示全部楼层

Re:字符串匹配算法

呵呵,我要有功力把那套书看完了,也就不会沉迷与项目和各种实现,而是专心做研究去了。

139

主题

2005

帖子

2057

积分

金牌会员

Rank: 6Rank: 6

积分
2057
QQ
 楼主| 发表于 2005-3-24 16:00:00 | 显示全部楼层

Re:字符串匹配算法

早晨迷糊中居然把伪代码写错了……已经做了修正……

4

主题

14

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2005-3-24 19:12:00 | 显示全部楼层

Re:楼主,我想匹配这样一个字符串

在aaaab中
匹配 aaab的子串。

4

主题

14

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2005-3-24 19:14:00 | 显示全部楼层

同时请对这篇文章的算法给点意见

http://blog.vckbase.com/panic/archive/2005/03/11/3505.html

139

主题

2005

帖子

2057

积分

金牌会员

Rank: 6Rank: 6

积分
2057
QQ
 楼主| 发表于 2005-3-24 19:37:00 | 显示全部楼层

Re:字符串匹配算法

ft。
回头重搞!

33

主题

669

帖子

669

积分

高级会员

Rank: 4

积分
669
QQ
发表于 2005-3-25 11:30:00 | 显示全部楼层

Re:字符串匹配算法

KMP强

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
QQ
发表于 2005-3-25 14:28:00 | 显示全部楼层

Re:字符串匹配算法

<string.H>中有专门的函数 strstr() 就是这个功能,似乎是用KMP写的,O(m+n)的效率
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-24 23:16

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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