算法基礎:KMP算法詳細詳解

目錄

1、幾個最基本的概念

2、暴力算法?

3、KMP算法?

4、KMP代碼實現

5、時間復雜度


1、幾個最基本的概念

  1. 字符串的前綴: 主串(目標串)從索引0開始的子串被稱為主串的前綴。

  2. 字符串的后綴: 主串從索引大于0的位置到結尾的子串稱為主串的后綴。

  3. 目標串: 也稱為主串,是比較長的字符串。

  4. 模式串: 也稱為子串,是較短的字符串,用來在目標串中進行匹配。

  5. KMP算法的目的: 以O(m+n)的時間復雜度,在目標串中找到模式串,并返回模式串在目標串中的第一個字符的索引位置。其中,m為模式串的長度,n為目標串的長度。

2、暴力算法?
?

暴力算法是一種簡單直觀但效率較低的字符串匹配算法。其基本思想是,對于目標串的每一個可能的起始位置,都嘗試將模式串與目標串進行比較,直到找到匹配或者遍歷完整個目標串。以下是暴力算法的詳細講解:

public class BruteForce {// 暴力匹配算法public static int bruteForceSearch(String text, String pattern) {int n = text.length();int m = pattern.length();// i為目標串的起始位置for (int i = 0; i <= n - m; i++) {int j;// j為模式串的索引,用于和目標串的子串進行比較for (j = 0; j < m; j++) {if (text.charAt(i + j) != pattern.charAt(j)) {break;  // 如果不匹配,退出內循環}}if (j == m) {return i;  // 找到匹配,返回起始位置}}return -1;  // 未找到匹配}public static void main(String[] args) {String text = "ABABDABACDABABCABAB";String pattern = "ABABCABAB";int index = bruteForceSearch(text, pattern);if (index != -1) {System.out.println("匹配成功,起始位置:" + index);} else {System.out.println("未找到匹配");}}
}

3、KMP算法?

KMP算法(Knuth-Morris-Pratt算法)是一種用于字符串匹配的經典算法,它能夠在文本串和模式串不匹配的情況下,通過已經匹配的部分信息,避免將模式串移動到所有可能的位置進行匹配,從而提高匹配效率。下面我將用Java語言詳細講解KMP算法的實現。

KMP算法的關鍵在于構建一個部分匹配表(Partial Match Table),該表記錄了模式串每個位置的最長前綴和最長后綴的匹配長度。這個表可以幫助算法在匹配失敗時,跳過一些不可能匹配的位置,從而減少匹配次數。

4、KMP代碼實現

public class KMP {// 構建部分匹配表private static int[] buildPartialMatchTable(String pattern) {int[] lps = new int[pattern.length()];int len = 0;  // 當前最長匹配前綴和后綴的長度for (int i = 1; i < pattern.length(); ) {if (pattern.charAt(i) == pattern.charAt(len)) {len++;lps[i] = len;i++;} else {if (len != 0) {len = lps[len - 1];} else {lps[i] = 0;i++;}}}return lps;}// KMP匹配算法public static int kmpSearch(String text, String pattern) {int[] lps = buildPartialMatchTable(pattern);int i = 0;  // text的索引int j = 0;  // pattern的索引while (i < text.length()) {if (pattern.charAt(j) == text.charAt(i)) {i++;j++;}if (j == pattern.length()) {// 匹配成功return i - j;} else if (i < text.length() && pattern.charAt(j) != text.charAt(i)) {// 不匹配時,根據部分匹配表跳過一些可能不匹配的位置if (j != 0) {j = lps[j - 1];} else {i++;}}}// 沒有找到匹配return -1;}public static void main(String[] args) {String text = "ABABDABACDABABCABAB";String pattern = "ABABCABAB";int index = kmpSearch(text, pattern);if (index != -1) {System.out.println("匹配成功,起始位置:" + index);} else {System.out.println("未找到匹配");}}
}

5、時間復雜度

KMP算法的時間復雜度為O(m + n),其中m是模式串的長度,n是目標串的長度。相較于暴力算法,KMP算法在大多數情況下具有更好的性能。

下面是對KMP算法時間復雜度的詳細講解:

  1. 構建部分匹配表的時間復雜度: 構建部分匹配表的過程只需要遍歷一次模式串,時間復雜度為O(m)。

  2. KMP匹配的時間復雜度: KMP算法的匹配階段,在最壞情況下需要遍歷整個目標串,但由于KMP算法的特性,它能夠避免不必要的比較。具體而言,當模式串與目標串的某一部分不匹配時,KMP算法可以通過部分匹配表跳過一些已經比較過的字符。因此,在匹配階段的總體時間復雜度為O(n)。

因此,KMP算法的總體時間復雜度為O(m + n)。相較于暴力算法的O((n-m+1) * m)來說,在目標串很長而模式串較短的情況下,KMP算法的性能更好。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160857.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160857.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160857.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【人工智能入門學習資料福利】

總目錄如下&#xff08;部分截取&#xff09;&#xff1a; 百度網盤鏈接&#xff1a;https://pan.baidu.com/s/1bfDVG-xcPR3f3nfBJXxqQQ?pwdifu6 提取碼&#xff1a; ifu6

Sentinel在Spring Cloud中的流量控制與熔斷降級:保障你的微服務穩定運行

在當今高度互聯的世界中&#xff0c;微服務架構已成為構建穩健系統的基石。然而&#xff0c;隨著系統復雜性的增加&#xff0c;高并發和異常情況下&#xff0c;保障服務穩定性變得尤為關鍵。本文將帶你探索Spring Cloud中Sentinel框架的強大功能&#xff0c;它能夠為你的微服務…

協程及運用

協程 使用方法一方法二網頁下載中使用有返回值 實戰圖片實戰 一個線程多個任務&#xff0c;線程由操作系統開啟&#xff0c;比較耗資源。線程內合理分配任務&#xff0c;充分利用線程內的資源&#xff0c;一個任務io阻塞時&#xff0c;cpu處理其他非阻塞任務。 使用 方法一 i…

B站已經部分上線前臺實名,如不同意實名,后期賬號流量將收影響!

B站部分百萬粉絲博主的主頁顯示賬號運營人名字的政策是從10月31日開始的。當天&#xff0c;B站官方發布了《嗶哩嗶哩關于頭部“自媒體”賬號前臺實名的公告》&#xff0c;表明了其前臺實名制的實施計劃。 B站部分上線前臺實名的過程可以追溯到2021年。當時&#xff0c;中國政府…

window下殺指定端口進程

netstat -ano | findstr "8762" taskkill /pid 14992 /f

【LeetCode】144. 二叉樹的前序遍歷

144. 二叉樹的前序遍歷 難度&#xff1a;簡單 題目 給你二叉樹的根節點 root &#xff0c;返回它節點值的 前序 遍歷。 示例 1&#xff1a; 輸入&#xff1a;root [1,null,2,3] 輸出&#xff1a;[1,2,3]示例 2&#xff1a; 輸入&#xff1a;root [] 輸出&#xff1a;[]…

ARM裸機-18(SD卡啟動)

1、主流的外存設備介紹 內存和外存的區別&#xff1a;一般是把這種RAM(random access memory&#xff0c;隨機訪問存儲器&#xff0c;特點是任意字節讀寫&#xff0c;掉電丟失)叫內存&#xff0c;把ROM (read only memory&#xff0c;只讀存儲器&#xff0c;類似于Flash、SD卡之…

如何解決安卓手機無法預覽pdf文件而是需要直接下載的問題

在開發中常常會遇到需要在一個應用里打開一份pdf文件并預覽&#xff0c;經真機調試時發現在蘋果手機上打開pdf文件能正常預覽&#xff0c;但在安卓手機打開時卻會需要我們下載才能預覽&#xff0c;無法直接預覽 為了解決這個問題&#xff0c;我們采用安裝pdfH5插件的方式&…

計算機三級嵌入式知識總結(一)

一、ARM的七種異常類型 1、復位異常RESET “復位異常RESET”通常是指在電子設備或系統中發生了一個意外的復位或重啟。這可能是由于硬件故障、軟件問題或其他未知的原因引起的。當設備經歷復位異常時&#xff0c;它可能會丟失正在進行的操作或設置&#xff0c;導致數據丟失或系…

LINUXZ

10.6.2 AT24C02 訪問方法 設備地址 從芯片手冊上可以知道&#xff0c;AT24C02 的設備地址跟它的 A2、A1、A0 引腳有關&#xff1a; 圖 10.36 AT24C02 設備地址引腳配置 294 / 577 打開 I2C 模塊的原理圖&#xff1a; 開發板配套網盤資料\04_開發板原理圖\ 04_Extend_modules\通…

SQL語句執行過程

一條 SQL 的執行過程可以大致分為以下幾個步驟&#xff1a; 連接器&#xff1a; ○ 客戶端與數據庫建立連接&#xff0c;并發送 SQL 語句給數據庫服務。 ○ 連接器驗證客戶端的身份和權限&#xff0c;確保用戶有足夠的權限執行該 SQL 語句。查詢緩存&#xff1a; ○ 連接器首先…

基于鷹棲息算法優化概率神經網絡PNN的分類預測 - 附代碼

基于鷹棲息算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于鷹棲息算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于鷹棲息優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要&#xff1a;針對PNN神經網絡…

Motion v5.6.7 蘋果電腦上的視頻編輯

Motion mac是一款運行在蘋果電腦上的視頻編輯軟件&#xff0c;它能讓您自定Final Cut Pro字幕、轉場和效果。 它可以在2D或3D空間中創建您自己的精美炫目的動畫&#xff0c;同時還能在您工作時提供實時反饋。廣色域支持讓你的動態圖形更顯出色光彩。3D文字功能經過優化增強&am…

01背包與完全背包學習總結

背包問題分類見下圖 參考學習點擊&#xff1a;代碼隨想錄01背包講解 01背包問題&#xff1a; 核心思路&#xff1a; 1、先遍歷物品個數&#xff0c;再遍歷背包容量。因為容量最先是最大的&#xff0c;往背包里放物品&#xff0c;所以背包容量在慢慢減少&#xff0c;但背包容量…

CentOS7 firewall使用(開放和禁止端口、端口轉發)

安裝 安裝命令 yum install firewalld -y 使用命令 systemctl start firewalld ##開啟防火墻systemctl stop firewalld ##關閉防火墻systemctl status firewalld ##查看防火墻狀態firewall-cmd --reload ##重啟防火墻systemctl enable firewalld ##設置開啟啟動systemctl …

共享內存原理介紹及簡單使用

每當我們執行一個程序時&#xff0c;對于操作系統來講就創建了一個進程,在這個過程中&#xff0c;伴隨著資源的分配和釋放。可以認為進程是一個程序的一次執行過程。進程的內存空間是相互獨立的&#xff0c;一般而言是不能相互訪問的。但很多情況下進程間需要互相通信&#xff…

上海泗博MODBUS轉PROFINET網關TS-180 網關連接LED顯示屏應用案例

項目 常州某鋼鐵公司的軋鋼車間為了更清晰地顯示當天軋鋼系統各環節的工作參數&#xff0c;如軋鋼的日期、鋼種、吐絲機設備運行情況等&#xff0c;引進了另一家為其定制的LED顯示屏。軋鋼系統各環節的設備參數通過西門子S7-1500PLC采集后&#xff0c;實時顯示在LED顯示屏上&am…

飛瓜數據B站丨B站UP主11月第3周榜單排行榜榜單(B站平臺)發布!

飛瓜輕數發布2023年11月13日-11月19日飛瓜數據UP主排行榜&#xff08;B站平臺&#xff09;&#xff0c;通過充電數、漲粉數、成長指數、帶貨數據等維度來體現UP主賬號成長的情況&#xff0c;為用戶提供B站號綜合價值的數據參考&#xff0c;根據UP主成長情況用戶能夠快速找到運營…

Linux網絡——傳輸層

目錄 一.再談端口概念 二.UDP協議 1.UDP協議格式 2.UDP的特點 3.面向數據報 4.UDP的緩沖區 5.UDP使用注意事項 6.UDP協議在內核中的表現形式 7.基于UDP的應用層協議 三.TCP協議 1.TCP協議格式 2.TCP確認應答機制 3.超時重傳機制 4.TCP報文六位標志位 5.滑動窗口 6…

制作抖音查券返利機器人的簡易步驟

制作抖音查券返利機器人的簡易步驟 隨著社交電商的快速發展&#xff0c;越來越多的消費者開始通過優惠券和返利來省錢購物。而抖音作為一款廣受歡迎的短視頻平臺&#xff0c;也為消費者提供了一個全新的購物體驗。本文將結合微賺淘客系統&#xff0c;介紹如何制作一個簡易的抖…