串(串的模式匹配算法BF算法)

串的定義

串的邏輯結構和線性表極爲相似,區別僅在於串的數據對象約束爲字符集。然而,串的基本操作和線性表有很大差別。在線性表的基本操作中,大多以單個元素作爲操作對象,列入,在線性表中查找某個元素,求取某個元素,在某個位置上插入一個元素或刪除一個元素等;而在串的基本操作中,通常以串的整體作爲操作對象,例如,在串中查找某個子串,求取一個子串,在串的某個位置上插入一個子串,以及刪除一個子串等。

串的存儲結構

串的順序存儲

第一種

//-----串的定長順序存儲結構-----
#define MAXLEN 255  //串的最大長度
typedef struct{
	char ch[MAXLEN+1];		//存儲串的一維數組
	int length;			//串的當前長度 
}SString; 

這種定義方式是靜態的,在編譯時就確定也串空間的大小。

第二種


//------串的堆式存儲結構------ 
typedef struct{
	char *ch;	        //若是非空串,則按串長分配存儲區,否則ch爲NULL
	int length;		   //串的當前長度 
}HString;

這種方式是動態的,能夠根據實際情況動態地分配和釋放數組空間。

串的鏈式存儲結構

//------串的鏈式存儲結構------
#define CHUNKSIZE 80		//可由用戶定義的塊大小
typedef struct Chunk{
	char ch[CHUNKSIZE];
	struct Chunk *next;
}Chunk;
typedef struct{
	Chunk *head,*tail;	 //串的頭尾指針
	int length;		    //串的當前長度 
}LString; 

串值得鏈式存儲結構對某些串操作,如鏈接操作等,有一定的方便之處,但總的說來,不如順序存儲結構靈活,它佔用存儲量大且操作複雜。此外,串值再鏈式存儲結構時,串操作的實現和線性表在鏈表存儲結構中的操作類似。

串的模式匹配算法——BF算法

子串定位運算通常稱爲串的模式匹配或串匹配。此運算的應用非常廣泛,比如在搜索引擎、拼寫檢查、語言翻譯、數據壓縮等應用中,都需要進行串匹配。串的模式匹配設有兩個字符串S和T,S爲主串也成爲正文串,T爲子串也叫作模式,在主串S中查找與模式T相匹配的子串,如果匹配成功,確定相匹配的子串中的第一個字符出現在S串中的位置。
最簡單直觀的模式匹配算法是BF(Brute-Force)算法。
匹配步驟圖如下:
在這裏插入圖片描述
算法描述

int Index_BF(SString S,SString T,int pos){
	int i=pos,j=1;//初始化,pos爲主串中開始搜索的位置,一般爲1 
	while(i<=S.length&&j<=L.length){ //條件爲兩個串都未比較到串尾 
		if(S.ch[i]==T.ch[j]){  
			i++;j++;      //元素相同繼續比較下一個
		}
		else{
			i=i-j+2;j=1    //指針回溯 
		}
		if(j>T.length) return i-T.length;  //匹配成功 
		else return 0;                     //匹配失敗    
	}
}

參考自《數據結構》嚴蔚敏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章