第四章 字符串和多維數組
1.串
串:零個或多個字符組成的有限序列。
串長度:串中所包含的字符個數。
空串:長度爲0的串,記爲:" "。
子串:串中任意個連續的字符組成的子序列。
主串:包含子串的串。
子串的位置:子串的第一個字符在主串中的序號
2.串的存儲結構
順序串:用數組來存儲串中的字符序列
鏈接串:用鏈接存儲結構來存儲串。
3.模式匹配
給定主串S="s1s2…sn"和模式T=“t1t2…tm”,
在S中尋找T 的過程稱爲模式匹配。
基本思想:
從主串S的第0個字符開始和模式T 的第0個字符進行比較,
若相等,則繼續比較兩者的後續字符;
否則,從主串S的第1個字符開始和模式T 的第0個字符進行比較,
重複上述過程,直到T 中的字符全部比較完畢,則說明本趟匹配成功;或S中字符全部比較完,則說明匹配失敗。
說明:模式匹配過程要進行多趟的匹配,每趟匹配要進行若干次的比較。
4.BF算法
- 在串S和串T中設比較的起始下標i和j;
- 循環直到S或T的所有字符均比較完;
2.1 如果S[i]==T[j],繼續比較S和T的下一個字符;
2.2 否則,將i和j回溯(i=i-j+1,j=0),準備下一趟比較; - 如果T中所有字符均比較完,則匹配成功,返回匹配的起始比較下標(i-j);否則,匹配失敗,返回-1;
代碼:
int BF(char S[ ], char T[ ])
{
i=0; j=0;
while (i<S.Length()&&j<T.length())
{
if (S[i]==T[j]) {
i++; j++;
}
else {
i=i-j+1; j=0;
}
}
if (j>=T.length()) return (i-j);
else return -1;
}
5.KMP算法
結論: i可以不回溯,模式向右滑動到的新比較起點k ,並且k 僅與模式串T有關。
思路:
1.在串S和串T中分別設比較的起始下標i和j; - 循環直到S中所剩字符長度小於T的長度或T中所有字符均比較完畢
2.1 如果S[i]==T[j],繼續比較S和T的下一個字符;否則
2.2 將j向右滑動到next[j]位置,即j=next[j];
2.3 如果j=-1,則將i和j分別加1,準備下一趟比較; - 如果T中所有字符均比較完畢,則返回匹配的起始下標;否則返回-1;
代碼:
int KMP_FindPat(char *s, char *t,int *next){
int i=0,j=0,k;
while(s[i]!=’\0’ && t[j]!=’\0’) {
if(j==-1 || s[i]t[j]) {
i++;
j++;
}
else
j=next[j];
}
if(t[j]’\0’)
return i-j;
else
return -1;
}
6.多維數組 數組是由一組類型相同的數據元素構成的有序集合,每個元素受n(n≥1)個線性關係的約束,並稱該數組爲 n 維數組。
7.數組的特點 元素本身可以具有某種結構,屬於同一數據類型; 數組是一個具有固定格式和數量的數據集合。
8.數組的基本操作 ⑴ 存取:給定一組下標,讀出對應的數組元素; ⑵ 修改:給定一組下標,存儲或修改與其相對應的數組元素。 存取和修改操作本質上只對應一種操作——尋址
9.矩陣的壓縮存儲 特殊矩陣:矩陣中很多值相同的元素並且它們的分佈有一定的規律。 稀疏矩陣:矩陣中有很多零元素。 壓縮存儲的基本思想是: ⑴ 爲多個值相同的元素只分配一個存儲空間; ⑵ 對零元素不分配存儲空間。 對角矩陣:所有非零元素都集中在以主對角線爲中心的帶狀區域中,除了主對角線和它的上下方若干條對角線的元素外,所有其他元素都爲零。 稀疏矩陣的壓縮存儲——三元組順序表
存儲結構定義:
const int MaxTerm=100;
template
struct SparseMatrix
{
T data[MaxTerm]; //存儲非零元素
int mu, nu, tu; //行數,列數,非零元個數
};