字符串和多維數組

 

字符串和多維數組

字符串

字符串支持順序存儲與鏈式存儲:css

模式匹配:
給定主串S="s1s2…sn"和模式T=「t1t2…tm」,在S中尋找T 的過程稱爲模式匹配。若是匹配成功,返回T 在S中的位置,若是匹配失敗,返回-1。算法

模式匹配——BF算法:
在這裏插入圖片描述數組

  1. 在串S和串T中設比較的起始下標i和j;
  2. 循環直到S或T的全部字符均比較完;
    2.1 若是S[i]==T[j],繼續比較S和T的下一個字符;
    2.2 不然,將i和j回溯(i=i-j+1,j=0),準備下一趟比較;
  3. 若是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

  1. 在串S和串T中分別設比較的起始下標i和j;
  2. 循環直到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,準備下一趟比較;
  3. 若是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;}; }; 

稀疏矩陣的十字鏈表表示:
在這裏插入圖片描述

相關文章
相關標籤/搜索