


全文預(yù)覽已結(jié)束
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
記得大學(xué)時(shí)自己也總結(jié)出了這種算法的,手動(dòng)計(jì)算,數(shù)據(jù)結(jié)構(gòu)的書都丟了,還好在網(wǎng)上找會(huì)了同樣的算法特記下:int get_nextval(SString T,int &nextval ) /求模式串T的next函數(shù)修正值并存入數(shù)組nextval。 i=1; nextval1=0; j=0; while(iT0) if(j=0|Ti=Tj) +i;+j; if (Ti!=Tj) nextvali=j; else nextvali=nextvalj; else j=nextvalj; /get_nextval 根據(jù)這段程序來求nextval的值是可以方便計(jì)算出來,但如果是應(yīng)付考研試題或者期末考試就有點(diǎn)麻煩了。而如果記住我推薦的方法,那么任何時(shí)候都可以很方便地求解nextval了。 首先看看next數(shù)組值的求解方法。 例如: 模式串 a b a a b c a c next值 0 1 1 2 2 3 1 2 nextval值 next數(shù)組的求解方法是:第一位的next值為0,第二位的next值為1,后面求解每一位的next值時(shí),根據(jù)前一位進(jìn)行比較。首先將前一位與其next值對(duì)應(yīng)的內(nèi)容進(jìn)行比較,如果相等,則該位的next值就是前一位的next值加上1;如果不等,向前繼續(xù)尋找next值對(duì)應(yīng)的內(nèi)容來與前一位進(jìn)行比較,直到找到某個(gè)位上內(nèi)容的next值對(duì)應(yīng)的內(nèi)容與前一位相等為止,則這個(gè)位對(duì)應(yīng)的值加上1即為需求的next值;如果找到第一位都沒有找到與前一位相等的內(nèi)容,那么需求的位上的next值即為1。 看起來很令人費(fèi)解,利用上面的例子具體運(yùn)算一遍。 1.前兩位必定為0和1。 2.計(jì)算第三位的時(shí)候,看第二位b的next值,為1,則把b和1對(duì)應(yīng)的a進(jìn)行比較,不同,則第三位a的next的值為1,因?yàn)橐恢北鹊阶钋耙晃?,都沒有發(fā)生比較相同的現(xiàn)象。 3.計(jì)算第四位的時(shí)候,看第三位a的next值,為1,則把a(bǔ)和1對(duì)應(yīng)的a進(jìn)行比較,相同,則第四位a的next的值為第三位a的next值加上1。為2。因?yàn)槭窃诘谌粚?shí)現(xiàn)了其next值對(duì)應(yīng)的值與第三位的值相同。 4.計(jì)算第五位的時(shí)候,看第四位a的next值,為2,則把a(bǔ)和2對(duì)應(yīng)的b進(jìn)行比較,不同,則再將b對(duì)應(yīng)的next值1對(duì)應(yīng)的a與第四位的a進(jìn)行比較,相同,則第五位的next值為第二位b的next值加上1,為2。因?yàn)槭窃诘诙粚?shí)現(xiàn)了其next值對(duì)應(yīng)的值與第四位的值相同。 5.計(jì)算第六位的時(shí)候,看第五位b的next值,為2,則把b和2對(duì)應(yīng)的b進(jìn)行比較,相同,則第六位c的next值為第五位b的next值加上1,為3,因?yàn)槭窃诘谖逦粚?shí)現(xiàn)了其next值對(duì)應(yīng)的值與第五位相同。 6.計(jì)算第七位的時(shí)候,看第六位c的next值,為3,則把c和3對(duì)應(yīng)的a進(jìn)行比較,不同,則再把第3位a的next值1對(duì)應(yīng)的a與第六位c比較,仍然不同,則第七位的next值為1。 7.計(jì)算第八位的時(shí)候,看第七位a的next值,為1,則把a(bǔ)和1對(duì)應(yīng)的a進(jìn)行比較,相同,則第八位c的next值為第七位a的next值加上1,為2,因?yàn)槭窃诘谄呶缓蛯?shí)現(xiàn)了其next值對(duì)應(yīng)的值與第七位相同。 在計(jì)算nextval之前要先弄明白,nextval是為了彌補(bǔ)next函數(shù)在某些情況下的缺陷而產(chǎn)生的,例如主串為“aaabaaaab”、模式串為“aaaab”那么,比較的時(shí)候就會(huì)發(fā)生一些浪費(fèi)的情況:比較到主串以及模式串的第四位時(shí),發(fā)現(xiàn)其值并不相等,據(jù)我們觀察,我們可以直接從主串的第五位開始與模式串進(jìn)行比較,而事實(shí)上,卻進(jìn)行了幾次多余的比較。使用nextval可以去除那些不必要的比較次數(shù)。 求nextval數(shù)組值有兩種方法,一種是不依賴next數(shù)組值直接用觀察法求得,一種方法是根據(jù)next數(shù)組值進(jìn)行推理,兩種方法均可使用,視更喜歡哪種方法而定。 我們使用例子“aaaab”來考查第一種方法。 1.試想,在進(jìn)行模式匹配的過程中,將模式串“aaaab”與主串進(jìn)行匹配的時(shí)候,如果第一位就沒有吻合,即第一位就不是a,那么不用比較了,趕快挪到主串的下一位繼續(xù)與模式串的第一位進(jìn)行比較吧,這時(shí),模式串并沒有發(fā)生偏移,那么,模式串第一位a的nextval值為0。 2.如果在匹配過程中,到第二位才發(fā)生不匹配現(xiàn)象,那么主串的第一位必定是a,而第二位必定不為a,既然知道第二位一定不為a,那么主串的第一、二兩位就沒有再進(jìn)行比較的必要,直接跳到第三位來與模式串的第一位進(jìn)行比較吧,同樣,模式串也沒有發(fā)生偏移,第二位的nextval值仍然為0。 3.第三位、第四位類似2的過程,均為0。 4.如果在匹配過程中,直到第五位才發(fā)生不匹配現(xiàn)象,那么主串的第一位到第四位必定為a,并且第五位必定不為b,可是第五位仍然有可能等于a。如果萬一第五位為a,那么既然前面四位均為a,所以,只要第六位為b,第一個(gè)字符串就匹配成功了。所以,現(xiàn)在的情況下,就是看第五位究竟是不是a了。所以發(fā)生了下面的比較: 1 2 3 4 5 6 a a a a * * a a a a b a a a a b 前面的三個(gè)a都不需要進(jìn)行比較,只要確定主串中不等于b的那個(gè)位是否為a,即可以進(jìn)行如下的比較:如果為a,則繼續(xù)比較主串后面一位是否為b;如果不為a,則此次比較結(jié)束,繼續(xù)將模式串的第一位去與主串的下一位進(jìn)行比較。由此看來,在模式串的第五位上,進(jìn)行的比較偏移了4位(不進(jìn)行偏移,直接比較下一位為0),故第五位b的nextval值為4。 我們可以利用第一個(gè)例子“abaabcac”對(duì)這種方法進(jìn)行驗(yàn)證。 a的nextval值為0,因?yàn)槿绻鞔牡谝晃徊皇莂,那么沒有再比較下去的必要,直接比較主串的第二位是否為a。如果比較到主串的第二位才發(fā)生錯(cuò)誤,則主串第一位肯定為a,第二位肯定不為b,此時(shí)不能直接跳到第三位進(jìn)行比較,因?yàn)榈诙贿€可能是a,所以對(duì)主串的第二位再進(jìn)行一次比較,偏移了1位,故模式串第二位的nextval值為1。以此類推,nextval值分別為:01021302。其中第六位的nextval之所以為3,是因?yàn)?,如果主串比較到第六位才發(fā)生不匹配現(xiàn)象,那么主串的前五位必定為“abaab”且第六位必定不是“c”,但第六位如果為“a”的話,那么我們就可以從模式串的第四位繼續(xù)比較下去。所以,這次比較為: 1 2 3 4 5 6 7 8 9 10 11 12 a b a a b * * * * * * * a b a a b c a c 而不是: 1 2 3 4 5 6 7 8 9 10 11 12 a b a a b * * * * * * * a b a a b c a 因?yàn)榍皟晌籥和b已經(jīng)確定了,所以不需要再進(jìn)行比較了。所以模式串第六位的nextval值為這次比較的偏移量3。 再來看求nextval數(shù)組值的第二種方法。模式串 a b a a b c a c next值 0 1 1 2 2 3 1 2 nextval值 0 1 0 2 1 3 0 2 1.第一位的nextval值必定為0,第二位如果于第一位相同則為0,如果不同則為1。 2.第三位的next值為1,那么將第三位和第一位進(jìn)行比較,均為a,相同,則,第三位的nextval值為0。 3.第四位的next值為2,那么將第四位和第二位進(jìn)行比較,不同,則第四位的nextval值為其next值,為2。 4.第五位的next值為2,那么將第五位和第二位進(jìn)行比較,相同,第二位的next值為1,則繼續(xù)將第二位與第一位進(jìn)行比較,不同,則第五位的nextval值為第二位的next值,為1。 5.第六位的next值為3,那么將第六位和第三位進(jìn)行比較,不同,則第六位的nextval值為其next值,為3。 6.第七
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業(yè)領(lǐng)域的新能源技術(shù)優(yōu)化與創(chuàng)新
- 工業(yè)設(shè)計(jì)與產(chǎn)業(yè)創(chuàng)新發(fā)展分析報(bào)告
- 工業(yè)設(shè)計(jì)創(chuàng)新與市場(chǎng)應(yīng)用研究
- 工作效率提升工具與方法介紹
- 工業(yè)風(fēng)辦公室裝修風(fēng)格及案例分享
- 工廠智能化改造的商業(yè)價(jià)值分析
- 工程施工質(zhì)量通病防治措施
- 工程機(jī)械液壓系統(tǒng)的故障處理
- 工程地質(zhì)學(xué)建筑基礎(chǔ)穩(wěn)定性研究
- 工程項(xiàng)目管理與質(zhì)量保障
- 項(xiàng)目部用工管理辦法
- 四川水利水電建筑工程預(yù)算定額
- 玩具訂貨合同范本
- 多旋翼飛行原理(改)
- 2024屆湖北省鄂東南聯(lián)盟數(shù)學(xué)高一下期末達(dá)標(biāo)檢測(cè)模擬試題含解析
- 鹽城市2023-2024學(xué)年三年級(jí)語文第二學(xué)期期末調(diào)研檢測(cè)模擬卷
- 如何做一個(gè)自律的人主題班會(huì)
- 2024絕經(jīng)后無癥狀子宮內(nèi)膜增厚診療中國(guó)專家共識(shí)(完整版)
- 《快遞企業(yè)安全管理》課件
- 冷板液冷標(biāo)準(zhǔn)化及技術(shù)優(yōu)化白皮書-2023.12
- 物理降溫法與熱療技術(shù)試題
評(píng)論
0/150
提交評(píng)論