字符串與多維數組雖然有新東西但主要還是之前學過的多,其中主要內容有,字符串存儲,模式匹配,特殊矩陣等。
1,字符串
一般的編譯器字符串都是用順序存儲的。
如何表示串的長度?
方案1:用一個變量來表示串的實際長度
方案2:在串尾存儲一個不會在串中出現的特殊字符作爲串的終結符,表示串的結尾。
2,模式匹配
bf算法(樸素模式匹配)
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;
}
kmp算法,時間複雜度O(n+m),用多重循環匹配時間複雜度過高,此算法避免回溯,i不移動,j>=0繼續向後移,從該位置開始與i進行比較。主串:在哪兒失敗在哪開始。子串:從有開始最大滑動距離(記錄在數組k裏)
void Compute_Next(char t[], int next[])
{
int j,k; //倆個while倆個k
next[0]=-1;j=1;
while(t[j]!='\0')
{
k=next[j-1];
while((k!=-1)&&(t[k]!=t[j-1]))
k=next[k];
next[j]=++k;
j++;
}
}
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;
}
3,多維數組(下標問題)
(多維)數組——線性表中的數據元素可以是線性表,但所有元素的類型相同。
廣義表——線性表中的數據元素可以是線性表,且元素的類型可以不相同。
行優先存儲二維數組的一維數組尋址
aij前面的元素個數
=整行數×每行元素個數+本行中aij前面的元素個數
=(i -l1)×(h2 -l2+1)+(j -l2)
列優先存儲二維數組的一維數組尋址
設數組開始存放位置 LOC( 0, 0 ) = a,
每個元素佔用 l 個存儲單元
則a[i][j]的存儲地址:
LOC ( i, j ) = a + ( j *n +i ) * l
4,特殊矩陣
特殊矩陣:矩陣中很多值相同的元素並且它們的分佈有一定的規律。
稀疏矩陣:矩陣中有很多零元素。
壓縮存儲的基本思想是:
⑴ 爲多個值相同的元素只分配一個存儲空間;
⑵ 對零元素不分配存儲空間。
對稱矩陣的壓縮
對於下三角中的元素aij(i≥j), 在一維數組中的下標k與i、j的關係爲:
k=i×(i-1)/2+j-1 。
上三角中的元素aij(i<j),因爲aij=aji,則訪問和它對應的元素aji即可,即:
k=j×(j-1)/2+i -1。
5,廣義表
n廣義表(列表): n ( ³ 0 )個表元素組成的有限序列,記作:
LS = (a0, a1, a2, …, an-1)
LS是表名,ai是表元素,它可以是表 (稱爲子表),可以是數據元素(稱爲原子)。
n爲表的長度。n = 0 的廣義表爲空表。
長度:廣義表LS中的直接元素的個數;
深度:廣義表LS中括號的最大嵌套層數。算括號數量
Ø廣義表的成分可以是單元素,也可以是有結構的表
Ø線性表是一種特殊的廣義表
Ø廣義表不一定是線性表,也不一定是線性結構
表頭:廣義表LS非空時,稱第一個元素爲LS的表頭;
表尾:廣義表LS中除表頭外其餘元素組成的廣義表(一定是子表或空)