1、數組
數組的特點:
元素數目固定;下標有界。
數組的操作:
按照下標進行讀寫。
2、數組的順序表示和實現
因計算機的內存結構是一維的,因此用一維內存來表示多維數組,就必須按某種次序將數組元素排成一列序列,然后將這個線性序列存放在儲存器中。
通常有兩種順序存儲方式:
(1)行優先順序——將數組元素按行排列
在PASCAL、C語言中,數組就是按行優先順序儲存。
(2)列優先順序——將數組按列向量排列。
在FORTRAN語言中,數組就是按列優先順序儲存的。
3、矩陣的壓縮儲存
利用2維數組描述矩陣
特殊矩陣:
為了節省儲存空間,矩陣進行壓縮存儲:即為多個相同的非零的元素值分配一個儲存空間;對0元素不分配空間。
(1)對稱矩陣
只需對對稱矩陣中n(n+1)/2個元素進行儲存表示
(2)三角矩陣
(3)稀疏矩陣
if 一個m*n的矩陣含有t個非零元素,且t遠遠小於m*n,則稱這個矩陣為稀疏矩陣
利用三元組表示法對稀疏矩陣進行壓縮儲存
用三項內容表示稀疏矩陣中的每個非零元素,進行形式為:(i,j,value)
其中,i 表示行序號,j 表示列序號,value 表示非零元素的值
//稀疏矩陣,非零元素比較少 const int max=1000; template<typename Object> typedef struct { int i, j; Object e; }Triple; template<typename Object> typedef struct { Triple<Object> data[max]; int mu, nu, tu; }TSMatrix;
稀疏矩陣的轉置
轉置前矩陣為M,轉置后為T,M的列為T的行,因此,要按M.data的列序轉置
所得到的轉置矩陣T的三元組表必定按行優先存放
轉置算法:
template<typename Object> void trans( TSMattrix<Object>M, TSMatrix<Object>T) { T,mu=M.nu; T.nu=M.mu; T.tu=M.tu; if(T.tu) { int q=0; for(int col=0; col< M.nu;col++) for(int p=0; p<M.tu; p++) { if(M.data[p].j==col) { T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; q++; } } } }
這個轉置算法的時間復雜度為O(n*t),效率太低了
快速轉置算法
一遍掃描先確定三元組的位置關系,二次掃描由位置關系裝入三元組
為了預先確定矩陣M中的每一列的第一個非零元素在數組B中應有的位置,需要閑球的矩陣M中的每一列中非零元素的個數。
為此,需要設計兩個一位數組num[0...n-1]和cpot[1..n-1]
num[0...n-1]:統計M中每一列非零元素的個數
cpot[0...n-1]:由遞推關系得出M中的每列第一個非零元素在B中的位置
cpot[col]=cpot[col-1]+num[col-1];
template<typename Object> void fasttranstri( TSMatrix<Object> M, TSMatrix<Object>T) { int q; int *num=new int[M.nu]; int *copt=new int[M.nu]; T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; if(M.tu) { for(int col=0; col<M.nu ;col++) num[col]=0; //統計每列非零元素個數 for(int k=0; col<M.tu; k++) ++num[m.data[k].j]; //每列第一個非零元素在T中位置 copt[0]=0; for(int col=1; col <M.nu;col++) copt[col]=copt[col-1]+num[col-1]; for(int p=0; p<M.tu; p++) { int col=M.data[p].j; q=cpot[col]; T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++copt[col]; } } delete[] num; delete[] cpot; }
時間復雜度為O(n+t)
4、廣義表的定義