340 likes | 490 Views
精确搜索. 邹权 博士、助理教授 http://datamining.xmu.edu.cn. 介绍. 数据挖掘 数据搜索 (与数据库相关) 数据分析 (与机器学习相关) 举例 给定一段 DNA 序列,找出特定的基因 在互联网中,找出与“刘德华、朱丽倩婚姻相关”的网页. 精确搜索. 最简单、也是最难的问题 字符串精确匹配( Exact String Matching )问题可以描述如下:给定一个 长字符串 T 和一个 短字符串 P ,其中它们的长度分别是 |T|=m, |P|=n ,利用 最理想的时间和空间 找出全部的 T 中与 P 完全匹配的子串。
E N D
精确搜索 邹权 博士、助理教授 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的最右端的位置。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
[思想]令S=P$T,其中$是特殊字符,在S和T中都不存在。利用Z算法计算Zi(S)。[思想]令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
传统的模式匹配算法缺点 在第一次匹配之后就已经预知了后移一位后匹配的失败 a≠b http://datamining.xmu.edu.cn
如何避免冗余匹配? 冗余匹配 删除! 直接前移2位 怎么判断匹配是冗余的? 通过模式串自身信息确定 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算法思想 直接滑到第一个最长完全匹配出现位置 节省了匹配相同字符的时间 直接匹配第3位 http://datamining.xmu.edu.cn
KMP算法示例 在已匹配过区域中不用重复匹配 已完成的匹配中没有相同的前缀串出现 前滑j-N[j]=2-0位 http://datamining.xmu.edu.cn
KMP算法示例 直接前滑2位,错开匹配过区域 http://datamining.xmu.edu.cn
KMP算法示例 已匹配区域为0 http://datamining.xmu.edu.cn
KMP算法示例 前滑1位 前滑j-N[j]=1-0位 http://datamining.xmu.edu.cn
KMP算法示例 前滑1位 http://datamining.xmu.edu.cn
KMP算法示例 完成匹配 前滑j-N[j]=4-2位 http://datamining.xmu.edu.cn
[real-time]对于T的任意位置,如果第一次检测它,也就是最后一次检测它(就是说对每一位最多只比较一次),则说它是real-time.[real-time]对于T的任意位置,如果第一次检测它,也就是最后一次检测它(就是说对每一位最多只比较一次),则说它是real-time. • [意义]1. 对于一个小内存机器,在下一个字符读入之前,要保证上一个字符已经处理完毕。 2. 在确定的实例中,real-time方法应该运行的更快一些。 http://datamining.xmu.edu.cn
Knuth-Morris-Pratt算法不是real-time的。因为对于不匹配的位置,还至少要再比较一次。Knuth-Morris-Pratt算法不是real-time的。因为对于不匹配的位置,还至少要再比较一次。 • 如何 把Knuth-Morris-Pratt算法转变成一个real-time方法? http://datamining.xmu.edu.cn
[定义]x是字母表中的一个字符,sp`(i,x)(P)=sp`i(P)并且P(sp`i+1)=x[定义]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)即可。显然这种方法是real-time的. 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(n)。 • 关键字树建立起来以后,对于普通的搜索方法时间复杂性是O(mb),其中b=max|Pi|。然而,我们可以利用失效链接(failure link)技术来加速搜索过程。 • 失效链接的前提是在P中不存在一个模式是另一个模式的子串! http://datamining.xmu.edu.cn
定义1:L(v)表示从根结点到结点v的字符连接起来得到的字符串。定义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的nv.失效链接的建立算法的关键是在线性时间内得到所有的失效链接,可以采用归纳的思想:若v是根r,或v是r的儿子,则nv=r;假设距根结点的距离小于等于k的所有的结点v的nv都已经计算出来,我们现在计算据r的距离为k+1的结点v的nv. http://datamining.xmu.edu.cn
假设所求的结点为v(距r为k+1的结点),他的父亲是v’,v’到v这条边所标定的字母是x,假设所求的结点为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