通配符匹配

来源:互联网 发布:打谱软件索尼 编辑:程序博客网 时间:2024/05/05 20:37

问题描述:对于一个给定的词典S和一个包含通配符的查询传a*b, 在词典中找出匹配a*b的所有串

 

1. 词典的结构: 对于匹配类,通常来说树结构是适用的

2. 假设词典是树结构,切通配符在串的最后,即类似ab*这样,我们可以从树的根节点开始,沿着ab向下,找到所有的匹配串

3. 那么对于a*b呢? 我们先考虑*ab的情况,如果我们的词典对每个串按反序也建立一颗树,即串abcd,我们有一颗树是d->c->b->a, 我们可以从这颗树去搜索ba,找到所有匹配的串

 

4. 因此对a*b这样的匹配, 我们首先对词典进行处理,从正反两个方向建立一颗B树,然后进行查询

 

 

时间复杂度仅为o(n)

 

但是,如果是a*b*c, 这样的查询应该怎样做呢?

 

首先是查询a*c,然后对查询结果去掉首尾的a,c,检查剩下的中间部分是否包含b

 

对于匹配还有另外两种做法:

1. 对所有词的排列进行索引,并用$表明词的结尾,例如hello$可以变为llo$he,等等,然后对于查询串h*llo, 我们同样地进行移位,变为llo$h*, 然后进行查找,如果是h*l*lo,同样地,我们先查询lo$h,然后在查询串中去寻找l

 

2. 对词进行另外的变化,划分为等长的一些段,并用$表示词的开头和结尾,例如hello, 如果词的长度指定为3,则词被分为$he,hel,ell,llo,lo$, 如果查询h*llo, 则我们时间查询$h,llo,lo$,并把查询所得到的词进行合并

 

第二种方法比第一种方法具有更高的空间效率

原创粉丝点击