首页 > 编程知识 正文

java版的ac多模式匹配算法的简单介绍

时间:2023-12-24 12:05:51 阅读:321071 作者:ZRXP

本文目录一览:

什么是AC

学术

AC,是academic的缩写,中文翻译为“学术”

地理

AC,是Ascension岛(阿松森岛)的简称,位于大西洋南部,靠近非洲,是英国的殖民地

游戏

1.AC,是英文all combo 的缩写。一般用在音乐游戏中,表示全连.

2.在QQ音速中,所做的每一个动作都有一个判定。判定是根据游戏屏幕中间的节奏点/条来说的,做动作在左右两节奏点/条刚刚接触的那一霎那是最佳时期,此时判断为99%(没有100%)。若游戏中每一个动作判定都大于50%,直到游戏结束。

信息

AC是最早的一种多模式匹配的线性算法。该算法应用有限自动机巧妙地将字符比较转化为了状态转移,使得时间复杂度在O(n),并且与具体模式的长度和模式集的大小无关。

AC在信息学竞赛及其训练中是Accept的缩写,表示你提交的程序完全符合题目要求并通过了所有数据。

在OIer的心目中,做OJ时,最爽的时候就是AC(取accepted,下同)的时候,因此,这个词成为了许多OIer心目中最神圣的词,代表着幸运(又称RP, RenPin, 人品)。

物理

原子化焓:kJ /mol @25℃

301

热容:J /(mol· K)

27.2

导热系数:W/(m·K)

alternating current 中译为交流电

14.AC:如果是AC220V,则代表是交流电压220V。

化学

电子亲合和能: 0 KJ·mol-1

第一电离能: 0 KJ·mol-1 第二电离能: 0 KJ·mol-1 第三电离能: 0 KJ·mol-1

单质密度: 10.07 g/cm3 单质熔点: 1050.0 ℃ 单质沸点: 3200.0 ℃

原子半径: 0 埃 离子半径: 埃 共价半径: 0 埃

发现人: 德比尔纳 时间: 1899 地点: 法国

元素描述:

沉重的银白色金属,具有强放射性。

元素来源:

见于所有的铀矿中,极为稀少。通常在反应器中用中子处理镭获得。

元素用途:

没有什么实际用途。

元素符号: Ac 英文名: Actinium 中文名: 锕

相对原子质量: 0 常见化合价: 电负性: 0

外围电子排布: 6d1 7s2 核外电子排布: 2,8,18,32,18,9,2

同位素及放射线: Ac-225[10d] Ac-226[1.2d] Ac-227(放 βα[21.8y]) Ac-228[6.16h]

另外,Ac还是醋酸根(CH3COO-)的简写,如NaAc为醋酸钠(CH3COONa),HAc为醋酸(CH3COOH),注意简写时Ac要放到后面,

以便与金属锕区别。

歌星

少年歌星aaron charles carter 名字的缩写

13岁的亚伦卡特是英国音乐史上拥有连续五首十大金曲的最年轻的歌手,他是“新好男孩”演唱会的特别嘉宾,第一张专辑也在全球各国的十大排行榜上同时也在全球12个国家得到金唱片销售,第二张专辑更是写下多项白金唱片的销售纪录。

亚伦卡特在2岁的时候就开始学习唱歌及跳舞,7岁的时候就开始组成第一个属于他自己的乐团。亚伦卡特回忆说:“我在能说话的时候就学会如何唱歌了,我会一面唱歌一面绕着屋子跳着舞。”亚伦卡特很幸运的有一位大哥哥做一个好典范,那就是当今最红的男孩团体“后街男孩”的成员尼克,尼克的成功无疑的替亚伦卡特开辟了一条康庄大道,从尼克身上他学习了如何在五光十色的娱乐事业中找到一条生存之道。今年13岁的他褪去以往小男孩青涩的感觉,愈发俊秀的脸庞加上充满活力的演出,成了青少年的新偶像!

亚伦卡特推出最新专辑《0H!AARON》(《天之骄子》),一推出就登上美国告示牌排行榜的TOP7,而这张专辑除了延续亚伦卡特一贯的HIH0P、RAP、雷鬼音乐风格,更祭出了胞兄———后街男孩成员中的尼克,特别跨刀与亚伦合唱了首支单曲“NOTT00YOUNG,NOTT000LD”以及标题曲“0H!AARON”。专辑中还收录有“I’MALLABOUTYOU”亚伦卡特首度深情献唱的抒情曲,及亚伦卡特的小王子白皮书“THEKIDINYOU”,他借着这首歌向全世界宣告:“永远会以音乐唤醒所有聆听者心中沉睡的青春活力!”

8.是Associazione Calcio Milan s.p.a

球队

意大利语AC是足球俱乐部的简称,就像英语中的FC一样

所以AC Milan实际上应翻译成米兰足球俱乐部,简称米兰队.AC Milan是最先翻译进来的,也就一直保留了下来

魔兽世界中定义

AC - Armor Class,盔甲级别或防御。

魔兽争霸中及其战报中表精灵族弓箭手(Archer)

中国国际航空公司

AC= Air China 中国国际航空公司

AC”在英汉词典中的解释(来源:百度词典):

AC

abbr.

1. =alternating current

2. =air-conditioning 空气调节(装置)

Ac

abbr.

1. =[Bible] Acts

ac

abbr.

1. =air conditioning 空调

2. =average cost 平均支出

3. =alternating current 交流(电)

4. =automatic analog computer 自动模拟电脑

串的模式匹配算法,求编程

#includestdio.h

void getnext(const char c[],int next[])

{

int j=0,k=-1;

next[0]=-1;

while(c[j]!='')

{

if(k==-1||c[j]==c[k])

{

j++;

k++;

if(c[j]!=c[k])

next[j]=k;

else

next[j]=next[k];

}

else

k=next[k];

}

}

int KMP(const char *Text,const char* Pattern) //const 表示函数内部不会改变这个参数的值。

{

if( !Text||!Pattern|| Pattern[0]=='' || Text[0]=='' )//

return -1;//空指针或空串,返回-1。

int len=0;

const char * c=Pattern;

while(*c++!='')//移动指针比移动下标快。

{

++len;//字符串长度。

}

int *next=new int[len+1];

getnext(Pattern,next);//求Pattern的next函数值

int index=0,i=0,j=0;

while(Text[i]!='' Pattern[j]!='' )

{

if(Text[i]== Pattern[j])

{

++i;// 继续比较后继字符

++j;

}

else

{

index += j-next[j];

if(next[j]!=-1)

j=next[j];// 模式串向右移动

else

{

j=0;

++i;

}

}

}

delete []next;

if(Pattern[j]=='')

return index;// 匹配成功

else

return -1;

}

int main()

{

char clong[100],cshort[20]="abcac";

int next[20];

scanf("%s",clong);

scanf("%s",cshort);

printf("%d",KMP(clong,cshort));

}

那些经典算法:AC自动机

第一次看到这个名字的时候觉得非常高级,深入学习就发现,AC就是一种多模式字符串匹配算法。前面介绍的BF算法,RK算法,BM算法,KMP算法都属于单模式匹配算法,而Trie树是多模式匹配算法,多模式匹配算法就是在一个主串中查找多个模式串,举个最常用的例子,比如我们在论坛发表评论或发帖的时候,一般论坛后台会检测我们发的内容是否有敏感词,如果有敏感词要么是用***替换,要么是不让你发送,我们评论是通常是一段话,这些敏感词可能成千上万,如果用每个敏感词都在评论的内容中查找,效率会非常低,AC自动机中,主串会与所有的模式串同时匹配,这时候就可以利用AC自动机这种多模式匹配算法来完成高效的匹配,

AC自动机算法是构造一个Trie树,然后再添加额外的失配指针。这些额外的适配指针准许在查找字符串失败的时候进行回退(例如在Trie树种查找单词bef失败后,但是在Trie树种存中bea这个单词,失配指针会指向前缀be),转向某些前缀分支,免于重复匹配前缀,提高算法效率。

常见于IDS软件或病毒检测软件中病毒特征字符串,可以构建AC自动机,在这种情况下,算法的时间复杂度为输入字符串的长度和匹配数量之和。

假设现有模式字符串集合:{abd,abdk, abchijn, chnit, ijabdf, ijaij} 构建AC自动机如下:

说明:

1)当前指针curr指向AC自动机的根节点:curr=root。

2)从文本串中读取(下)一个字符。

3)从当前节点的所有孩子节点中寻找与该字符匹配的节点:

4)若fail == null,则说明没有任何子串为输入字符串的前缀,这时设置curr = root,执行步骤2.

若fail != null,则将curr指向 fail节点,指向步骤3。

理解起来比较复杂,找网上的一个例子,假设文本串text = “abchnijabdfk”。

查找过程如下:

说明如下:

1)按照字符串顺序依次遍历到:a--b--c--h ,这时候发现文本串中下一个节点n和Trie树中下一个节点i不匹配,且h的fail指针非空,跳转到Trie树中ch位置。

注意c--h的时候判断h不为结束节点,且c的fail指针也不是结束节点。

2)再接着遍历n--i,发现i节点在Trie树中的下一个节点找不到j,且有fail指针,则继续遍历,

遍历到d的时候要注意,d的下一个匹配节点f是结束字符,所以得到匹配字符串:ijabdf,且d的fail节点也是d,且也是结束字符,所以得到匹配字符串abd,不过不是失败的匹配,所以curr不跳转。

先将目标字符串插入到Trie树种,然后通过广度有限遍历为每个节点的所有孩子节点找到正确的fail指针。

具体步骤如下:

1)将根节点的所有孩子节点的fail指针指向根节点,然后将根节点的所有孩子节点依次入队列。

2)若队列不为空:

2.1)出列一个字符,将出列的节点记为curr,failTo表示curr的

fail指针,即failTo = curr.fail 。

2.2) 判断curr.child[i] == failTo.child[i]是不是成立:

成立:curr.child[i].fail = failTo.child[i]

因为当前字符串的后缀和Tire树的前缀最长部分是到fail,

且子字符和failTo的下一个字符相同,则fail指针就是

failTo.child[i]。

不成立: 判断failTo是不是为null是否成立:

成立: curr.child[i].fail = root = null。

不成立: failTo = failTo.fail 继续2.2

curr.child[i]入列,再次执行步骤2)。

3)队列为空结束。

每个结点的fail指向的解决顺序是按照广度有限遍历的顺序完成的,或者说层序遍历的顺序进行,我们根据父结点的fail指针来求当前节点的fail指针。

上图为例,我们要解决y节点的fail指针问题,已经知道y节点的父节点x1的fail是指向x2的,根据fail指针的定义,我们知道红色椭圆中的字符串序列肯定相等,而且是最长的公共部分。依据y.fail的含义,如果x2的某个孩子节点和节点y表示的表示的字符相等,y的fail就指向它。

如果x2的孩子节点中不存在节点y表示的字符。由于x2.fail指向x3,根据x2.fail的含义,我们知道绿色框中的字符序列是相同的。显然如果x3的某个孩子和节点y表示字符相等,则y.fail就指向它。

如果x3的孩子节点不存在节点y表示的字符,我们重复这个步骤,直到xi的fail节点指向null,说明我们达到顶层,只要y.fail= root就可以了。

构造过程就是知道当前节点的最长公共前缀的情况下,去确定孩子节点的最长公共前缀。

下图中,每个节点都有fail虚线,指向根节点的虚线没画出,求图中c的孩子节点h的fail指向:

原图中,深蓝色的框出来的是已经确定fail指针的,求红色框中h节点的fail指针。

这时候,我们看下h的父亲节点c的fail指针指向,为ch中的c(这表示abc字符串的所有后缀bc和c和Trie树的所有前缀中最长公共部分为c),且这个c节点的孩子节点中有字符为h的字符,所以图中红色框中框出的h节点的fail指针指向 ch字符串中的h。

求红色框中i的fail指针指向,上图中,我们可以看到i的父亲节点h的指向为ch中的h,(也就是说我们的目标字符串结合中所有前缀和字符序列abch的所有后缀在Trie树中最长前缀为ch。)我们比较i节点和ch中的h的所有子节点,发现h只有一个n的子节点,所以没办法匹配,那就继续找ch中h的fail指针,图中没画出,那么就是它的fail指针就是root,然后去看root所有子节点中有没有和i相等的,发现最右边的i是和我们要找的i相等的,所以我们就把i的fail指针指向i,如后面的图。

JAVA正则表达式,matcher.find和 matcher.matches的区别

1.find()方法是部分匹配,是查找输入串中与模式匹配的子串,如果该匹配的串有组还可以使用group()函数。

matches()是全部匹配,是将整个输入串与模式匹配,如果要验证一个输入的数据是否为数字类型或其他类型,一般要用matches()。

2.Pattern pattern= Pattern.compile(".*?,(.*)");

Matcher matcher = pattern.matcher(result);

if (matcher.find()) {

return matcher.group(1);

}

3.详解:

matches

public static boolean matches(String regex, CharSequence input)

编译给定正则表达式并尝试将给定输入与其匹配。

调用此便捷方法的形式

Pattern.matches(regex, input);

Pattern.compile(regex).matcher(input).matches() ;

如果要多次使用一种模式,编译一次后重用此模式比每次都调用此方法效率更高。

参数:

regex - 要编译的表达式

input - 要匹配的字符序列

抛出:

PatternSyntaxException - 如果表达式的语法无效

find

public boolean find()尝试查找与该模式匹配的输入序列的下一个子序列。

此方法从匹配器区域的开头开始,如果该方法的前一次调用成功了并且从那时开始匹配器没有被重置,则从以前匹配操作没有匹配的第一个字符开始。

如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。

matcher.start() 返回匹配到的子字符串在字符串中的索引位置.

matcher.end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置.

matcher.group()返回匹配到的子字符串

返回:

当且仅当输入序列的子序列匹配此匹配器的模式时才返回 true。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。