精确搜索

Download Report

Transcript 精确搜索

精确搜索
邹权
博士、助理教授
http://datamining.xmu.edu.cn
http://datamining.xmu.edu.cn
介绍
 数据挖掘
 数据搜索 (与数据库相关)
 数据分析 (与机器学习相关)
 举例
 给定一段DNA序列,找出特定的基因
 在互联网中,找出与“刘德华、朱丽倩婚姻相关”的
网页
http://datamining.xmu.edu.cn
精确搜索
 最简单、也是最难的问题
 字符串精确匹配(Exact String Matching)问题
可以描述如下:给定一个长字符串T和一个短字
符串P,其中它们的长度分别是|T|=m, |P|=n,利
用最理想的时间和空间找出全部的T中与P完全匹
配的子串。
 习惯的表示方法:字符串T/P中的第i个字符用T(i)
来表示。
http://datamining.xmu.edu.cn
精确搜索
Z-box算法
BMP算法
AC算法
http://datamining.xmu.edu.cn
Z-Box算法
 [定义]Zi(S)表示在字符串S中从第i位起与S的前缀匹配的
最长的字符串的长度。(数值)
 注:如果S在上下文中很明显,Zi(S)可以用Zi来表示。
 例:S=a a b c a a b x a a z
那么
1 2 3 4 5 6 7 8
 Z5(S)=3; Z6=1;Z7= Z8=0
http://datamining.xmu.edu.cn
 Z-box:其中每个与前缀匹配的子串就叫一个Z-box。
对于任意数字i,如果S(i)属于某一个Z-box,则定
义Li表示该Z-box的最左端的位置,Ri表示该Z-box的
最右端的位置。
 例:在上例中L6=5 R6=7
 性质:if i>j,then Ri>=Rj (画图、反证可得)
http://datamining.xmu.edu.cn
[任务] 在线性时间内(O|S|)计算S
的所有Zi
[思想] Z2正常计算,然后归纳计算Zk
,可以减少比较的次数
http://datamining.xmu.edu.cn
http://datamining.xmu.edu.cn
[思想]令S=P$T,其中$是特殊字符,在S和
T中都不存在。利用Z算法计算Zi(S)。
[方案]对于任意j,如果Zn+1+j(S)=n,则P出
现在T(j)处。
[加强]因为$的设定,对于任意i都有Zi<n,
即k`总落在P内,所以当k>n时(即在T中
)Zk值不用计算,只需要维持(maintain
)R和L的值。
http://datamining.xmu.edu.cn
KMP算法
 [名称] Knuth-Morris-Pratt算法
高德纳(1938年1月10日),出生于密尔沃基,美国著名计算机科学家,斯坦
福大学计算机系荣誉退休教授。高德纳教授被誉为现代计算机科学的鼻祖,
在计算机科学及数学领域发表了多部具广泛影响的论文和著作。
高德纳最为人知的事迹是,他是《计算机程序设计艺术》的作者。此书是计
算机科学界最受高度敬重的参考书籍之一。他创造了算法分析的领域,在数
个理论计算机科学的分支做出初步贡献,此外还是排版软件TEX的发明人。
“高德纳”这个中文名字是1977年他访问中国之前所取的,命名者是储枫(
姚期智的夫人,夫妇都是计算机科学家)。
 [特点]从左向右移动,从左向右比较
http://datamining.xmu.edu.cn
传统的模式匹配算法缺点
1 2
3
4
5
6
7
8
9 10 11 12 13
a b
c
a
c
a b a b a b
c
b
a b a b c
a
b
a
a
b
b
a
在第一次匹配
之后就已经预
知了后移一位
后匹配的失败
c
b
c
a≠b
http://datamining.xmu.edu.cn
如何避免冗余匹配?
1 2
3
4
5
6
a b
c
a
c
a b a b a b
冗余匹配
删除!
直接前移2位
怎么判断匹配
通过模式串自
是冗余的?
身信息确定
a
7
8
9 10 11 12 13
b
a
b
c
a
b
a
b
c
a
b
a
b
c
b
c
http://datamining.xmu.edu.cn
冗余匹配的判断
上一次匹配得到的匹配信息
模式串自身的信息
哪些信息?
模式串自身子
串间匹配信息
http://datamining.xmu.edu.cn
 [定义]对于P中的每个位置i, spi(P)为P[1...i]中最
长后缀的长度,该后缀与P的一个前缀匹配[数值]
 [注]对于任意串sp1=0
 [例]
1 2 3 4 5 6 7 8 9 0 1
P= a b c a e a b c a b d
sp2=sp3=0; sp4=1; sp8=3; sp10=2
 [定义]对于P中的每个位置i ,spi`(P)为P[1...i]中最
长后缀的长度,该后缀与P的一个前缀匹配,并且
P(i+1)≠P(sp`i+1)
 [例]上例中sp`8=0,
sp`9=4
http://datamining.xmu.edu.cn
 [转移规则] 对于P和T,如果P(i+1)≠T(k),则将
P[1…sp`i]移到T[k- sp`i...k-1]下面,也就是将P向右
移了i- sp`i步,然后比较P(sp`i+1)和T(k);如果发现
了一个P在T中,将P向右移动n-sp`n步
 [优点]移动之后,前sp`个字符不用再比较了,直接比
较P(sp`i+1)和T(k)就可以了
 [定理]在Knuth-Morris-Pratt算法中,字符比较的次
数最多是2m
http://datamining.xmu.edu.cn
KMP算法思想
1 2
3
4
5
6
a b
c
a
c
a b a b a b
a
a
b
a
7
b
8
9 10 11 12 13
a
b
c
a
b
a
c
b
b
直接滑到第一
节省了匹配相
个最长完全匹
同字符的时间
配出现位置
b
c
直接匹配第3
位
http://datamining.xmu.edu.cn
KMP算法示例
1 2
3
4
5
6
7
8
9 10 11 12 13
a b
c
a
c
a b a b a b
c
b
a b a b c
1 2
3 4
5
N向量 0 0 1 2 0
在已匹配过区
已完成的匹配
域中不用重复
中没有相同的
前缀串出现
匹配
前滑j-N[j]=2-0位
http://datamining.xmu.edu.cn
KMP算法示例
1 2
3
4
5
6
7
a b
c
a
c
a b a b a b
a b a b c
8
9 10 11 12 13
c
b
直接前滑2位,
错开匹配过区
域
a b a b c
http://datamining.xmu.edu.cn
KMP算法示例
1 2
3
4
5
6
7
8
a b
c
a
c
a b a b a b
a b a b c
a b a b c
9 10 11 12 13
c
b
已匹配区域为
0
http://datamining.xmu.edu.cn
KMP算法示例
1 2
3
4
5
6
7
8
9 10 11 12 13
a b
c
a
c
a b a b a b
c
b
a b a b c
a
1 2
N向量 0
0
3 4
5
1
0
2
b
a
b
c
前滑1位
前滑j-N[j]=1-0位
http://datamining.xmu.edu.cn
KMP算法示例
1 2
3
4
5
6
7
8
9 10 11 12 13
a b
c
a
c
a b a b a b
c
b
a b a b c
a
b
a
b
c
前滑1位
http://datamining.xmu.edu.cn
KMP算法示例
1 2
3
4
5
6
a b
c
a
c
a b a b a b
a
7
b
8
a
9 10 11 12 13
b
c
b
c
a b a b c
1 2
3 4
5
完成匹
配
N向量 0 0 1 2 0
前滑j-N[j]=4-2位
http://datamining.xmu.edu.cn
 [real-time]对于T的任意位置,如果第一次检测它,
也就是最后一次检测它(就是说对每一位最多只比较一
次),则说它是real-time.
 [意义]1. 对于一个小内存机器,在下一个字符读入之前
,要保证上一个字符已经处理完毕。
2. 在确定的实例中,real-time方法应该运行的更
快一些。
http://datamining.xmu.edu.cn
Knuth-Morris-Pratt算法不是realtime的。因为对于不匹配的位置,还
至少要再比较一次。
如何 把Knuth-Morris-Pratt算法转
变成一个real-time方法?
http://datamining.xmu.edu.cn
 [定义]x是字母表中的一个字符,sp`(i,x)(P)=sp`i(P)
并且P(sp`i+1)=x
 [思想]P同T进行比较,T(k)=x处与P(i+1)不匹配,
那么P向右移动i- sp`(i,x)步。这样
T(k)=P(sp`(i,x)+1)=x不用比较,直接比较
P(sp`(i,x)+2)和T(k+1)即可。显然这种方法是realtime的.
http://datamining.xmu.edu.cn
关键字树 (Trie)
[目标]在一个目标序列中搜索多个
查询序列的完全匹配
[算法] Aho-Corasick算法
[数据结构]关键字树
http://datamining.xmu.edu.cn
[定义]集合P的关键字树(keyword tree)是
一棵有根树,它的根记为K,满足
1. 每一条边都标定一个字母
2. 从同一结点分开的任意两条边对应着不同的
字母
3. 每一个字符串Pi都对应着一个结点v,从树根
K出发到达v的路径可以恰好正确地拼出字符串
Pi,并且树K的每一个叶结点都对应P的某一个
模式。
http://datamining.xmu.edu.cn
P={potato,poetry,pottery,science,school}的关键字树
http://datamining.xmu.edu.cn
很容易看出构造一颗关键字树的时间复杂
性是O(n)。
关键字树建立起来以后,对于普通的搜索
方法时间复杂性是O(mb),其中b=max|Pi|。
然而,我们可以利用失效链接(failure link)
技术来加速搜索过程。
失效链接的前提是在P中不存在一个模式是
另一个模式的子串!
http://datamining.xmu.edu.cn
 定义1:L(v)表示从根结点到结点v的字符连接起来
得到的字符串。
 定义2:lp(v)表示L(v)中最长后缀的长度,该后缀
是P中某个模式的前缀。(数值)
L(v)=potat
lp(v)=|tat|=3
http://datamining.xmu.edu.cn
定义3 :α表示字符串L(v)的长为
lp(v)的后缀,那么在关键字树中有
唯一的结点标定α。该唯一的结点
记为nv。当lp(v)=0时,nv就是跟节
点K。
定义4:有序对(v,nv)称为一个失效
链接.
http://datamining.xmu.edu.cn
失效链接的建立算法的关键是在
线性时间内得到所有的失效链接,
可以采用归纳的思想:若v是根r,
或v是r的儿子,则nv=r;假设距根
结点的距离小于等于k的所有的结
点v的nv都已经计算出来,我们现
在计算据r的距离为k+1的结点v的
http://datamining.xmu.edu.cn
假设所求的结点为v(距r为k+1的结点
),他的父亲是v’,v’到v这条边所标
定的字母是x,
①若nv’的下一个字符有x,则设该边的
另一个结点为w’,即有nv=w’
②若nv’到它所有儿子的边所标定的字母
均不是x,则字符串L(nv)(表示从根结
点到nv所标定的字符串)是L(nv’)的一个
后缀跟上x,又因为该后缀与根结点开
始的字符串匹配(类似前缀)所以可
以检测 后面是否有x,如果没有则继续
下去。
http://datamining.xmu.edu.cn
该算法的主要思想是将集合P构造成一
棵关键字树,利用Aho-Corasick算法
和失效链接在线性时间内完成搜索。
该算法的时间复杂性是O(m+n+k),其
中k为P在T中出现的次数。其中预处
理阶段的时间复杂性是O(n),搜索阶段
的时间复杂性是O(m+k)
http://datamining.xmu.edu.cn