關於KMP演算法,哪位大師可以幫助實現它

發布 科技 2024-04-05
7個回答
  1. 匿名使用者2024-02-07

    我已為您將其更改為 C。

    驗證演算法並顯示第乙個位置。

    如下:包括

    #include

    int getsubstr(char * str,char * substr)

    int i,j;

    bool flag;

    for(i=0 ; iflag=true;

    for(j=0; jif(str[i+j]!=substr[j])

    flag=false;

    break;

    if(flag)

    return i;

    return -1;

    int main()

    int getsubstr(char * str,char * substr) ;

    char a[ 20] ;

    char b[ 20 ]

    printf("請輸入源字串:" )

    scanf("%s",&a) ;

    printf("請輸入您要查詢的字串:") ;

    scanf("%s", &b )

    int j =getsubstr(a,b) ;

    if( j != -1 )

    printf("子字串位置從源字串的 %d 位開始。 ", j+1 );

    else printf("未找到匹配的子字串") ;

    return 0;

  2. 匿名使用者2024-02-06

    (1)未改進的模式匹配演算法的時間複雜度為o(n m),但總體上其實際執行時間接近o(n m),因此至今仍在使用。

    2)只有當模式和主字串之間存在許多“部分”匹配時,KMP演算法才會比未改進的模式匹配出現得更快。

    2)KMP演算法最大的特點是指示主字串的指標不需要回溯,在整個匹配過程中只需要從頭到尾掃瞄主字串,這對於處理儲存在外部儲存器中的大檔案非常有效。

  3. 匿名使用者2024-02-05

    要匹配的字串以許多重複的字串為字首,目標字串也包含很多,例如在“abababababababc”中找到“abababc”

  4. 匿名使用者2024-02-04

    KMP 演算法的時間複雜度為 o(n+m),其中 n 是原始字串的長度,m 是字串的長度。

    KMP演算法的核心是NEXT陣列,當某個位置不匹配時,它可以快速找到與子字串字首相同的第乙個位置,並繼續匹配,無需重複不必要的操作,大大降低了時間複雜度。

    我們不提下乙個陣列是如何生成的,但讓我們解釋一下如何使用下乙個陣列。

    例如,如果 abababac 與 ababac 匹配,則假定父字串的下標為 i,子字串下標為 j,字串前導下標為 1

    首先,兩個字串對齊。

    abababac

    ababac

    當匹配到達第六個位置時,發現不匹配。

    傳統演算法將 i 移動到第二位,j 移動到第一位,並繼續匹配。

    即:abababac

    ababac

    另一方面,KMP 演算法將直接固定 J=Next[J],i 的位置。

    在這種情況下,next[6]=4,即將 j 移動到第四個位置。

    即:abababac

    ababac

    此時,比賽將繼續成功。 由於 i 不向前移動,因此時間複雜度為 o(n+m)。

    KMP 匹配 C++**:

    int next[100];

    char str1[100],str2[100];

    void kmp_cmp()

    對於下乙個陣列。

    也就是說,子字串的最後乙個位置及其自己的通用字首。

    這可能有點抽象,但說白了,它是子字串與自身匹配的最長公共字首,該位置為最後一位。

    在計算下乙個陣列的第 i 個位置時,該位置的所有先前的 next 值都已經計算完畢,因此我們可以借助 next[i] 的前乙個值來更新 next[i] 的值。

    所以時間複雜度是 o(2*m)。

    以 ababac 為例:

    第 1 步:ababac

    ababac

    i,j 在開始時不匹配,即 next[2]=0。

    第 2 步:阿巴巴

    ababac

    i,j 匹配位置 3,next[3]=1

    類似:next[4]=2, next[5]=3, next[6]=4

    在 i=6、j=4 處存在不匹配。

    因此,j=next[j]+1,i++,即匹配的字串向後移動。

    即:ababac

    _ababac

    在這種情況下,兩個字串不匹配,next[7]=0

    查詢下乙個陣列 **:

    int next[100];

    char str2[100];

    void get_next()

    elsej=next[j];

    以上就是下面對KMP演算法的理解,如果有什麼不足之處請見諒,如果有什麼不明白的地方,也請提出問題。

  5. 匿名使用者2024-02-03

    嗯,KMP,我想了很久了,這是乙個非常巧妙的演算法! 你看不懂百科全書什麼的,我就用手打......這是我的理解

    為了便於解釋,我將長字串稱為文字字串,將短字串稱為目標字串

    與文字字串相比,傳統的匹配演算法將目標字串逐個向右移動,而 KMP 則向右跳轉

    我舉幾個例子。

    例如,如果有乙個 ababaca 的目標字串,則當前位置與前 5 個匹配,即與 ababa 匹配,後兩個不匹配。

    這說明文字字串的當前位置也是 ababa

    顯然,不可能向右移動乙個位置,因為從目標字串中可以看出括號中的內容不等於 a(baba)。

    並且可以向右移動兩個位置,因為你可以看到括號中的內容等於 ab,這意味著在移動兩個位置後,目標字串的前三個位置肯定是匹配的,因為它們在移動之前也匹配

    例如,如果存在目標字串 abcab,則當前位置與前兩個 abs 匹配

    然後你需要向右移動3個位置,因為括號中的內容與abc(ab)中的內容相同,移動後可以匹配

    明白了? 表達自己的能力有限......我不能說得更好......具體**網上有很多,在《演算法導論》裡也有我當初學的!

    如果你明白了,我希望會有額外的積分,你的手累死了!!

    如果你不明白,就問吧......

  6. 匿名使用者2024-02-02

    KMP演算法和BM演算法,分別是字首匹配和字尾匹配的經典演算法。

    1. 由於路由表中的每個條目都指定了乙個網路,因此乙個目標位址可以匹配多個條目。 最顯式的條目,即具有最長子網掩碼的條目,稱為最長的字首匹配。

    2.之所以這樣稱呼,是因為這個條目也是路由表中與目標位址高位匹配度最高的條目。

  7. 匿名使用者2024-02-01

    那麼,關於它們之間的聯絡,您告訴我們什麼?

相關回答
12個回答2024-04-05

高鐵主要客運主要有:

1、老年人、體弱者、病者、殘疾人、孕婦及年輕旅客; >>>More

11個回答2024-04-05

呵呵。 有很多學校。

但是沒有高鐵專業。 >>>More

1個回答2024-04-05

希望實驗成功!如果你對電子電路有基本的了解,就更容易理解了。這是一款結構和原理最簡單的永動機!這實際上是電流迴轉的原理 就像陀飛輪一樣 產生的交流電,當然是它產生的頻率 電流 電壓!這取決於你繞了多少,無極電容器的容量!你纏繞的扭曲越多,就越容易看到效果!一般繞線可以承受左右的壓力,當然,繞組的體積

8個回答2024-04-05

我個人認為Dota開全效果配置比CF高,Dota在同場景下釋放的魔力效果更多,顯示卡的渲染比CF高,10年前的機器,Dota開全效果,當你衝的時候會覺得卡,CF不會,你說得對嗎。

14個回答2024-04-05

豬肉比魚更有營養,魚含有大量的蛋白質,很容易被人體吸收,以及人體必需的維生素,而且魚的脂肪含量很低,所以魚的營養成分更高。