日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

浅谈字符串模式匹配

發布時間:2024/8/26 综合教程 24 生活家
生活随笔 收集整理的這篇文章主要介紹了 浅谈字符串模式匹配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0 緒論

字符串模式匹配是計算機科學中最古老、研究最廣泛的問題之一(其實也就幾十年)。字符串匹配問題就是在一個字符串T中搜索某個字符串P的所有出現位置。其中,T稱為文本,P稱為模式,T和P都定義在同一個字母表∑上。簡單來說,就是在一個目標串T中看有沒有子串與另一個較短的字符串相同。

字符串串匹配算法雖然發展了幾十年,然而非常實用的算法是近年才出現。

傳統的串匹配算法可以概括為前綴搜索、后綴搜索、子串搜索。比如以KMP,Shift-And,Shift-Or,BM等子串搜索,以后綴自動機為代表的的后綴搜索等。

近些年則流行以哈希函數為基礎的哈希匹配。

字符串模式匹配的應用包括生物信息學、信息檢索、拼寫檢查、語言翻譯、數據壓縮、網絡入侵檢測等方面。(你見到最多的應用應該是論文查重)

字符串匹配工作一直是IDS研究領域中的熱點之一。在網絡速度迅速發展的今天,基于字符匹配技術的網絡應用存在著性能瓶頸,提高系統的整體性能是研究和設計者的主要工作。字符匹配是其實現網絡入侵檢測的主要技術之一,因此,高效的算法將是提高系統總體性能的手段之一。

這篇博客將簡要介紹BF算法(暴力算法),KMP算法和簡單的hash匹配。

1 BF算法

(1)簡介

字符串的暴力匹配算法也被稱為Brute-Force算法(其實就是“暴力”的英語)簡稱BF算法。

(2)算法描述

采用窮舉的方法,將文本T字符串的第一個字符與模式P字符串的第一個字符比較,若相等則逐個比較后續字符,否則將文本T字符串的第二個字符與模式P字符串的第一個字符比較。

(3)算法分析

假設文本T的字符串長度為n,模式P的字符串長度為m,則BF算法的最好時間復雜度為O(n),最壞時間復雜度為O(n*m),平均時間復雜度O(n*m),空間復雜度為O(n+m)。

(4)算法實現

#include<iostream>
#include<string>
#include<bits/stdc++.h>
using namespace std;
int BF(string t,string p)//返回t與p匹配成功的次數
{
	int num=0; 
	for(int i=0;i<t.length();i++)
	{
		int j;
		for(j=0;j<p.length();j++)
			if(t[i+j]!=p[j])break;
		if(j==p.length())
		{
			num++;
			cout<<"匹配成功位置:"<<i<<endl;
		}
	}
	return num;
}
int main()
{
	string t,p;
	cin>>t>>p;
	cout<<BF(t,p)<<endl;
	return 0;
}

2 KMP算法

(1)簡介

KMP算法是由D.E.Kruth,J.h.Morris和V.R.Pratt共同提出,因此人們稱它為克努特—莫里斯—普拉特操作,簡稱KMP算法。該算法是大多數初學者學習字符串匹配的第一個高效算法,也是非暴力算法中比較好理解的一個。

(2)算法描述

KMP算法定義了一個next數組,通過next數組在發現匹配中途出現匹配失效時減少回溯長度來提高匹配效率。

next數組可以理解為:next[j](假設next[j]=k)表示模式p中p[j-k],p[j-k+1]···p[j-1]與p[0],p[1]···p[k-1]相同。在模式匹配的過程中,當匹配在p[j]失效時,指向p的s指針回退到next[j],而非完全回溯。

KMP還有一種改進算法:由之前的定義可得next[j]=k且p[j]=p[k]時,若t[i]
epp[j]就必有t[i]
epp[k]。此時沒有必要再將t[i]與p[k]比較,可以直接將t[i]與p[next[k]]比較。

(3)算法分析

假設文本T的字符串長度為n,模式P的字符串長度為m,則KMP算法的最好時間復雜度為O(n+m),最壞時間復雜度為O(n*m),平均時間復雜度O(n+m),空間復雜度為O(n+m)。

(4)算法實現

以下為改進的KMP算法的實現:

#include<iostream>
#include<bits/stdc++.h>
#include<string>
using namespace std;
int next[1000];
void get_next(string p)//計算next數組
{
	int len=p.length();
	int j=0,k=-1;
	next[0]=-1;
	while(j<len)
	{
		if(k==-1||p[j]==p[k])
		{
			j++;k++;
			if(p[j]==p[k])next[j]=next[k];
			else next[j]=k;
		}
		else k=next[k];
	}
}
int KMP(string t,string p)//進行正式匹配并返回匹配成功的次數
{
	int tlen=t.length(),plen=p.length();
	int i=0,j=0,num=0;
	while(i<tlen)
	{
		if(j==-1||t[i]==p[j])
		{
			if(j==plen-1)
			{
				num++;
				cout<<":"<<i-j+1<<'
';
				j=next[j];
			}
			else {i++;j++;}
		}
		else j=next[j];
	}
	return num;
}
int main()
{
	string t,p;
	cin>>t>>p;
	get_next(p); 
	int num=KMP(t,p);
	cout<<num<<endl;
	return 0;
}

3 hash算法

(1)簡介

hash匹配算法是將hash算法運用到字符串匹配中的一個例子,并被廣泛運用。hash匹配算法本生就具有多種,在此僅介紹簡單的hash匹配算法。

(2)算法描述

普通hash匹配即每次截取模式串長度的字串計算hash值,然后原模式串的hash值進行比較,兩者相同則認為匹配成功。
hash值的一個簡單計算方法為

[hash(string)=(sum_{i=1}^nk*d^{i-1})mod(p)
]

其中n表示字符串的長度,k表示字符串的第i個字符在字符集中的序號,d表示hash基數一般取大質數(大于字符集的寬度),p表示模運算底數,一般取232或者264。

滾動hash匹配是普通hash匹配的優化版,優化之處在于不再頻繁計算原串子串的hash值,而是通過前一個子串的hash值得到后一個子串的hash值。

(3)算法分析

假設文本T的字符串長度為n,模式P的字符串長度為m,則普通hash算法的最好時間復雜度為O(nm),最壞時間復雜度為O(nm),平均時間復雜度O(n^m),空間復雜度為O(n+m)。滾動hash算法的最好時間復雜度為O(n+m),最壞時間復雜度為O(n+m),平均時間復雜度O(n+m),空間復雜度為O(n+m)。

(4)算法實現

以下為滾動hash算法的實現

#include<iostream>
#include<string>
using namespace std;
const unsigned int size=233;
int hash(string t,string p)//進行hash匹配
{
	int num=0;
	int tlen=t.length(),plen=p.length();
	unsigned int k=1,temph=0,ph=0;
	for(int i=0;i<plen;i++)
	{
		ph=ph*size+p[i]; 
		temph=temph*size+t[i];
	}
	for(int i=1;i<plen;i++)k*=size;
	if(ph==temph)
	{
		num++;
		cout<<"1
";
	}
	for(int i=plen;i<tlen;i++)
	{
		temph-=k*t[i-plen];
		temph=temph*size+t[i];//滾動計算hash值
		if(temph==ph)
		{
			num++;
			cout<<i-plen+2<<'
';
		}
	}
	return num;
}
int main()
{
	string t,p;
	cin>>t>>p;
	int num=hash(t,p);
	cout<<num<<endl;
	return 0;
}

4 總結

本文簡要介紹了面向初學者的關于字符串匹配的基礎知識,希望讀者能有所收獲。

總結

以上是生活随笔為你收集整理的浅谈字符串模式匹配的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品麻豆入口 | 护士的小嫩嫩好紧好爽 | 午夜草逼| 黄色片毛片| 四川话毛片少妇免费看 | 在线视频欧美日韩 | av免费网站在线观看 | 日韩精品一区二区三区在线观看 | 老女人网站 | 久久精品国产99国产 | 国产一区二区视频免费在线观看 | 欧美激情videos | 欧美三日本三级少妇99 | 国产又粗又猛又爽又黄又 | 一区二区三区亚洲精品 | 久久男人 | 97人人草| 国产情侣在线播放 | 亚洲一区二区在线电影 | 中国免费看的片 | 国产草草 | xxxx黄色| а天堂中文在线官网 | 国产啪视频 | 老熟妻内射精品一区 | 91精产品一区观看 | 亚色视频在线 | 亚洲一线二线在线观看 | 九七伦理电影 | 麻豆视频免费网站 | 超碰福利在线观看 | 欧美午夜精品久久久久免费视 | 日本免费黄网站 | 美女狠狠干 | 123成人网 | 亚洲精品久久久久 | 欧美激情三级 | 人妻丰满熟妇无码区免费 | 女人被灌满精子 | 精品盗摄一区二区三区 | 日本大乳奶做爰 | 国产精品免费一区二区区 | 日本一区二区三区欧美 | 久草黄色 | 天天干天天操 | 亚洲黄色片子 | 三叶草欧洲码在线 | 天天插伊人| 亚洲精品资源在线 | 日韩系列在线 | 成人欧美一区二区三区 | 天堂а√在线最新版中文在线 | 钰慧的mv视频在线观看 | 黄色成人小视频 | 亚洲无人禁区 | 四虎黄色网 | 成年网站在线播放 | 香蕉视频免费在线看 | 久久一区欧美 | 中文字幕一区二区三区四区 | 激情网av | 免费高清成人 | 丰满岳跪趴高撅肥臀尤物在线观看 | 精品一区二区三区无码视频 | 午夜激情福利 | 亚洲男人av| 欧美人狂配大交3d | 一区二区在线观看免费 | 玩偶姐姐在线观看免费 | 狠狠操在线播放 | 冲田杏梨一区二区三区 | 无码精品一区二区免费 | 日本在线视频一区 | 日韩高清二区 | 五月天丁香社区 | 九九热九九爱 | 日本打白嫩屁股视频 | 黄色激情四射 | 亚洲精品视频中文字幕 | 99国产精品国产免费观看 | 国产免费网址 | 午夜精品网站 | 国产99久久久欧美黑人 | 蜜桃久久精品 | 日av一区| 亚洲av第一成肉网 | 日韩视频一二三区 | 国产激情图片 | 波多在线观看 | 台湾男男gay做爽爽的视频 | 久久亚洲高清 | 亚洲高清视频一区二区 | 97视频一区二区三区 | 天天综合网站 | 日本阿v视频在线观看 | 成人三级在线看 | 在线一区观看 | 深夜福利91 | 午夜久久剧场 |