欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門教程網(wǎng)!

C語(yǔ)言

當(dāng)前位置:主頁(yè) > 軟件編程 > C語(yǔ)言 >

深入串的模式匹配算法(普通算法和KMP算法)的詳解

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語(yǔ)言|點(diǎn)擊: 次

串的定位操作通常稱作串的模式匹配,是各種處理系統(tǒng)中的最重要操作之一。
模式匹配最樸素的算法是回溯法,即模式串跟主串一個(gè)字符一個(gè)字符的匹配,當(dāng)模式串中跟主串不匹配時(shí),主串回溯到與模式串匹配開始的下一個(gè)位置,模式串回溯到第一個(gè)位置,繼續(xù)匹配。算法的時(shí)間復(fù)雜度為O(m*n),算法如下:

復(fù)制代碼 代碼如下:

//樸素的串的模式匹配算法,S為主串,T為模式串,即找S中有沒有與T相同的字串
int Index(char *S, char *T, int pos)//pos記錄從哪一位開始匹配可以直接用0代替
{
 int i=pos, j=0;
 while(i <strlen(S) && j <strlen(T))//確保未超出字符串的長(zhǎng)度
 {
  if (S[i] == T[j])
      { ++i; ++j;} //如果相同,則繼續(xù)向后比較
  else
      {i = i-j+1; j =0;} //如果不同,就回溯,重新查找
 }
 if (j == strlen(T))
  return i-strlen(T); //若匹配成功,返回S中與T字符串相同開始位置的索引
 else return 0; //若匹配不成功,返回0
}

O(m*n)的時(shí)間復(fù)雜度有點(diǎn)大,于是人們發(fā)現(xiàn)了KMP算法,核心思想是:當(dāng)不匹配發(fā)生時(shí),主串不回溯,模式串回溯到“合適”的位置,哪個(gè)位置合適,只與模式串有關(guān),所以可以先算出模式串中各個(gè)字符,當(dāng)不匹配發(fā)生是,應(yīng)該回溯到哪個(gè)位置。算法整體時(shí)間復(fù)雜度O(m+m)。
算法如下:
復(fù)制代碼 代碼如下:

void GetNext(char* T, int *next)
{
 int i=1,j=0;
 next[1]=0;
 while( i < strlen(T) )
 {
  if (j == 0 || T[i] == T[j])
  {
    ++i; ++j;
    next[i] = j;
  }
  else j = next[j];
 }
}
int KMP(char* S, char* T, int pos)
{
 int i = pos, j = 1;
 while (i)
 {
  if (S[i] == T[j])
  {
   ++ i;  ++ j;
  }
  else
   j = next[j];
 }
 if (j > strlen(T))
  return i-T[0];
 else
  return 0;
}

求next的操作不是最優(yōu)的,因?yàn)樗麤]有考慮aaaaaaaaaaaaaaaaaaab的情況,這樣前面會(huì)出現(xiàn)大量的1,這樣的算法復(fù)雜度已經(jīng)和最初的樸素算法沒有區(qū)別了。所以稍微改動(dòng)一下:
復(fù)制代碼 代碼如下:

void GetNextEx(char *T, int *next)
{
 int i=1,j=0; next[1] = 0;
 while(i < strlen(T))
 {
  if (j == 0 || T[i] == T[j])
  {
   ++i; ++j;
   if (T[i] == T[j])
    next[i] = next[j];  //減少回退次數(shù)
   else   next[i] = j;  //和上面算法一樣next[i]=j
  }
  else j = next[j];
 }
}

上一篇:如何求連續(xù)幾個(gè)數(shù)之和的最大值

欄    目:C語(yǔ)言

下一篇:C++輸入輸出操作符重載的深入分析

本文標(biāo)題:深入串的模式匹配算法(普通算法和KMP算法)的詳解

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4412.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有