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、廣義表的定義



