ac匹配演算法
1. 什麼是AC啊求大神幫助
您的問題比較含糊!!這里基本上涵蓋所有有關AC的設計面!!您自己擷取吧!! 著名推理小說作家 阿加莎·克里斯蒂 ( Agatha Christie 1890~1976 ),英國著名女偵探小說家、劇作家。 阿加莎·克里斯蒂 [編輯本段]面試一對多的面試(評價中心),AssessmentCenter是世界500強公司在員工提升過程中,為了確保選擇人 選的適當性,利用評價中心測定候選人的能力的一種有效的方法,並且可以測知員工培訓需求的重點。 [編輯本段]學術 AC,是academic的縮寫,中文翻譯為「學術」 [編輯本段]地理 AC,是Ascension島(阿松森島)的簡稱,位於大西洋南部,靠近非洲,是英國的殖民地 AC,是南極圈(Antarctica Circle)的簡稱 [編輯本段]電信AC是Authenticator Center的縮寫,意為:鑒權中心。為與交流電區分,也簡寫為AUC Authenticator Center. 電工學 AC指交流電 [編輯本段]自動控制AC是automation control的縮寫,意思是自動控制,是一個學科方向,又稱為自動化。機器或裝置在無人干預的情況下按規定的程序或指令自動進行操作或控制的過程,其目標是「穩,准,快」。自動化技術廣泛用於工業、農業、軍事、科學研究、交通運輸、商業、醫療、服務和家庭等方面。採用自動化技術不僅可以把人從繁重的體力勞動、部分腦力勞動以及惡劣、危險的工作環境中解放出來,而且能擴展人的器官功能,極大地提高勞動生產率,增強人類認識世界和改造世界的能力。因此,自動化是工業、農業、國防和科學技術現代化的重要條件和顯著標志。 自動化是一門涉及學科較多、應用廣泛的綜合性科學技術。作為一個系統工程,它由5個單元組成:①程序單元。決定做什麼和如何做。②作用單元。施加能量和定位。③感測單元。檢測過程的性能和狀態。④制定單元。對感測單元送來的信息進行比較,制定和發出指令信號。⑤控制單元。進行制定並調節作用單元的機構。自動化的研究內容主要有自動控制和信息處理兩個方面,包括理論、方法、硬體和軟體等,從應 用觀點來看,研究內容有過程自動化、機械製造自動化、管理自動化、實驗室自動化和家庭自動化等。 [編輯本段]域名 ac為英國海外領地阿森松島國家及地區頂級域(ccTLD)的域名。 [編輯本段]游戲1.AC,是英文all combo 的縮寫。一般用在音樂游戲中,表示全連. 2.Assassin's Creed 刺客信條 3.在QQ音速中,所做的每一個動作都有一個判定。判定是根據游戲屏幕中間的節奏點/條來說的,做動作在左右兩節奏點/條剛剛接觸的那一霎那是最佳時期,此時判斷為99%(沒有100%)。若游戲中每一個動作判定都大於50%,直到游戲結束。 4.魔獸爭霸游戲中,暗夜精靈族的弓箭手英文名稱為Archer,簡稱AC。 5.在CS。穿越火線等FPS游戲中,AC指Armor Class(防禦等級)的簡稱, 6,在突襲OL中地圖:第三補及倉庫的A地點側門簡稱AC 7,Asheron's Call(亞瑟王的召喚),簡稱為AC 8,在DND中,防禦所用的是AC這個概念,是Armor Class(防禦等級)的簡稱。 在這里要注意的是AC和一般非DND游戲中的「防禦」是有所區別的,在那些游戲中防禦通常採用「傷害吸收」,如果本來要造成100點傷害的,也許因為穿著重甲,實際上只受到50點傷害,其餘的50點被裝甲「吸收」了。但是在DND的規則中則不一樣,AC並不能讓你被對手擊中的時候少受傷害,而是讓你「更加難以被對手命中」。不過宏觀來說效果是一樣的,受到100次傷害其中50次被躲過去,與100次傷害每次只受一半傷的總效果是一樣的,計算起來則簡便得多。 AC是一個綜合的概念,包括盔甲、敏捷、體型和專長等等。只要攻擊結果低於AC就是沒有命中,你可以理解為被盔甲擋住了、身手敏捷躲過去了、身材嬌小不易打中或者是專門學習過如何躲閃都可以。普通人AC的基本值為10,並且不隨等級提高而改變,這實際上可以看作是投D20取10,因此也有變體規則在每次攻防對抗時不取固定數值,而是投D20防禦再加上各種調整值,但這會讓投骰次數增加一倍,雖然能讓游戲的變數更多一些,卻很少有DM肯採用。 計算AC的標准公式:AC=10+盔甲加值+盾牌加值+敏捷調整值+體型調整值。實際在應用中還有些其他的調整值,比如說很多怪物都皮糙肉厚,具有天生防禦加值;魔法和特殊物品可以提供偏斜加值;種族或者專長所帶來的閃避加值;某些技能也可以代替AC值,例如騎術檢定可以代替坐騎的AC;很多法術效果(例如隱身術)會為AC帶來不同種類的加值;甚至趴倒在地上也會帶來AC的調整。 此外每個人物在不同的狀態下總共有3個不同的AC,分別是正常情況、措手不及和接觸。措手不及指的是人物未能及時反應過來,因此扣掉AC的敏捷加值(如果為正數),祈禱盔甲能夠抵擋住對方的攻擊;而受到對方接觸攻擊時只需要「碰到」就行,此時AC的盔甲、盾牌和天生加值無效,只能靠敏捷躲閃。例如某個人物敏捷為15,身穿革甲,那麼敏捷加值為+2,盔甲加值為+3,正常情況下AC是10+2+3=15,措手不及就是10+3=13,接觸就是10+2=12。 關於AC的各種加值,分別說一下需要注意的地方: 盔甲加值:實際上我們常用的盔甲加值的概念,有時候也包括了盔甲加值和盾牌加值,因為這兩項數值可以疊加。需要注意的是大多數同種類的加值不能疊加,而是取較高的。在魔法物品中,防護戒指提供的是偏斜加值,天生防禦護符提供的是天生防禦加值,這些都可以和盔甲加值相疊加,但防禦護腕所提供的是盔甲加值,不能和盔甲加值相疊加。 敏捷加值:這里要注意的是盔甲的「最高敏捷加值」。穿著盔甲以後總是會對行動有所限制,不像光著身子那麼靈活。不同的盔甲的敏捷加值上限也不同。當敏捷加值超過盔甲上限時,並不是說敏捷受到限制,只是有一部分敏捷屬性無法應用到防禦上。假如某個人物具有15點敏捷,那麼敏捷加值為+2,身著革甲(敏捷上限為+4)時可以把所有敏捷加值都應用到防禦上,AC=10+敏捷2+革甲3=15;如果身穿全身甲(敏捷上限為+1),敏捷依然是15,但是應用到AC上的加值只有+1,AC=10+敏捷1+全身甲8=19。 體型加值:這個是相對體型加值,也就是說兩個對手間體型差異導致的加值。如果兩個對手體型相同,那麼不論是超巨型還是超微型,都會互相抵消。 閃避加值:包括防禦式攻擊、全防禦和矮人對巨人的種族加值等,都屬於閃避加值。閃避加值最大的特點是可以疊加,這和其他加值不同。而且與敏捷無關,穿著盔甲照樣能夠閃避。但是如果失去AC的敏捷加值,也將同時失去閃避加值,因為這時候你動都不能動,還怎麼閃避? 特別注意:很多情況下我們會失去AC的敏捷加值,例如沒有及時發現敵人而處於措手不及的狀態、遭到隱性的敵人攻擊,或者被法術效果定身等等。這是我們要極力避免的狀態,因為通常處於這種狀態下,緊接著就要吃一記游盪者的「偷襲」!高級(LV5或以上)野蠻人與游盪者對抗時極其強大,就是因為不吃游盪者這一套。 其他影響AC的因素: 魔法增強:通過魔法增強的盔甲、盾牌或武器(見下文)可以提供額外的AC增強加值。 武器:具有護身特性的武器可以將武器的增強加值部分或全部(因為魔法武器的最高增強加值為+5,因此最高+5)轉換為AC的特殊加值,並且能和任何其他加值疊加。 全防禦:在一輪中只進行防禦和移動,不攻擊也不做其他動作。如果這樣做,則在一輪內AC獲得+4的閃避加值。 防禦式攻擊:在進行全力攻擊動作時,可以選擇防禦式攻擊。如果這樣做,則在一輪內所有攻擊都受-4減值,而AC獲得+2閃避加值。 專長(閃避):先決條件,敏捷達到13。在做任何動作時,可以指定一名對手,該對手對你攻擊時,你的AC有+1閃避加值。可以在做其他動作時改換新的目標。 專長(靈活移動):先決條件,敏捷達到13,閃避。當你進入或離開敵人的威脅區域時,若是引發對手的借機攻擊,則你的AC可以獲得+4的閃避加值。 專長(寓守於攻):先決條件,智力達到13。在近戰中進行攻擊或整輪攻擊時,可以選擇讓攻擊檢定減少(最多-5,而且不能超過基本攻擊加值),再將等量的數值(也就是最多達到+5)加到AC的閃避加值上。 技能(滾翻):當滾翻的技能級數(注意不是技能檢定加值,因此人物至少要達到LV2,而且滾翻作為本職技能,如果作為跨職技能的話,則人物至少要達到LV7)達到5,則進行防禦式戰斗時AC的閃避加值為+3而非+2,進行全防禦時AC的閃避加值也提升為+6而非+4。 沖刺:當進行沖刺攻擊的時候,一輪之內AC受到-2減值。 狂暴:當發動狂暴的時候,狂暴期間AC受到-2減值。因為野蠻人通常不穿重甲,反而經常狂暴了沖鋒,狂暴的時候還不能用寓守於攻等能力,所以AC通常很慘,只能靠修習閃避、靈活移動之類的專長稍稍彌補一下,野蠻人的敏捷也比戰士更重要。 遮蔽:當防禦者處於被遮蔽狀態時,根據遮蔽的程度不同分別獲得不同的遮蔽加值。最常見的就是塔盾造成的遮蔽,還有閃現、隱形等效果導致失手幾率。 [編輯本段]信息AC是最早的一種多模式匹配的線性演算法。該演算法應用有限自動機巧妙地將字元比較轉化為了狀態轉移,使得時間復雜度在O(n),並且與具體模式的長度和模式集的大小無關。 (演算法簡介: http://hi..com/lightxianjian/blog/item/d0f0b8de8041125095ee3710.html ) AC在信息學競賽及其訓練中是Accept的縮寫,表示你提交的程序完全符合題目要求並通過了所有數據。 在OIer的心目中,做OJ時,最爽的時候就是AC(取accepted,下同)的時候,因此,這個詞成為了許多OIer心目中最神聖的詞,代表著幸運(又稱RP, RenPin, 人品)。 [編輯本段]生活AC:air conditioning 空調、空氣調節(裝置) 如汽車操作台上指空調 [編輯本段]物理 原子化焓:kJ /mol @25℃ 301 熱容:J /(mol· K) 27.2 導熱系數:W/(m·K) alternating current 中譯為交流電 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要放到後面, 以便與金屬錒區別。 AC 是anal chem的簡稱全稱:Analytical Chemistry 化學類重要雜志期刊之一 生物 腺苷酸環化酶(adenylate cyclase, AC) 腺苷酸環化酶是膜整合蛋白,它的氨基端和羧基端都朝向細胞質。AC在膜的細胞質面有兩個催化結構域,還有兩個膜整合區,每個膜整合區分別有6個跨膜的α螺旋。哺乳動物中已發現6個腺苷酸環化酶異構體。由於AC能夠將ATP轉變成cAMP,引起細胞的信號應答,故此,AC是G蛋白偶聯系統中的效應物。 [編輯本段]歌星 少年歌星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(Associazione Calcio) 是足球俱樂部的簡稱,就像英語中的FC一樣,並無特指某具體球隊,AC Milan、AC Siena、AC Chievo Verona均屬此意 [編輯本段]魔獸世界中定義 AC - Armor Class,盔甲級別或防禦。 魔獸爭霸中及其戰報中表精靈族弓箭手(Archer) [編輯本段]中國國際航空公司AC= Air China 中國國際航空公司 但是 中國國際航空公司的航班號開頭字母是CA 一般不會反過來表示 網站 AC =Anti-cnn的簡稱. 動漫 阿斯蘭Athrun卡嘉莉Cagalli 高達SEED&高達seed destiny中的男女主角之一 相當坎坷曲折的一對 不過還是會支持他們,希望他們能幸福> <
2. AC是什麼意思啊
1、AC(交流電)一般指交流電
交流電是指電流方向隨時間作周期性變化的電流,在一個周期內的平均電流為零。不同於直流電,它的方向是會隨著時間發生改變的,而直流電沒有周期性變化。
2、Accepted
Accepted,簡稱AC,意味著通過了測試樣例(答案正確),通常在信息學競賽在線評測系統(Online Judge)顯示,是信息學競賽常用的術語之一。
AC(交流電)發展歷史
當發現了電磁感應後,產生交流電流的方法就被知曉。早期的發電機由英國人麥可·法拉第(Michael Faraday)與法國人波利特·皮克西(Hippolyte Pixii)等人發明出來。
1882年,英國電工詹姆斯·戈登建造了大型雙相交流發電機。開爾文勛爵與塞巴斯蒂安·費蘭蒂(Sebastian Ziani de Ferranti)開發早期交流發電機,頻率介於100赫茲至300赫茲之間。
1891年,尼古拉·特斯拉取得了高頻交流發電機(15000Hz)的專利。
1891年後,多相交流發電機被用來供應電流,此後的交流發電機的交流電流頻率通常設計在16赫茲至100赫茲間,搭配弧光燈、白熾燈或電動機使用。
根據電磁感應定律,當導體周圍的磁場發生變化,感應電流在導體中產生。通常情況下,旋轉磁體稱為轉子,導體繞在鐵芯上的線圈內的固定組,稱為定子,當其跨越磁場時,便產生電流。產生交流電的基本機械稱為交流發電機。
以上內容參考:網路-AC;網路-AC
3. 什麼是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 自動模擬電腦
4. AC自動機的概述
應用
一個常見的例子就是給出n個單詞,再給出一段包含m個字元的文章,讓你找出有多少個單詞在文章里出現過。
要搞懂AC自動機,先得有模式樹(字典樹)Trie和KMP模式匹配演算法的基礎知識。AC自動機演算法分為3步:構造一棵Trie樹,構造失敗指針和模式匹配過程。
如果你對KMP演算法了解的話,應該知道KMP演算法中的next函數(shift函數或者fail函數)是干什麼用的。KMP中我們用兩個指針i和j分別表示,A[i-j+ 1..i]與B[1..j]完全相等。也就是說,i是不斷增加的,隨著i的增加j相應地變化,且j滿足以A[i]結尾的長度為j的字元串正好匹配B串的前 j個字元,當A[i+1]≠B[j+1],KMP的策略是調整j的位置(減小j值)使得A[i-j+1..i]與B[1..j]保持匹配且新的B[j+1]恰好與A[i+1]匹配,而next函數恰恰記錄了這個j應該調整到的位置。同樣AC自動機的失敗指針具有同樣的功能,也就是說當我們的模式串在Trie上進行匹配時,如果與當前節點的關鍵字不能繼續匹配,就應該去當前節點的失敗指針所指向的節點繼續進行匹配。
5. 字元串匹配演算法的使用(未完待整理)
字元串的匹配在Java中都知道使用indexOf函數來實現,那麼其匹配演算法是怎麼樣的呢?
單模式和多模式的區別就是一次遍歷主串能否將多個模式的字元串都查找出來。
英文全稱為Brute Force,暴力匹配演算法,匹配字元串的方法比較暴力,也比較簡單易懂。其大概的思路就是:
我們可以看到,在極端情況下,在主串 aaaa...aab 中尋找模式串 aab ,那麼總共需要尋找(n-m+1)次,且每次都需要比對m次,那麼時間復雜度將是 (n-m+1)*m ,即 O(n*m) ;但實際上並不會這么低效,因為我們的使用場景中主串和模式串都不會太長,而且在每個子串和模式串進行比對時,只要中途有一個不匹配,那麼當前比對就會提前結束,因此大部分情況下,時間復雜度都會比 O(n*m) 要好。
我們在BF演算法的基礎上引入哈希演算法,我們不需要將每個子串與模式串逐個字元地進行比較,而是計算得出每個子串的hash值,然後和模式串的hash值進行比較,如果有相等的,那就說明有子串和模式串匹配上了。
雖然我們只需要比對模式串和子串的hash值就能得到匹配結果,次數為(n-m+1),但是對每個子串進行hash計算的時候,是要遍歷每個字元的,因此次數也是m,那麼總的時間復雜度還是 O(n*m) ,並沒有明顯地提升。
那麼我們該如何想出一個辦法,使得每個子串hash值的計算時間得到提升呢?這就是RK演算法的精髓,假設子串包含的字元集中元素個數為k,那麼就用k進制數來代表這個子串,然後hash的過程就是將這個k進制的數轉換為十進制的數,這個十進制的數就是該子串的hash值。
相鄰子串的hash值計算是有規律的,我們只需要遍歷一次主串就能得到所有子串的hash值,演算法復雜度為O(n),而不是像原先一樣,每個子串都需要O(m)的時間復雜度。
然後將模式串的hash值和所有子串的hash值進行比較,每次比較的時間復雜度是 O(1) ,總共比較(n-m+1)次,所以RK演算法的總的時間開銷為 O(n)+O(1)*O(n-m+1) ,即為 O(n) ,時間復雜度比BF演算法更加高效。
當然,有hash的地方就有可能會存在hash沖突,有可能子串和hash值和模式串的hash值是一樣的,但內容就是不一樣,此時怎麼辦呢?其實很簡單,對於hash值一樣的子串,我們增加雙保險,再比較一下這m個字元是否都一樣即可,總的時間開銷為 O(n)+O(1)*O(n-m+1)+O(m) ,即為 O(n) 。
如果極端情況下出現了很多hash沖突呢?我們對於每個和模式串相同hash值的子串都需要逐一再進行比較,那麼總的時間開銷就會為 O(n)+O(1)*O(n-m+1)+O(m)*O(n-m+1) ,即為 O(n*m) ,不過這種概率太小了,大部分情況下都不會這樣。
在真正的文本編輯器中查找和替換某個字元串時,使用的演算法既不是上述的BF演算法,也不是RK演算法;BF演算法只適合不是很長的主串,RK演算法則要設計一個沖突概率很低的hash演算法,這個比較困難,所以實際使用的是BM演算法,它是工程中非常常用的一種字元串匹配演算法,效率也是最高的。
演算法的思想和過程有些復雜,待以後整理。
KMP演算法在本質上是和BM演算法一樣的。演算法的思想和過程有些復雜,待以後整理。
瀏覽器輸入框中的智能輸入匹配是怎麼實現的,它是怎麼做動態字元串匹配查找的呢?這就用到了Trie樹。
又名字典樹,是一種專門用來快速查找字元串前綴匹配結果的樹形結構,其本質就是將所有字元串的重復的前綴合並在一起,構造一個多叉樹。
其中,根節點不包含任何信息,每個節點表示一個字元,從根節點到紅色節點的一條路徑表示存儲的一個字元串。當我們在如上Trie樹中查找"he"時,發現"he"並非是一個字元串,而是"hello"和"her"的公共前綴,那麼就會找到這兩個字元串返回。
Trie樹在內存中是如何存儲的呢?因為每一個節點都可能是包含所有字元的,所以每一個節點都是一個數組(或者散列表),用來存儲每個字元及其後綴節點的指針。
使用Trie樹,最開始構建的時候,時間復雜度為 O(n) ,其中n為所有字元串長度之和,但是一旦構建完成,頻繁地查詢某個字元串是非常高效的,時間復雜度為 O(k) ,其中k為查找字元串的長度。
Trie樹雖然查詢效率很高,但是比較浪費內存,每一個節點都必須維護一個數組存放所有可能的字元數據及其指向下一個節點的指針,因此在所有字元串公共前綴並不多的時候,內存空間浪費地就更多了。這種問題其實也有對應的解決辦法,我們可以不使用數組,而是使用有序數組、散列表、紅黑樹來存放,可以相應地降低性能來節省內存空間。
Trie樹除了可以實現瀏覽器動態輸入內容查找候選項的功能外,還可以實現多模式地敏感詞匹配功能。假設我們需要對用戶輸入的內容進行敏感詞檢查,將所有的敏感內容用***代替,那麼該如何實現呢?
首先我們可以維護一個敏感詞字典,使用上述四種單模式匹配演算法也可以實現,但是需要遍歷N次用戶輸入的內容,其中N是所有敏感詞的模式串,顯得非常低效。但是我們如果將敏感詞字典維護為一個Trie樹,然後將用戶輸入的內容從位置0開始在Trie樹中進行查詢,如果匹配到紅色節點,那麼說明有敏感詞;如果沒有匹配到紅色節點,就從用戶輸入內容的下一個位置開始繼續在Trie樹中查詢,直至將用戶輸入內容遍歷完,因此我們只是遍歷了一遍主串。
然而更高效的多模式字元串匹配使用地更多的是如下的AC自動機。
如果把Trie樹比作BF演算法,KMP演算法是BF演算法的改進,那麼AC自動機就是利用同樣的思想改進了Trie樹。
演算法的思想和過程有些復雜,待以後整理。