国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一文搞懂KMP算法?。?!

這篇具有很好參考價值的文章主要介紹了一文搞懂KMP算法!??!。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

??什么是KMP算法?

  • KMP算法是一種改進(jìn)的 字符串匹配算法,由 D.E.Knuth,J.H.MorrisV.R.Pratt 提出的,因此人們稱它為 克努特—莫里斯—普拉特 操作(簡稱 KMP 算法)。
    • KMP 算法的核心是利用匹配失敗后的信息,盡量減少模式串與主串的匹配次數(shù)以達(dá)到快速匹配的目的。
    • 具體實(shí)現(xiàn)就是通過一個 next() 數(shù)組實(shí)現(xiàn),數(shù)組本身包含了模式串的局部匹配信息。KMP 算法的時間復(fù)雜度 O ( m + n ) O(m+n) O(m+n)。

??什么是 next() 數(shù)組 和 前綴表?

next 數(shù)組就是一個前綴表(prefix table)!

前綴表有什么作用呢

前綴表是用來回退的,它記錄了 模式串主串(文本串) 不匹配的時候,模式串 應(yīng)該從哪里開始重新匹配。

我們來舉一個例子:

  • 要在文本串aabaabaafa 中查找是否出現(xiàn)過一個模式串aabaaf

如動畫所示

一文搞懂KMP算法?。?!

最長公共前后綴

  • 字符串的前綴是:指不包含最后一個字符的所有 以第一個字符開頭的連續(xù)子串。
  • 后綴:是指不包含第一個字符的所有 以最后一個字符結(jié)尾的連續(xù)子串。

正確理解什么是前綴什么是后綴很重要!
可以理解為最長相等前后綴

如何計算前綴表

注意字符串的前綴是指不包含最后一個字符的所有以第一個字符開頭的連續(xù)子串;后綴是指不包含第一個字符的所有以最后一個字符結(jié)尾的連續(xù)子串。

  1. 長度為前1個字符的子串 a,最長相同前后綴的長度為 0 。

一文搞懂KMP算法?。?!

  1. 長度為前2個字符的子串 aa ,最長相同前后綴的長度為 1 。

一文搞懂KMP算法!?。? referrerpolicy=
3. 長度為前3個字符的子串 aab,最長相同前后綴的長度為 0 。

一文搞懂KMP算法!??!

  1. 以此類推: 長度為前4個字符的子串 aaba,最長相同前后綴的長度為 1
  2. 長度為前5個字符的子串aabaa,最長相同前后綴的長度為 2
  3. 長度為前6個字符的子串aabaaf,最長相同前后綴的長度為 0

一文搞懂KMP算法?。。? referrerpolicy=

?? 構(gòu)造next數(shù)組

構(gòu)造 next 數(shù)組其實(shí)就是計算 模式串 s

  • 定義兩個指針 ij ,j 指向前綴末尾位置, i 指向后綴末尾位置。
  • next[i] 表示 i(包括 i )之前最長相等的前后綴長度(其實(shí)就是 j)。

next 數(shù)組就可以是前綴表,但是很多實(shí)現(xiàn)都是把 前綴表統(tǒng)一減一(右移一位,初始位置為 -1 )之后作為 next 數(shù)組。前綴表的構(gòu)造過程,主要有如下三步:

  1. 初始化:
    • j 初始化為 -1;
  2. 處理前后綴不相同的情況
    • 因為 j 初始化為 -1,那么 i 就從1 開始,進(jìn)行 s[i]s[j+1] 的比較;
    • 如果 s[i]s[j+1] 不相同,也就是遇到 前后綴末尾不相同的情況,就要向前回退。
      • next[j] 就是記錄著 j(包括 j )之前的子串的相同前后綴的長度;
      • 那么 s[i]s[j+1] 不相同,就要找 j+1 前一個元素在 next 數(shù)組里的值(就是 next[j] )。
  3. 處理前后綴相同的情況
    • 如果 s[i]s[j + 1] 相同,那么就同時向后移動 ij 說明找到了相同的前后綴,同時還要將 j(前綴的長度)賦給 next[i] , 因為 next[i] 要記錄相同前后綴的長度。

構(gòu)造 next 數(shù)組的邏輯流程動畫如下:
一文搞懂KMP算法?。。? referrerpolicy=
構(gòu)造 next 數(shù)組的函數(shù)如下:(C++)

void getNext(int* next, const string& s){
    int j = -1;
    next[0] = j;
    for(int i = 1; i < s.size(); i++) { // 注意i從1開始
        while (j >= 0 && s[i] != s[j + 1]) { // 前后綴不相同了
            j = next[j]; // 向前回退
        }
        if (s[i] == s[j + 1]) { // 找到相同的前后綴
            j++;
        }
        next[i] = j; // 將j(前綴的長度)賦給next[i]
    }
}

?? 使用next數(shù)組來做匹配

在文本串 s 里找是否出現(xiàn)過模式串 t。

  • 定義兩個下標(biāo) j 指向模式串起始位置,i 指向文本串起始位置;
  • j 初始值依然為 -1;
  • 接下來就是 s[i]t[j + 1] (因為 j-1 開始的)進(jìn)行比較:
    • 如果 s[i]t[j + 1] 不相同,j 就要從 next 數(shù)組里尋找下一個匹配的位置;
    • 如果 s[i]t[j + 1] 相同,那么 ij 同時向后移動。
  • 如果 j 指向了模式串 t 的末尾,那么就說明模式串 t 完全匹配文本串 s 里的某個子串了。
int strStr(string haystack, string needle) {
	if (needle.size() == 0) {
	    return 0;
	}
	int next[needle.size()];
	getNext(next, needle);
	int j = -1; // // 因為next數(shù)組里記錄的起始位置為-1
	for (int i = 0; i < haystack.size(); i++) { // 注意i就從0開始
	    while(j >= 0 && haystack[i] != needle[j + 1]) { // 不匹配
	        j = next[j]; // j 尋找之前匹配的位置
	    }
	    if (haystack[i] == needle[j + 1]) { // 匹配,j和i同時向后移動
	        j++; // i的增加在for循環(huán)里
	    }
	    if (j == (needle.size() - 1) ) { // 文本串s里出現(xiàn)了模式串t
	        return (i - needle.size() + 1);
	    }
	}
	return -1;
}

匹配過程如下:
一文搞懂KMP算法?。?!

時間復(fù)雜度: O ( n + m ) O(n + m) O(n+m)。
空間復(fù)雜度: O ( m ) O(m) O(m), 只需要保存字符串 needle 的前綴表。

放棄一件事很容易,每天能堅持一件事一定很酷,一起每日一題吧!
關(guān)注我LeetCode主頁 / CSDN—力扣專欄,每日更新!

注:僅供學(xué)習(xí)參考,如有不足,歡迎指正!文章來源地址http://www.zghlxwxcb.cn/news/detail-471808.html

到了這里,關(guān)于一文搞懂KMP算法?。。〉奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 一文搞懂全連接算法和它的作用

    一文搞懂全連接算法和它的作用

    如果你是搞AI算法的同學(xué),相信你在很多地方都見過全連接層。 無論是處理圖片的卷積神經(jīng)網(wǎng)絡(luò)(CNN),還是處理文本的自然語言處理(NLP)網(wǎng)絡(luò),在網(wǎng)絡(luò)的結(jié)尾做分類的時候,總是會出現(xiàn)一個全連接層。 那么到底什么是全連接層,這一層在神經(jīng)網(wǎng)絡(luò)中有什么作用,以及它和

    2024年02月20日
    瀏覽(17)
  • 一文搞懂分庫分表算法,通俗易懂(基因法、一致性 hash、時間維度)

    一文搞懂分庫分表算法,通俗易懂(基因法、一致性 hash、時間維度)

    最近手上一個系統(tǒng)的訪問速度有點(diǎn)慢,老早前用多線程優(yōu)化過一些接口,將一些復(fù)雜 sql 改成單表查詢,走內(nèi)存處理,成功的將 一些 10 多秒的接口優(yōu)化到 500 ms,但是數(shù)據(jù)量上來了單表查詢效率也有點(diǎn)慢了,不得不考慮進(jìn)行分庫分表了,當(dāng)然我這里只進(jìn)行分表,沒分庫,問就是

    2024年02月03日
    瀏覽(15)
  • 一文搞懂MD5、SHA-1、SHA-2、SHA-3,哪個算法比較安全

    一文搞懂MD5、SHA-1、SHA-2、SHA-3,哪個算法比較安全

    MD5、SHA-1、SHA-2、SHA-3都是比較常見的單向散列函數(shù),這幾種單向散列函數(shù)都有自己的特性。下面,給大家介紹一下它們的區(qū)別,以及MD5、SHA-1、SHA-2、SHA-3的安全性如何,哪種算法比較安全? 一、簡介 單向散列函數(shù)是指對不同的輸入值,通過單向散列函數(shù)進(jìn)行計算,得到固定

    2024年02月15日
    瀏覽(37)
  • 《Towards Open Set Deep Networks》:一文搞懂開集識別算法 OpenMax:

    《Towards Open Set Deep Networks》:一文搞懂開集識別算法 OpenMax:

    《Towards Open Set Deep Networks》:https://github.com/abhijitbendale/OSDN 《Meta-Recognition: The Theory and Practice of Recognition Score Analysis》:https://github.com/Vastlab/libMR 說明:關(guān)于OpenMax算法的具體實(shí)現(xiàn),有興趣的可以備注來意q:3270348868 1. 激活向量 AV:即訓(xùn)練(測試)樣本通過神經(jīng)網(wǎng)絡(luò)的倒數(shù)第二

    2024年01月20日
    瀏覽(22)
  • 一文搞懂containerd

    一文搞懂containerd

    在學(xué)習(xí) Containerd 之前我們有必要對 Docker 的發(fā)展歷史做一個簡單的回顧,因為這里面牽涉到的組件實(shí)戰(zhàn)是有點(diǎn)多,有很多我們會經(jīng)常聽到,但是不清楚這些組件到底是干什么用的,比如 libcontainer 、 runc 、 containerd 、 CRI 、 OCI 等等。 從 Docker 1.11 版本開始,Docker 容器運(yùn)行就不

    2024年02月11日
    瀏覽(17)
  • [MySQL事務(wù)一文搞懂]

    事務(wù)(Transaction),顧名思義就是要做的或所做的事情,數(shù)據(jù)庫事務(wù)指的則是作為單個邏輯工作單元執(zhí)行的一系列操作(SQL語句)。 這些操作要么全部執(zhí)行,要么全部不執(zhí)行。 把一系列sql放入一個事務(wù)中有兩個目的: 為數(shù)據(jù)庫操作提供了一個從失敗中恢復(fù)到正常狀態(tài)的方法,同

    2024年02月05日
    瀏覽(20)
  • 一文搞懂性能測試

    一文搞懂性能測試

    我們經(jīng)??吹降男阅軠y試概念,有人或稱之為性能策略,或稱之為性能方法,或稱之為性能場景分類,大概可以看到性能測試、負(fù)載測試、壓力測試、強(qiáng)度測試等一堆專有名詞的解釋。 針對這些概念,我不知道你看到的時候會不會像我的感覺一樣:亂!一個小小的性能測試,

    2024年02月08日
    瀏覽(23)
  • 一文搞懂Nginx(上)

    一文搞懂Nginx(上)

    是一個高性能的HTTP和反向代理web服務(wù)器,我們常用的功能有HTTP代理、負(fù)載均衡、動靜分離、高可用集群,目前階段我使用得比較多是就是代理和負(fù)載均衡,官方數(shù)據(jù)測試表明能夠支持高達(dá) 50,000 個并發(fā)連接數(shù)的響應(yīng)。占用的內(nèi)存也特別的少。 優(yōu)點(diǎn): 1、負(fù)載均衡(可以減輕單

    2024年04月09日
    瀏覽(20)
  • 一文搞懂隱私計算

    一文搞懂隱私計算

    隱私計算(Privacy computing)是指在保證數(shù)據(jù)不對外泄露的前提下,由兩個或多個參與方聯(lián)合完成數(shù)據(jù)分析計算相關(guān)技術(shù)的統(tǒng)稱。 隱私計算作為跨學(xué)科技術(shù),以密碼學(xué)為核心理論, 結(jié)合了大數(shù)據(jù)、人工智能、區(qū)塊鏈等多領(lǐng)域知識。其這些技術(shù)路線中,以安全多方計算為代表的基

    2024年02月07日
    瀏覽(25)
  • 一文搞懂HBA卡

    一文搞懂HBA卡

    HBA卡是一個簡稱,準(zhǔn)確叫法應(yīng)該是:主機(jī)總線適配器(Host Bus Adapter,HBA),也叫做FC-HBA卡(俗稱:光纖網(wǎng)卡)、iSCSI-HBA卡(RJ45接口)。這是一個在服務(wù)器和存儲裝置間提供輸入/輸出(I/O)處理和物理連接的電路板或集成電路適配器。由于傳輸協(xié)議的不同而出現(xiàn),一般用在服務(wù)器的

    2024年02月04日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包