首頁 後端開發 C#.Net教程 如何實作C#中的KMP演算法

如何實作C#中的KMP演算法

Sep 19, 2023 pm 01:31 PM
字串匹配 c#程式設計 kmp演算法

如何實作C#中的KMP演算法

如何實作C#中的KMP演算法

KMP(Knuth-Morris-Pratt)演算法,是一種高效的字串比對演算法,用於在文字串中尋找模式串的位置。它的核心思想是利用已匹配的部分訊息,避免不必要的比較。

實作KMP演算法的關鍵是建立一個部分匹配表(Partial Match Table),也叫做next陣列。這個陣列記錄了模式字串中每個前綴子字串的最長可匹配後綴子字串的長度。

下面是C#中實作KMP演算法的具體步驟與程式碼範例:

步驟一:建構部分符合表

  1. 定義一個大小為模式串長的整數陣列next,並初始化next[0] = -1。
  2. 定義兩個指標 i 和 j,初始值分別為 0 和 -1。
  3. 判斷i 是否達到模式字串的結尾,若沒有則執行下列步驟:
    a. 若j 等於-1 或目前字元和指標j 對應的字元相等,則i 和j 同時後移,並將next[i] = j。
    b. 否則,將指標 j 移到 next[j] 的位置,繼續進行比對。
  4. 傳回建立好的部分符合表 next。

以下是如何實現上述步驟的程式碼:

private int[] BuildNext(string pattern)
{
    int[] next = new int[pattern.Length];
    next[0] = -1;
    int i = 0, j = -1;
    
    while (i < pattern.Length - 1)
    {
        if (j == -1 || pattern[i] == pattern[j])
        {
            i++;
            j++;
            next[i] = j;
        }
        else
        {
            j = next[j];
        }
    }
    
    return next;
}
登入後複製

步驟二:使用部分匹配表進行匹配

  1. 定義兩個指標i 和j ,分別指向文字串和模式串的起始位置。
  2. 判斷 i 和 j 是否達到結尾,若沒有則執行下列步驟:
    a. 若 j 等於 -1 或目前字元和指標 j 對應的字元相等,則 i 和 j 同時後移。
    b. 否則,將指標 j 移到 next[j] 的位置,繼續進行比對。
  3. 若指標 j 指向模式字串的結尾,表示符合成功,傳回起始位置在文字字串中的索引。
  4. 若符合失敗,則回傳 -1。

以下是如何實現上述步驟的程式碼:

private int KMP(string text, string pattern)
{
    int[] next = BuildNext(pattern);
    int i = 0, j = 0;
    
    while (i < text.Length && j < pattern.Length)
    {
        if (j == -1 || text[i] == pattern[j])
        {
            i++;
            j++;
        }
        else
        {
            j = next[j];
        }
    }
    
    if (j == pattern.Length)
    {
        return i - j;
    }
    
    return -1;
}
登入後複製

透過呼叫 KMP 方法,並傳入文字串和模式串,即可獲得匹配結果。

以上就是如何在C#中實作KMP演算法的步驟和程式碼範例。透過利用部分匹配表,KMP演算法能夠有效地提高字串匹配的效率,特別是在處理大文本串和長模式字串時,具有較好的效能表現。

以上是如何實作C#中的KMP演算法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用C#編寫時間序列預測演算法 如何使用C#編寫時間序列預測演算法 Sep 19, 2023 pm 02:33 PM

如何使用C#編寫時間序列預測演算法時間序列預測是一種透過分析過去的資料來預測未來資料趨勢的方法。它在許多領域,如金融、銷售和天氣預報中有廣泛的應用。在本文中,我們將介紹如何使用C#編寫時間序列預測演算法,並附上具體的程式碼範例。資料準備在進行時間序列預測之前,首先需要準備好資料。一般來說,時間序列資料應該具有足夠的長度,並且是按照時間順序排列的。你可以從資料庫或者

如何使用C#編寫深度學習演算法 如何使用C#編寫深度學習演算法 Sep 19, 2023 am 09:53 AM

如何使用C#編寫深度學習演算法引言:隨著人工智慧的快速發展,深度學習技術在許多領域取得了突破性的成果。為了實現深度學習演算法的編寫和應用,目前最常用的語言是Python。然而,對於喜歡使用C#語言的開發者來說,使用C#編寫深度學習演算法也是可行的。本文將介紹如何使用C#編寫深度學習演算法,並提供具體的程式碼範例。一、創建C#專案在開始編寫深度學習演算法之前,首先需要創建

如何實現C#中的貪心演算法 如何實現C#中的貪心演算法 Sep 19, 2023 am 11:48 AM

如何實作C#中的貪心演算法貪心演算法(Greedyalgorithm)是一種常用的問題解法,它每次選擇目前最優的解決方案,希望能夠獲得全域最優解。在C#中,我們可以利用貪心演算法解決許多實際問題。本文將介紹如何在C#中實作貪心演算法,並提供具體的程式碼範例。一、貪心演算法的基本原理貪心演算法的基本思想是每次都選擇當前最優的解決方案,而不考慮後續步驟可能的影響。這種思

如何使用C#編寫廣度優先搜尋演算法 如何使用C#編寫廣度優先搜尋演算法 Sep 19, 2023 am 11:45 AM

如何使用C#編寫廣度優先搜尋演算法廣度優先搜尋(Breadth-FirstSearch,BFS)是一種常用的圖搜尋演算法,用於在一個圖或樹中按照廣度進行遍歷。在這篇文章中,我們將探討如何使用C#編寫廣度優先搜尋演算法,並提供具體的程式碼範例。演算法原理廣度優先搜尋演算法的基本原理是從演算法的起點開始,逐層擴展搜尋範圍,直到找到目標或遍歷完整個圖。它通常透過隊列來實現。

如何使用C#撰寫霍夫曼編碼演算法 如何使用C#撰寫霍夫曼編碼演算法 Sep 21, 2023 pm 03:14 PM

如何使用C#來寫霍夫曼編碼演算法引言:霍夫曼編碼演算法是一種用於資料壓縮的無損演算法。在資料傳輸或儲存時,透過對頻率較高的字元使用較短的編碼,對頻率較低的字元使用較長的編碼,從而實現對資料進行有效壓縮。本文將介紹如何使用C#編寫霍夫曼編碼演算法,並提供具體的程式碼範例。霍夫曼編碼演算法的基本原理霍夫曼編碼演算法的核心思想是建立一顆霍夫曼樹。首先,透過統計字元出現的頻率,將

如何使用C#編寫聚類分析演算法 如何使用C#編寫聚類分析演算法 Sep 19, 2023 pm 02:40 PM

如何使用C#編寫聚類分析演算法一、概述聚類分析是一種資料分析方法,透過將相似的資料點分組為簇,將不相似的資料點彼此分開。在機器學習和資料探勘領域,聚類分析常用於建構分類器、探索資料的結構以及挖掘隱藏的模式。本文將介紹如何使用C#撰寫聚類分析演算法。我們將使用K-means演算法作為範例演算法,並提供具體的程式碼範例。二、K-means演算法簡介K-means演算法是最常用

如何使用C#編寫快速排序演算法 如何使用C#編寫快速排序演算法 Sep 19, 2023 pm 03:28 PM

如何使用C#編寫快速排序演算法快速排序演算法是一種高效的排序演算法,它的想法是透過分治的想法將陣列分成較小的子問題,然後遞歸地解決這些子問題,最後將它們合併起來得到整個問題的解答。下面我們將詳細介紹如何使用C#編寫一個快速排序演算法,並給出相關的程式碼範例。演算法思路快速排序的想法可以總結為以下三個步驟:選擇一個基準元素,一般選擇數組的第一個元素;將數組中小於基準元素的

如何使用C#編寫最小生成樹演算法 如何使用C#編寫最小生成樹演算法 Sep 19, 2023 pm 01:55 PM

如何使用C#編寫最小生成樹演算法最小生成樹演算法是一種重要的圖論演算法,它用於解決圖的連結性問題。在電腦科學中,最小生成樹是指一個連通圖的生成樹,該生成樹的所有邊的權值總和最小。本文將介紹如何使用C#編寫最小生成樹演算法,並提供具體的程式碼範例。首先,我們需要定義一個圖的資料結構來表示問題。在C#中,可以使用鄰接矩陣來表示圖。鄰接矩陣是一個二維數組,其中每個元素表示

See all articles