zoukankan
html css js c++ java
KMP匹配算法中的失效函数
今天总算是看懂了字符串匹配算法中的KMP,记下来吧,以后查的时候方便
失效函数:设模式 P=p
0
p
1
....p
m-2
p
m-1,
则它的失效函数定义如下:
f(j)=k |当 0<=k<j 时,且使得 p0p1....pk=p
j-k
p
j-k+1
...p
j
的最大数
f(j)= -1 | 其它情况。
j
0
1
2
3
4
5
6
7
p
a
b
a
a
b
c
a
c
f(j)
-1
-1
0
0
1
-1
0
-1
详细的不记了,把算法记下来。
void
String::fail
{
int
lengthP
=
curLen;
f[
0
]
=-
1
;
for
(
int
j
=
1
;j
<
lengthP;j
++
)
{
int
i
=
f[j
-
1
];
while
(
*
(ch
+
j)
!=*
(ch
+
i
+
1
)
&&
i
>=
0
) i
=
f[i] ;
//
递推计算
if
(
*
(ch
+
j)
==*
(ch
+
i
+
1
))f[j]
=
i
+
1
;
elsef[j]
=-
1
;
}
}
下面是普通的匹配算法:
int
String::find(String
&
pat)
const
{
char
*
p
=
pat.ch;
*
s
=
ch;
int
i
=
0
;
if
(
*
p
&&
*
s)
while
(i
<=
curLen
-
pat.curLen)
if
(
*
p
++==*
s
++
)
{
//
C++的精典之处
if
(
!*
p)
return
i;
}
else
{ i
++
; s
=
ch
+
i; p
=
pat.ch; }
return
-
1
;
}
下面是 KMP 算法:
int
String::fastFind(String
&
pat)
const
{
int
posP
=
0
, pasT
=
0
;
int
lengthP
=
pat.curLen, lengthT
=
curLen;
while
(posP
<
lengthP
&&
posT
<
lengthT)
if
(pat.ch[pasP]
==
ch[posT]
{
posP
++
; posT
++
;
}
else
if
(posP
==
0
) posT
++
;
else
posP
=
pat.f[posP
-
1
]
+
1
;
if
(posP
<
lengthP)
return
-
1
;
else
return
posT
-
lengthP;
}
查看全文
相关阅读:
GUID
Castle学习笔记二:框架结构及配置
Linux编程基础
Linux文件编程
单臂路由配置实例
CCNA学习笔记#02第7章操作与配置Cisco IOS
Linux基本命令
Linux系统中rar、unrar命令安装和使用详解
批处理设置IP与DNS服务器
Linux下载安装5笔输入法
原文地址:https://www.cnblogs.com/icehong/p/46613.html
最新文章
CFArrayRef和NSArray
SAX简记
异步IO
Jabber简记
JDMP
【转】HashMap和TreeMap
RMI简记
IntelliJ Idea 常用快捷键列表
【转】统计一篇文章中单词出现的频率(java 版)
IT人 不要一辈子靠技术生存(转)
热门文章
XMPP简记
Tomcat学习(一) Tomcat结构以及处理一个请求的过程(转载忘了出处)
生活琐记
关于IOC和DI的理解
单据页面的显示与打印小结
关于.inc文件
Castle学习笔记三:在Asp.Net页面上得到Castle容器
OnClick与OnClientClick
Castle学习笔记一:基础知识
信任
Copyright © 2011-2022 走看看