精确搜索

34
http://datamining.xmu.edu.cn 精精精精 邹邹 邹邹 邹邹邹邹 http://datamining.xmu.edu.cn

description

精确搜索. 邹权 博士、助理教授 http://datamining.xmu.edu.cn. 介绍. 数据挖掘 数据搜索 (与数据库相关) 数据分析 (与机器学习相关) 举例 给定一段 DNA 序列,找出特定的基因 在互联网中,找出与“刘德华、朱丽倩婚姻相关”的网页. 精确搜索. 最简单、也是最难的问题 字符串精确匹配( Exact String Matching )问题可以描述如下:给定一个 长字符串 T 和一个 短字符串 P ,其中它们的长度分别是 |T|=m, |P|=n ,利用 最理想的时间和空间 找出全部的 T 中与 P 完全匹配的子串。 - PowerPoint PPT Presentation

Transcript of 精确搜索

Page 1: 精确搜索

http://datamining.xmu.edu.cn

精确搜索

邹权

博士、助理教授

http://datamining.xmu.edu.cn

Page 2: 精确搜索

http://datamining.xmu.edu.cn

介绍

数据挖掘

数据搜索 (与数据库相关)

数据分析 (与机器学习相关)

举例

给定一段 DNA 序列,找出特定的基因

在互联网中,找出与“刘德华、朱丽倩婚姻相关”的网页

Page 3: 精确搜索

http://datamining.xmu.edu.cn

精确搜索 最简单、也是最难的问题

字符串精确匹配(字符串精确匹配( Exact String MatchingExact String Matching )问题)问题可以描述如下:给定一个可以描述如下:给定一个长字符串长字符串 TT 和一个和一个短字短字符串符串 PP ,其中它们的长度分别是,其中它们的长度分别是 |T|=m, |P|=n|T|=m, |P|=n ,,利用利用最理想的时间和空间最理想的时间和空间找出全部的找出全部的 TT 中与中与 PP 完完全匹配的子串。全匹配的子串。

习惯的表示方法:字符串习惯的表示方法:字符串 TT/P/P 中的第中的第 ii 个字符用个字符用 TT

(i)(i) 来表示来表示。。

Page 4: 精确搜索

http://datamining.xmu.edu.cn

精确搜索

Z-box 算法

BMP 算法

AC 算法

Page 5: 精确搜索

http://datamining.xmu.edu.cn

[[ 定义定义 ]]ZZii(S)(S) 表示在字符串表示在字符串 SS 中从第中从第 ii 位起与位起与 SS 的前缀匹的前缀匹

配的最长的字符串的长度。配的最长的字符串的长度。(数值)(数值)

注:如果注:如果 SS 在上下文中很明显,在上下文中很明显, ZZii(S)(S) 可以用可以用 ZZii 来表示。来表示。

例:例: S=a a b c a a b x a a z S=a a b c a a b x a a z 那么 那么

1 2 3 4 1 2 3 4 5 6 7 85 6 7 8

ZZ55(S)=3(S)=3 ; ; ZZ66=1=1 ;; ZZ77= Z= Z88=0=0

Z-Box 算法

Page 6: 精确搜索

http://datamining.xmu.edu.cn

Z-boxZ-box :其中每个与前缀匹配的子串就叫一个:其中每个与前缀匹配的子串就叫一个 Z-boxZ-box。对于任意数字。对于任意数字 ii ,如果,如果 SS (( ii )属于某一个)属于某一个 Z-boxZ-box ,,则定义则定义 LLii 表示该表示该 Z-boxZ-box 的最左端的位置,的最左端的位置, RRii 表示该表示该 Z-Z-boxbox 的最右端的位置。的最右端的位置。

例:在上例中例:在上例中 LL66=5 R=5 R66=7=7

性质:性质: if i>j,then Rif i>j,then Rii>=R>=Rjj (画图、反证可得)(画图、反证可得)

Page 7: 精确搜索

http://datamining.xmu.edu.cn

[[ 任务任务 ]] 在线性时间内(在线性时间内( O|S|O|S| )计算)计算SS 的所有的所有 ZZii

[[ 思想思想 ]] Z Z22 正常计算,然后归纳计算正常计算,然后归纳计算 ZZkk

,可以减少比较的次数,可以减少比较的次数

Page 8: 精确搜索

http://datamining.xmu.edu.cn

Page 9: 精确搜索

http://datamining.xmu.edu.cn

[[ 思想思想 ]] 令令 S=P$T,S=P$T, 其中其中 $$ 是特殊字符,在是特殊字符,在 SS

和和 TT 中都不存在。利用中都不存在。利用 ZZ 算法计算算法计算 ZZii(S)(S) 。。

[[ 方案方案 ]] 对于任意对于任意 jj ,如果,如果 ZZn+1+jn+1+j(S)=n,(S)=n, 则则 PP

出现在出现在 T(j)T(j) 处。处。

[[ 加强加强 ]] 因为因为 $$ 的设定,对于任意的设定,对于任意 ii 都有都有 ZZii<<

n,n, 即即 k`k` 总落在总落在 PP 内,所以当内,所以当 k>nk>n 时(即在时(即在TT 中)中) ZZkk 值不用计算,只需要维持(值不用计算,只需要维持( mainmain

taintain )) RR 和和 LL 的值。的值。

Page 10: 精确搜索

http://datamining.xmu.edu.cn

KMP 算法 [[ 名称名称 ]] Knuth-Morris-Pratt Knuth-Morris-Pratt 算法算法

高德纳( 1938 年 1 月 10 日),出生于密尔沃基,美国著名计算机科学家,斯坦福大学计算机系荣誉退休教授。高德纳教授被誉为现代计算机科学的鼻祖,在计算机科学及数学领域发表了多部具广泛影响的论文和著作。

高德纳最为人知的事迹是,他是《计算机程序设计艺术》的作者。此书是计算机科学界最受高度敬重的参考书籍之一。他创造了算法分析的领域,在数个理论计算机科学的分支做出初步贡献,此外还是排版软件TEX 的发明人。

“ 高德纳”这个中文名字是 1977 年他访问中国之前所取的,命名者是储枫(姚期智的夫人,夫妇都是计算机科学家)。

[[ 特点特点 ]] 从左向右移动,从左向右比较 从左向右移动,从左向右比较

Page 11: 精确搜索

http://datamining.xmu.edu.cn

传统的模式匹配算法缺点传统的模式匹配算法缺点

a b a b c

a b a b c

a≠b

在第一次匹配之后就已经预知了后移一位后匹配的失败

a b a b c

1 2 3 4 5 6 7 8 9 10 11 12 13

a b c a bac ba a b bc

Page 12: 精确搜索

http://datamining.xmu.edu.cn

如何避免冗余匹配?如何避免冗余匹配?

a b a b c

a b a b c

1 2 3 4 5 6 7 8 9 10 11 12 13

a b c a bac ba a b bc

a b a b c

冗余匹配删除!

直接前移 2位

怎么判断匹配是冗余的?通过模式串自身信息确定

Page 13: 精确搜索

http://datamining.xmu.edu.cn

冗余匹配的判断冗余匹配的判断

上一次匹配得到的匹配信息上一次匹配得到的匹配信息

模式串自身的信息模式串自身的信息模式串自身子串间匹配

信息哪些信息?

Page 14: 精确搜索

http://datamining.xmu.edu.cn

[[ 定义定义 ]] 对于对于 PP 中的每个位置中的每个位置 i, spi, spii(P)(P) 为为 P[1...i]P[1...i] 中最中最长后缀的长后缀的长度长度,该后缀与,该后缀与 PP 的一个前缀匹配的一个前缀匹配 [[ 数值数值 ]]

[[ 注注 ]] 对于任意串对于任意串 spsp11=0=0 [[ 例例 ]] 1 2 3 4 5 6 7 8 9 0 1 1 2 3 4 5 6 7 8 9 0 1 P= a b c a e a b c a b d P= a b c a e a b c a b d

spsp22=sp=sp33=0; sp=0; sp44=1; sp=1; sp88=3; sp=3; sp1010=2 =2 [[ 定义定义 ]] 对于对于 PP 中的每个位置中的每个位置 i ,spi ,spii`(P)`(P) 为为 P[1...i]P[1...i] 中中

最长后缀的长度,该后缀与最长后缀的长度,该后缀与 PP 的一个前缀匹配的一个前缀匹配 ,, 并且并且P(i+1)P(i+1)≠≠P(sp`P(sp`ii+1)+1)

[[ 例例 ]] 上例中上例中 sp`sp`88=0, sp`=0, sp`99=4=4

Page 15: 精确搜索

http://datamining.xmu.edu.cn

[[ 转移规则转移规则 ]] 对于对于 PP 和和 TT ,如果,如果 P(i+1)P(i+1)≠≠T(k)T(k) ,则将,则将P[1…sp`P[1…sp`ii]] 移到移到 T[k- sp`T[k- sp`ii...k-1]...k-1] 下面,也就是将下面,也就是将 PP 向向

右移了右移了 i- sp`i- sp`ii 步,然后比较步,然后比较 P(sp`P(sp`ii+1)+1) 和和 T(k)T(k) ;如果;如果

发现了一个发现了一个 PP 在在 TT 中,将中,将 PP 向右移动向右移动 n-sp`n-sp`nn 步步

[[ 优点优点 ]] 移动之后,前移动之后,前 sp`sp` 个字符不用再比较了,直接个字符不用再比较了,直接比较比较 P(sp`P(sp`ii+1)+1) 和和 T(k)T(k) 就可以了 就可以了

[[ 定理定理 ]] 在在 Knuth-Morris-PrattKnuth-Morris-Pratt 算法中,字符比较的算法中,字符比较的次数最多是次数最多是 2m2m

Page 16: 精确搜索

http://datamining.xmu.edu.cn

KMPKMP 算法思想算法思想

a b a b c

1 2 3 4 5 6 7 8 9 10 11 12 13

a b c a bac ba a b bc

a b a b c直接滑到第一个最长完全匹配出现位置 直接匹配第 3

a b a b

节省了匹配相同字符的时间

Page 17: 精确搜索

http://datamining.xmu.edu.cn

KMPKMP 算法示例算法示例

a b a b c

1 2 3 4 5 6 7 8 9 10 11 12 13

a b c a bac ba a b bc

1 2 3 4 5

0 0 1 2 0N向量

已完成的匹配中没有相同的前缀串

出现

在已匹配过区域中不用重复

匹配前滑 j-N[j]=2-0位

Page 18: 精确搜索

http://datamining.xmu.edu.cn

KMPKMP 算法示例算法示例

a b a b c

1 2 3 4 5 6 7 8 9 10 11 12 13

a b c a bac ba a b bc

直接前滑 2位,错开匹配过区

a b a b c

Page 19: 精确搜索

http://datamining.xmu.edu.cn

KMPKMP 算法示例算法示例

a b a b c

1 2 3 4 5 6 7 8 9 10 11 12 13

a b c a bac ba a b bc

已匹配区域为0

a b a b c

Page 20: 精确搜索

http://datamining.xmu.edu.cn

KMPKMP 算法示例算法示例

a b a b c

1 2 3 4 5

0 0 1 2 0N向量

1 2 3 4 5 6 7 8 9 10 11 12 13

a b c a bac ba a b bc

前滑 1位

a b a b c

前滑 j-N[j]=1-0位

Page 21: 精确搜索

http://datamining.xmu.edu.cn

KMPKMP 算法示例算法示例

a b a b c

1 2 3 4 5 6 7 8 9 10 11 12 13

a b c a bac ba a b bc

前滑 1位a b a b c

Page 22: 精确搜索

http://datamining.xmu.edu.cn

KMPKMP 算法示例算法示例

a b a b c

1 2 3 4 5

0 0 1 2 0N向量

1 2 3 4 5 6 7 8 9 10 11 12 13

a b c a bac ba a b bc

a b a b c

前滑 j-N[j]=4-2位

完成匹配

Page 23: 精确搜索

http://datamining.xmu.edu.cn

[real-time][real-time] 对于对于 TT 的任意位置,如果第一次检测它,的任意位置,如果第一次检测它,也就是最后一次检测它(就是说对每一位最多只比较一也就是最后一次检测它(就是说对每一位最多只比较一次),则说它是次),则说它是 real-time.real-time.

[[ 意义意义 ]]1. 1. 对于一个小内存机器,在下一个字符读入之对于一个小内存机器,在下一个字符读入之前,要保证上一个字符已经处理完毕。前,要保证上一个字符已经处理完毕。

2. 2. 在确定的实例中,在确定的实例中, real-timereal-time 方法应该运行的方法应该运行的更快一些。更快一些。

Page 24: 精确搜索

http://datamining.xmu.edu.cn

Knuth-Morris-PrattKnuth-Morris-Pratt 算法不是算法不是 real-real-timetime 的。因为对于不匹配的位置,还的。因为对于不匹配的位置,还至少要再比较一次。至少要再比较一次。

如何 把如何 把 Knuth-Morris-PrattKnuth-Morris-Pratt 算法转算法转变成一个变成一个 real-timereal-time 方法?方法?

Page 25: 精确搜索

http://datamining.xmu.edu.cn

[[ 定义定义 ]]xx 是字母表中的一个字符,是字母表中的一个字符, sp`sp`(i,x)(i,x)(P)=sp`(P)=sp`ii(P(P

)) 并且并且 P(sp`P(sp`ii+1)=x+1)=x

[[ 思想思想 ]]PP 同同 TT 进行比较,进行比较, T(k)=xT(k)=x 处与处与 P(i+1)P(i+1) 不匹不匹配,那么配,那么 PP 向右移动向右移动 i- sp`i- sp`(i,x)(i,x) 步。这样步。这样 T(k)=P(sp`T(k)=P(sp`

(i,x)(i,x)+1)=x+1)=x 不用比较,直接比较不用比较,直接比较 P(sp`P(sp`(i,x)(i,x)+2)+2) 和和 T(k+1T(k+1

)) 即可。显然这种方法是即可。显然这种方法是 real-timereal-time 的的 ..

Page 26: 精确搜索

http://datamining.xmu.edu.cn

关键字树 关键字树 (Trie)(Trie)

[[ 目标目标 ]] 在一个目标序列中搜索多在一个目标序列中搜索多个查询序列的完全匹配个查询序列的完全匹配

[[ 算法算法 ] ] Aho-CorasickAho-Corasick 算法算法

[[ 数据结构数据结构 ]]关键字树关键字树

Page 27: 精确搜索

http://datamining.xmu.edu.cn

[[ 定义定义 ]] 集合集合 PP 的关键字树(的关键字树( keyword treekeyword tree)是一棵有根树,它的根记为)是一棵有根树,它的根记为 KK ,满足,满足1. 1. 每一条边都标定一个字母每一条边都标定一个字母2. 2. 从同一结点分开的任意两条边对应着不同的从同一结点分开的任意两条边对应着不同的字母字母

3. 3. 每一个字符串每一个字符串 PPii 都对应着一个结点都对应着一个结点 vv ,从树,从树根根 KK 出发到达出发到达 vv 的路径可以恰好正确地拼出字的路径可以恰好正确地拼出字符串符串 PPii ,并且树,并且树 KK 的每一个叶结点都对应的每一个叶结点都对应 PP 的的某一个模式。某一个模式。

Page 28: 精确搜索

http://datamining.xmu.edu.cn

P={potato,poetry,pottery,science,school}P={potato,poetry,pottery,science,school} 的关键字树的关键字树

Page 29: 精确搜索

http://datamining.xmu.edu.cn

很容易看出构造一颗关键字树的时间复杂很容易看出构造一颗关键字树的时间复杂性是性是 O(n)O(n) 。。

关键字树建立起来以后,对于普通的搜索关键字树建立起来以后,对于普通的搜索方法时间复杂性是方法时间复杂性是 O(mb),O(mb), 其中其中 b=max|Pb=max|Pii||。然而,我们可以利用。然而,我们可以利用失效链接失效链接 (failure li(failure link)nk) 技术来加速搜索过程。技术来加速搜索过程。

失效链接的前提是在失效链接的前提是在 PP 中不存在一个模式中不存在一个模式是另一个模式的子串是另一个模式的子串 ! !

Page 30: 精确搜索

http://datamining.xmu.edu.cn

定义定义 11 :: L(v)L(v) 表示从根结点到结点表示从根结点到结点 vv 的字符连接起的字符连接起来得到的来得到的字符串字符串。。

定义定义 22 :: lp(v)lp(v) 表示表示 L(v)L(v) 中最长后缀的长度,该后中最长后缀的长度,该后缀是缀是 PP 中某个模式的前缀。中某个模式的前缀。 (( 数值数值 ))

L(v)=potatL(v)=potat

lp(v)=|tat|=3lp(v)=|tat|=3

Page 31: 精确搜索

http://datamining.xmu.edu.cn

定义定义 3 3 :: αα 表示字符串表示字符串 L(v)L(v) 的长为的长为 ll

p(v)p(v) 的后缀,那么在关键字树中有唯的后缀,那么在关键字树中有唯一的结点标定一的结点标定 αα 。该唯一的结点记为。该唯一的结点记为nnvv 。当。当 lp(v)=0lp(v)=0 时,时, nnvv 就是跟节点就是跟节点 KK

。。

定义定义 44 :有序对:有序对 (v,n(v,nvv)) 称为一个失效称为一个失效

链接链接 ..

Page 32: 精确搜索

http://datamining.xmu.edu.cn

失效链接的建立算法的关键是在线性时失效链接的建立算法的关键是在线性时间内得到所有的失效链接,可以采用归间内得到所有的失效链接,可以采用归纳的思想:若纳的思想:若 vv 是根是根 rr ,或,或 vv 是是 rr 的儿的儿子,则子,则 nnvv=r=r ;假设距根结点的距离小;假设距根结点的距离小

于等于于等于 kk 的所有的结点的所有的结点 vv 的的 nnvv 都已经计都已经计

算出来,我们现在计算据算出来,我们现在计算据 rr 的距离为的距离为 kk

+1+1 的结点的结点 vv 的的 nnvv..

Page 33: 精确搜索

http://datamining.xmu.edu.cn

假设所求的结点为假设所求的结点为 vv (距(距 rr 为为 k+1k+1 的的结点),他的父亲是结点),他的父亲是 v’v’ ,, v’v’ 到到 vv 这条这条边所标定的字母是边所标定的字母是 xx ,,①①若若 nnvv’’ 的下一个字符有的下一个字符有 xx ,则设该边,则设该边

的另一个结点为的另一个结点为 w’w’ ,即有,即有 nnvv=w’=w’

②②若若 nnvv’’ 到它所有儿子的边所标定的字到它所有儿子的边所标定的字母均不是母均不是 xx ,则字符串,则字符串 L(nL(nvv)()( 表示从表示从根结点到根结点到 nnvv 所标定的字符串所标定的字符串 )) 是是 L(nL(nv’v’))的一个后缀跟上的一个后缀跟上 xx ,又因为该后缀与,又因为该后缀与根结点开始的字符串匹配(类似前缀根结点开始的字符串匹配(类似前缀)所以可以检测 后面是否有)所以可以检测 后面是否有 xx ,如果,如果没有则继续下去。没有则继续下去。

Page 34: 精确搜索

http://datamining.xmu.edu.cn

该算法的主要思想是将集合该算法的主要思想是将集合 PP构造成构造成一棵关键字树,利用一棵关键字树,利用 Aho-CorasickAho-Corasick 算算法和失效链接在线性时间内完成搜索法和失效链接在线性时间内完成搜索。该算法的时间复杂性是。该算法的时间复杂性是 O(m+n+k)O(m+n+k)

,其中,其中 kk 为为 PP 在在 TT 中出现的次数。其中出现的次数。其中预处理阶段的时间复杂性是中预处理阶段的时间复杂性是 O(n),O(n), 搜搜索阶段的时间复杂性是索阶段的时间复杂性是 O(m+k) O(m+k)