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

KMP算法原理原來這么簡單

這篇具有很好參考價(jià)值的文章主要介紹了KMP算法原理原來這么簡單。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

我覺得這句話說的很好:
kmp算法關(guān)鍵在于:在當(dāng)前對(duì)文本串和模式串檢索的過程中,若出現(xiàn)了不匹配,如何充分利用已經(jīng)匹配的部分,來繼續(xù)接下來的檢索。


暴力解決字符串匹配

KMP算法原理原來這么簡單
暴力解法就是兩層for循環(huán),每次都一對(duì)一的匹配,如果匹配錯(cuò)誤就文本串開始位置加1,繼續(xù)下一次


前綴表的作用

前綴表的作用就是當(dāng)前位置匹配失敗之后,通過前綴表記錄的數(shù)字來去找到模式串中最合適的位置去重新開始下一次匹配,也就是說,匹配到當(dāng)前位置失敗,通過前綴表跳到前面位置繼續(xù)匹配。

KMP算法原理原來這么簡單
我們一個(gè)一個(gè)匹配,如果出現(xiàn)不匹配,這時(shí)候我們希望通過已經(jīng)匹配過的字符串,找到其相同的前綴與后綴,來繼續(xù)接下來的匹配。
KMP算法原理原來這么簡單
那我們?cè)撊绾稳ビ?jì)算這個(gè)前綴字串與后綴字串在每個(gè)位置的最大值,來去繼續(xù)模式串匹配呢?就是接下來的前綴表的計(jì)算(也就是很多KMP算法中next數(shù)組的計(jì)算)


前綴表的計(jì)算(next數(shù)組計(jì)算)

  • 什么是前綴?
    前綴就是一個(gè)字符串不包括最末尾的字符從第一個(gè)開始的所有連續(xù)字串
    主串:aabaac
    前綴:a 、aa 、aab 、aaba 、aabaa
  • 什么是后綴?
    后綴就是一個(gè)字符串不包含第一個(gè)字符,每次以末尾結(jié)尾的連續(xù)字串
    主串:aabaac
    后綴:c 、ac 、aac 、baac 、abaac
  • 如何計(jì)算前綴表?
    KMP算法原理原來這么簡單

如何使用前綴表?

KMP算法原理原來這么簡單
在KMP算法中,一般的next數(shù)組會(huì)直接使用前綴表,也可能在前綴表的基礎(chǔ)上改進(jìn)一點(diǎn),但是最終的思路都是圍繞前綴表展開,比如有些實(shí)現(xiàn)方法是把前綴表統(tǒng)一減一或者整體右移一位,初始位為-1。

時(shí)間復(fù)雜度:主串與模式串匹配過程最多為O(N),模式串的next數(shù)組生成為O(M),所以最后的時(shí)間復(fù)雜度可以為O(N+M),相較于暴力寫法的O(N*M),KMP算法還是極大的提高了檢索的效率。

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

構(gòu)造next數(shù)組其實(shí)就是計(jì)算模式串s,前綴表的過程。 主要有如下三步:

  1. 初始化
  2. 處理前后綴不相同的情況
  3. 處理前后綴相同的情況

初始化:
定義兩個(gè)指針i和j,j指向前綴末尾位置,i指向后綴末尾位置。
然后還要對(duì)next數(shù)組進(jìn)行初始化賦值,如下:

int j = -1;
next[0] = j;

處理前后綴不相同的情況:
因?yàn)閖初始化為-1,那么i就從1開始,進(jìn)行s[i] 與 s[j+1]的比較。
所以遍歷模式串s的循環(huán)下標(biāo)i 要從 1開始,代碼如下:

for (int i = 1; i < s.size(); i++) {

如果 s[i] 與 s[j+1]不相同,也就是遇到 前后綴末尾不相同的情況,就要向前回退。next[j]就是記錄著j(包括j)之前的子串的相同前后綴的長度。那么 s[i] 與 s[j+1] 不相同,就要找 j+1前一個(gè)元素在next數(shù)組里的值(就是next[j])。
回退代碼:

while (j >= 0 && s[i] != s[j + 1]) { // 前后綴不相同了
    j = next[j]; // 向前回退
}

處理前后綴相同的情況
如果 s[i] 與 s[j + 1] 相同,那么就同時(shí)向后移動(dòng)i 和j 說明找到了相同的前后綴,同時(shí)還要將j(前綴的長度)賦給next[i], 因?yàn)閚ext[i]要記錄相同前后綴的長度。

if (s[i] == s[j + 1]) { // 找到相同的前后綴
    j++;
}
next[i] = j;

構(gòu)建next數(shù)組最終代碼:

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]
    }
}

本文主要是看了代碼隨想錄的有感理解+畫圖????

KMP算法題目:leetcode -28

28.找出字符串中第一個(gè)匹配項(xiàng)的下標(biāo)
給你兩個(gè)字符串 haystack 和 needle ,請(qǐng)你在 haystack 字符串中找出 needle 字符串的第一個(gè)匹配項(xiàng)的下標(biāo)(下標(biāo)從 0 開始)。如果 needle 不是 haystack 的一部分,則返回 -1 。

示例 1:

輸入:haystack = “sadbutsad”, needle = “sad”
輸出:0
解釋:“sad” 在下標(biāo) 0 和 6 處匹配。
第一個(gè)匹配項(xiàng)的下標(biāo)是 0 ,所以返回 0 。文章來源地址http://www.zghlxwxcb.cn/news/detail-420640.html

class Solution {
public:
    void Getnext(string s, vector<int>& next)
    {
        int j=0;
        next[j]=0;
        for(int i=1;i<next.size();i++)
        {
            while(j>0 && s[i]!=s[j])
            {
                j=next[j-1];
            }
            if(s[i]==s[j])
            {
                j++;
            }
            next[i]=j;
        }
    }
    int strStr(string haystack, string needle) {
        vector<int> next(needle.size(),0);
        Getnext(needle,next);
        int j=0;
        for(int i=0;i<haystack.size();i++)
        {
            while(j>0 && haystack[i] != needle[j])
            {
                j=next[j-1];
            }
            if(haystack[i]==needle[j])
            {
                j++;
            }
            if(j==needle.size())
            {
                return i-needle.size()+1;
            }
        }
        return -1;        
    }
};

到了這里,關(guān)于KMP算法原理原來這么簡單的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 央視的《AI我中華》宣傳視頻,原來這么簡單?

    央視的《AI我中華》宣傳視頻,原來這么簡單?

    前段時(shí)間,央視的《愛我中華》AI宣傳短片火爆全網(wǎng),有一個(gè)穿越轉(zhuǎn)場(chǎng)效果非常驚艷! 今天就先來詳細(xì)講解,如何利用Stable Diffusion制作這樣的穿越轉(zhuǎn)場(chǎng)視頻。 用到的擴(kuò)展插件就是大名鼎鼎的Deforum,其實(shí)很早以前很火的“瞬息全宇宙”視頻也是用它來完成的。 需要AI繪畫素材

    2024年04月26日
    瀏覽(26)
  • 原來Vinted注冊(cè)這么簡單!Vinted注冊(cè)保姆級(jí)教程分享

    原來Vinted注冊(cè)這么簡單!Vinted注冊(cè)保姆級(jí)教程分享

    如果是日本的二手平臺(tái)代表是煤爐,美國是PoshMark,那歐洲呼聲最高的就是Vinted了,今天東哥就給大家科普一下Vinted這個(gè)平臺(tái),教大家怎么去成功注冊(cè)Vinted,開啟自己的Vinted跨境電商之旅。 Vinted跟煤爐、某魚差不多性質(zhì),是一個(gè)二手服裝商品和配飾的平臺(tái),支持在?iOS、Andr

    2024年02月09日
    瀏覽(17)
  • python輕量級(jí)web框架flask初探,搭建網(wǎng)站原來這么簡單

    python輕量級(jí)web框架flask初探,搭建網(wǎng)站原來這么簡單

    ?? 歡迎大家來到景天科技苑?? ???? 養(yǎng)成好習(xí)慣,先贊后看哦~???? ?? 作者簡介:景天科技苑 ??《頭銜》:大廠架構(gòu)師,華為云開發(fā)者社區(qū)專家博主,阿里云開發(fā)者社區(qū)專家博主,CSDN新星創(chuàng)作者,掘金優(yōu)秀博主,51CTO博客專家等。 ??《博客》:Python全棧,前后端開

    2024年03月19日
    瀏覽(575)
  • KMP算法的及其原理

    KMP算法的及其原理

    ?KMP算法 首先?我們先了解一下?KMP算法的作用?str1?和str2?字符串?如果str1中包含str2?那么返回頭位置 如果不包含返回-1 首先?我們先加入一個(gè)概念:?有一個(gè)next數(shù)組?next[i]的值為?str2?中?以i-1位置為結(jié)尾的字符串中?最長相同前綴后綴為多長(相同前綴后綴?不是對(duì)稱? aba?中

    2024年02月15日
    瀏覽(18)
  • 【算法 - 動(dòng)態(tài)規(guī)劃】原來寫出動(dòng)態(tài)規(guī)劃如此簡單!

    【算法 - 動(dòng)態(tài)規(guī)劃】原來寫出動(dòng)態(tài)規(guī)劃如此簡單!

    從本篇開始,我們就正式開始進(jìn)入 動(dòng)態(tài)規(guī)劃 系列文章的學(xué)習(xí)。 本文先來練習(xí)兩道通過 建立緩存表 優(yōu)化解題過程的題目,對(duì)如何將 遞歸函數(shù) 修改成 動(dòng)態(tài)規(guī)劃 的流程有個(gè)基本的熟悉。 用最簡單的想法完成題目要求的 遞歸 函數(shù); 定義明確 遞歸函數(shù) 的功能?。?! 分析是否存

    2024年02月21日
    瀏覽(29)
  • 物聯(lián)網(wǎng)網(wǎng)關(guān),原來是這么回事,感謝!

    物聯(lián)網(wǎng)網(wǎng)關(guān),原來是這么回事,感謝!

    《高并發(fā)系統(tǒng)實(shí)戰(zhàn)派》-- 你值得擁有 物聯(lián)網(wǎng)網(wǎng)關(guān)是連接物聯(lián)網(wǎng)設(shè)備和互聯(lián)網(wǎng)的重要橋梁,它負(fù)責(zé)將物聯(lián)網(wǎng)設(shè)備采集到的數(shù)據(jù)進(jìn)行處理、存儲(chǔ)和轉(zhuǎn)發(fā),使其能夠與云端或其他設(shè)備進(jìn)行通信。物聯(lián)網(wǎng)網(wǎng)關(guān)的作用是實(shí)現(xiàn)物聯(lián)網(wǎng)設(shè)備與云端的無縫連接和數(shù)據(jù)交換。 不要物聯(lián)網(wǎng)網(wǎng)關(guān)行

    2024年02月08日
    瀏覽(18)
  • 數(shù)據(jù)結(jié)構(gòu)-串-KMP算法詳解(Next數(shù)組計(jì)算)(簡單易懂)

    數(shù)據(jù)結(jié)構(gòu)-串-KMP算法詳解(Next數(shù)組計(jì)算)(簡單易懂)

    本文章就專講kmp,暴力匹配就不講了(我相信能搜索kmp的,暴力匹配算法應(yīng)該也都了解過了) 為什么網(wǎng)上那么多講kmp 我還發(fā)文章,很多文章我覺得講的不是太通俗易懂,大多數(shù)我看起來都覺得有些懵逼 提示:以下信息來源百度 KMP算法是一種改進(jìn)的字符串匹配算法,由D.E.K

    2024年02月06日
    瀏覽(29)
  • 原來服務(wù)器這么有用-Docker安裝

    原來服務(wù)器這么有用-Docker安裝

    在此之前青陽通過各種方式介紹過自己通過服務(wù)器搭建的一些玩法,也寫過一些教程,但是那些教程,現(xiàn)在回頭來看,都是有些雜亂了,統(tǒng)一性不強(qiáng)。我就準(zhǔn)備重新整理一下之前寫的文章,并且準(zhǔn)備重新開一個(gè)專題來寫自己折騰的內(nèi)容,專題的名字就叫-原來服務(wù)器這么有用。

    2024年02月04日
    瀏覽(19)
  • 原來.NET寫的Linux桌面這么好看?

    本文將講解如何使用 Blazor 運(yùn)行跨平臺(tái)應(yīng)用,應(yīng)用到的技術(shù)有以下幾點(diǎn) Blazor Masa Blazor Photino.Blazor Ubuntu 用于驗(yàn)證跨平臺(tái)性,并且是否提高開發(fā)效率,Blazor和Photino一塊使用的技術(shù)稱為 Blazor Hybrid , Blazor是一種使用.NET和C#構(gòu)建客戶端Web應(yīng)用程序的新興技術(shù)。它允許開發(fā)者在瀏覽器

    2024年02月05日
    瀏覽(20)
  • Python制作進(jìn)度條,原來有這么多方法

    Python制作進(jìn)度條,原來有這么多方法

    如果你之前沒用過進(jìn)度條,八成是覺得它會(huì)增加不必要的復(fù)雜性或者很難維護(hù),其實(shí)不然。要加一個(gè)進(jìn)度條其實(shí)只需要幾行代碼。 在這幾行代碼中,我們可以看看如何在命令行腳本以及 PySimpleGUI UI 中添加進(jìn)度條。 下文將介紹 4 個(gè)常用的 Python 進(jìn)度條庫: 第一個(gè)要介紹的 Py

    2024年02月08日
    瀏覽(27)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包