字符串和多維數組
字符串
字符串支持順序存儲與鏈式存儲:css
模式匹配:
給定主串S="s1s2…sn"和模式T=「t1t2…tm」,在S中尋找T 的過程稱爲模式匹配。若是匹配成功,返回T 在S中的位置,若是匹配失敗,返回-1。算法
模式匹配——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; }
模式匹配——KMP算法 :
i能夠不回溯,模式向右滑動到的新比較起點k ,而且k 僅與模式串T有關!
KMP:post
- 在串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; }
時間複雜性:O(n+m)ui
多維數組
線性表——具備相同類型的數據元素的有限序列,將元素的類型進行擴充:spa
(多維)數組——線性表中的數據元素能夠是線性表,但全部元素的類型相同。
廣義表——線性表中的數據元素能夠是線性表,且元素的類型能夠不相同。code
數組的基本操做:
存取和修改操做本質上只對應一種操做——尋址,數組沒有插入和刪除操做,因此,不用預留空間,適合採用順序存儲。blog
所以二維數組的結構在內存上的映射爲連續的一維結構:
經常使用的映射方法有兩種:(取決於編譯器):
按行優先:先行後列,先存儲行號較小的元素,行號相同者先存儲列號較小的元素。
按列優先:先列後行,先存儲列號較小的元素,列號相同者先存儲行號較小的元素。(如高級語言中的FORTRAN語言)token
矩陣的壓縮存儲:
特殊矩陣和稀疏矩陣:
特殊矩陣:矩陣中不少值相同的元素而且它們的分佈有必定的規律。
稀疏矩陣:矩陣中有不少零元素。
壓縮存儲的基本思想是:
1.爲多個值相同的元素只分配一個存儲空間;
2.對零元素不分配存儲空間。圖片
特殊矩陣:
對稱矩陣
對稱矩陣特色:aij=aji
利用下三角矩陣存儲:
aij在一維數組中的序號
= i×(i-1)/2+ j
∵一維數組下標從0開始
∴aij在一維數組中的下標
k= i×(i-1)/2+ j-1
訪問壓縮矩陣:
對於下三角中的元素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。
對角矩陣 (帶狀矩陣):
對角矩陣:全部非零元素都集中在以主對角線爲中心的帶狀區域中,除了主對角線和它的上下方若干條對角線的元素外,全部其餘元素都爲零。例:A
先將A轉換爲B類型進行矩陣壓縮.
bts=aij
t=i-1
s=j-i+1
若是咱們考慮再對二維數組進行一維數組的轉化,用一個一維的數組存儲對角線上的非零元素:
以行序爲主序,aij在一維數組中的地址k:
k=(3(i-1)-1)+(j-i+1)
k=2i+j-3*
稀疏矩陣的壓縮存儲:
注意:稀疏矩陣中的非零元素的分佈沒有規律。
將稀疏矩陣中的每一個非零元素表示爲:(行號,列號,非零元素值)——三元組.
定義三元組:
template <class T> struct element { int row, col; //行號,列號 T item //非零元素值 };
**三元組表:**將稀疏矩陣的非零元素對應的三元組所構成的集合,按行優先的順序排列成一個線性表。
三元組表:( (0,0,15), (1,1,11), (2,3,6), (4,0,9) )
採用順序存儲結構存儲三元組表:
struct SparseMatrix { T data[MaxTerm]; //存儲非零元素 int mu, nu, tu; //行數,列數,非零元個數 };
十字鏈表:
採用連接存儲結構存儲三元組表,每一個非零元素對應的三元組存儲爲一個鏈表結點,結構爲:
template<class T> class OLNode { public: int row,col; T element; OLNode<T>* right,*down; public: OLNode(){right=NULL;down=NULL;}; };
稀疏矩陣的十字鏈表表示: