數組和廣義表


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM