數據結構總結(字符串與多維數組)

字符串與多維數組雖然有新東西但主要還是之前學過的多,其中主要內容有,字符串存儲,模式匹配,特殊矩陣等。

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), 在一維數組中的下標kij的關係爲

ki×(i-1)/2+j-1

三角中的元素aijij),因爲aijaji則訪問和它對應的元素aji即可,即:

kj×(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中除表頭外其餘元素組成的廣義表(一定是子表或空)

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