国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

互聯(lián)網(wǎng)行業(yè)信息網(wǎng)站免費b2b網(wǎng)站推廣渠道

互聯(lián)網(wǎng)行業(yè)信息網(wǎng)站,免費b2b網(wǎng)站推廣渠道,python18,昆明建設網(wǎng)站哪家好前言 刷到字符串匹配的力扣題了【28. 實現(xiàn) strStr() 】,這題簡單吧用庫函數(shù)做就可以,說難吧,就得引出大名鼎鼎的線性匹配算法——KMP。 目錄 KMP 算法背景與原理算法優(yōu)勢 前綴表1. 構建Next數(shù)組2. 搜索匹配 KMP 算法背景與原理 KMP&#x…

前言
刷到字符串匹配的力扣題了【28. 實現(xiàn) strStr() 】,這題簡單吧用庫函數(shù)做就可以,說難吧,就得引出大名鼎鼎的線性匹配算法——KMP。

目錄

  • KMP
    • 算法背景與原理
    • 算法優(yōu)勢
  • 前綴表
    • 1. 構建Next數(shù)組
    • 2. 搜索匹配

KMP

算法背景與原理

KMP(Knuth-Morris-Pratt)算法是一種高效的字符串匹配算法,由Donald Knuth、Vaughan Pratt等人在1977年提出。該算法的核心思想是避免在字符串匹配過程中不必要的回溯,從而提高匹配效率。

在傳統(tǒng)的字符串匹配算法中,如Brute Force方法,一旦發(fā)現(xiàn)不匹配,模式串會回溯到下一個起始位置重新開始匹配。這種方法在最壞情況下的時間復雜度為O(nm),其中n是主串長度,m是模式串長度。而KMP算法通過預處理模式串,構造一個部分匹配表(也稱為next數(shù)組),在發(fā)生不匹配時,可以跳過已經(jīng)確認不會匹配的部分,從而提高匹配效率。

核心思想:由傳統(tǒng)雙層循環(huán)遍歷入手優(yōu)化時間復雜度,優(yōu)化的手段是借助前綴表保證外層索引單向移動。

算法優(yōu)勢

KMP算法的主要優(yōu)勢在于其時間復雜度為O(n+m),相比傳統(tǒng)的Brute Force方法,KMP算法在最壞情況下也能保持較高的效率。這是因為KMP算法利用了已經(jīng)匹配的信息來避免不必要的重復比較。具體來說,KMP算法的優(yōu)勢體現(xiàn)在以下幾個方面:

  1. 預處理階段:KMP算法首先對模式串進行預處理,生成next數(shù)組,這一步驟的時間復雜度為O(m)。
  2. 匹配階段:在匹配過程中,當發(fā)現(xiàn)不匹配時,KMP算法利用next數(shù)組來決定模式串應該向右移動多少個字符,而不是簡單地回溯到下一個字符。
  3. 避免回溯:由于KMP算法能夠利用next數(shù)組避免不必要的回溯,因此在最壞情況下也能保持較高的效率。

前綴表

在KMP算法中,next數(shù)組是一個關鍵的數(shù)據(jù)結構,它用于存儲模式串中每個位置之前的最長相等前后綴的長度。

1. 構建Next數(shù)組

首先,我們需要構建next數(shù)組,這個數(shù)組將存儲模式串中每個位置的最長相同前綴和后綴的長度。我們將next[0]初始化為0,因為模式串的第一個字符沒有前綴。

public class KMPMatcher {private String pattern;private int[] next;public KMPMatcher(String pattern) {this.pattern = pattern;next = new int[pattern.length()];computeNext();}// 構建Next數(shù)組private void computeNext() {int len = 0; // 最長相等前后綴的長度next[0] = 0; // next[0]初始化為0int i = 1;while (i < pattern.length()) {if (pattern.charAt(i) == pattern.charAt(len)) {len++;next[i] = len;i++;} else {if (len > 0) {len = next[len - 1];} else {next[i] = 0;i++;}}}}
}
  • pattern:模式串,我們需要在其上構建next數(shù)組。
  • next:用于存儲模式串的部分匹配結果的數(shù)組。
  • computeNext方法:計算next數(shù)組的值。
    • len:記錄當前匹配的最長前后綴的長度。
    • pattern.charAt(i)等于pattern.charAt(len)時,增加leni,并將next[i]設置為len。
    • 如果不相等且len大于0,len回溯到next[len - 1]。
    • 如果len為0,next[i]設置為0,i增加1。

2. 搜索匹配

接下來,我們使用構建好的next數(shù)組來搜索主串中是否存在模式串。

public int search(String text) {int i = 0; // 主串的索引int j = 0; // 模式串的索引while (i < text.length()) {if (j == pattern.length()) {return i - j; // 找到匹配,返回位置} else if (i < text.length() && pattern.charAt(j) == text.charAt(i)) {i++;j++;} else {if (j > 0) {j = next[j - 1];} else {i++;}}}return -1; // 未找到匹配
}
  • search方法:在主串text中搜索模式串pattern。
    • ij:分別為主串和模式串的索引。
    • j等于模式串長度時,表示找到匹配,返回匹配的起始位置。
    • text.charAt(i)等于pattern.charAt(j)時,兩個索引都增加。
    • 如果字符不匹配且j大于0,根據(jù)next數(shù)組回溯j。
    • 如果j為0,i增加1,繼續(xù)匹配。

這個實現(xiàn)中,next[0]被初始化為0,這與一些其他實現(xiàn)中next[0]初始化為-1有所不同。這種實現(xiàn)方式在邏輯上更直觀,因為next[0]表示模式串的第一個字符沒有前綴,所以其長度自然為0。

http://aloenet.com.cn/news/32671.html

相關文章:

  • wordpress圖片燈箱效果修改百度seo營銷推廣
  • 廣州做網(wǎng)站厲害的公司互聯(lián)網(wǎng)營銷師證書騙局
  • 簡單建設一個網(wǎng)站的過程長春網(wǎng)站seo公司
  • 免費信息網(wǎng)站建設7個湖北seo網(wǎng)站推廣策略
  • 陜西網(wǎng)站建設通報網(wǎng)址搜索
  • 做購物網(wǎng)站 需要手續(xù)百度搜索廣告怎么投放
  • 020網(wǎng)站建設和維護費用數(shù)據(jù)分析培訓班
  • 做網(wǎng)站軟件html css百度灰色關鍵詞代做
  • 東莞做網(wǎng)站價格360網(wǎng)站推廣怎么做
  • 企業(yè)局域網(wǎng)游戲網(wǎng)站如何做限制自動點擊器安卓
  • 哪里有學編程的培訓班神馬seo教程
  • 寧晉網(wǎng)站建設代理價格深圳百度推廣優(yōu)化
  • 攝影網(wǎng)站建設廣東廣州疫情最新情況
  • 石家莊網(wǎng)站建設公司哪家好如何制作網(wǎng)頁鏈接
  • 小兔自助建站百度一下1688
  • 泉州網(wǎng)站建設網(wǎng)絡推廣要求
  • 裝修網(wǎng)站怎么做seo 工具
  • 正保建設工程教育網(wǎng)站線上推廣方式有哪些
  • 家電維修做網(wǎng)站生意怎么樣合肥網(wǎng)站維護公司
  • 徐州網(wǎng)站建設哪家好企業(yè)管理培訓機構
  • 日照網(wǎng)站建設價格蘇貨運公司回收百度賬戶推廣登陸
  • 百度快照入口seo站長工具 論壇
  • 與做網(wǎng)站有關的參考文獻網(wǎng)絡營銷的四種形式
  • 做網(wǎng)站要霸屏嗎推廣營銷
  • 溫江做網(wǎng)站seo在線短視頻發(fā)布頁
  • 常州專業(yè)網(wǎng)站建設推廣seo基礎培訓機構
  • 服務器如何發(fā)布網(wǎng)站無線網(wǎng)絡優(yōu)化是做什么的
  • 石家莊新華區(qū)網(wǎng)站建設推廣官網(wǎng)
  • 批量 網(wǎng)站標題常用的營銷方法和手段
  • 南京網(wǎng)站開發(fā)注冊app近期國內(nèi)新聞熱點事件