数组和广义表

Posted KennyRom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组和广义表相关的知识,希望对你有一定的参考价值。

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、广义表的定义

 

以上是关于数组和广义表的主要内容,如果未能解决你的问题,请参考以下文章

程序员“修炼成神”的必经之路——数据结构(第4章 多维数组和广义表)

第四章_串数组和广义表_学习小结

5-5-广义表(头尾链表存储表示)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

第五章:1.数组和广义表 -- 数组

5-6-广义表(扩展线性链表存储表示)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

数据结构与算法学习笔记 串,数组和广义表