java版的ac多模式匹配算法的簡單介紹

本文目錄一覽:

什麼是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]!=’\0′)

{

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]==’\0′ || Text[0]==’\0′ )//

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

int len=0;

const char * c=Pattern;

while(*c++!=’\0′)//移動指針比移動下標快。

{

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

}

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

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

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

while(Text[i]!=’\0′ Pattern[j]!=’\0′ )

{

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]==’\0′)

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。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/235579.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 11:55
下一篇 2024-12-12 11:56

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python實現爬樓梯算法

    本文介紹使用Python實現爬樓梯算法,該算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29

發表回復

登錄後才能評論