第五章 数组 和 广义表

数组广义表可以看成是线性表在下述含义上的扩展:表中的数据元素本身也是一个数据结构。

5.1 数组的定义

n维数组中每个元素都受着n个关系的约束,每个元素都有一个直接后继元素。

可以把二维数组看成是这样一个定长线性表:它的每个数据元素也是一个定长线性表。

数组一旦定义,它的维数和维界就不再改变。因此,除了结构的初始化销毁之外,数组只能有存取元素修改元素值的操作。

5.2 数组的顺序表示和实现

次序约定:

1、列序为主序 column major order  FORTRAN

2、行序为主序 row major order     C

假设每个数据元素占L个存储单元,则二维数组A中的任一元素aij的存储位置可由下式确定:

LOC(i,j) = LOC(0,0) + (b2 * i + j)*L

LOC(i,j)是存储位置  LOC(0,0)称为基地址或基址

n维数组定位公式

Array[b1][b2]...[bn]

LOC(j1,j2,...,jn) = LOC(0,0,...,0) + (jn +jn-1*bn+jn-2*bn-1*bn + ... +j2*b3*...*bn +j1*b2*...*bn)*L

数组元素的存储位置是其下标的线性函数。

由于计算各个元素存储位置的时间相等,所以存取数组中任一元素的时间也相等,称具有这一特点的存储结构为随机存储结构。

5.3 矩阵的压缩

如何存储矩阵的元,使矩阵的各种运算能有效的进行。

二维数组可以存储矩阵的元。

有的程序设计语言中还提供了各种矩阵运算。

压缩存储:为多个值相同的元只分配一个存储空间;对零元不分配空间。

应用压缩的两种情况:

1、特殊矩阵:值相同的元素或者零元素在矩阵中的分布有一定规律;

2、稀疏矩阵

对称矩阵:aij= aji  1 <= i,j <= n 称为n阶对称矩阵

可以为每一对对称元分配一个存储空间,即将n2个元压缩存储到n(n+1)/2个元空间中

以行序为主序,存储其下三角。

以一维数组sa[n(n+1)/2]作为n阶对称矩阵A的存储结构,则sa[k]和矩阵元aij之间存在一一对应的关系:

K =

i(i - 1)/2 - 1 + j  当i>=j

j(j - 1)/2 - 1 + i  当i < j  //下标谁大谁除2,一维大是下三角内容,二维大是上三角内容

以上存法同样适用于三角矩阵。

三角矩阵:上/下三角中的元均为常数c或0的n阶矩阵(不含对角线)。

除了和对称矩阵一样,只存储其上/下三角中的元之外,再加一个存储常数c的存储空间即可。

对角矩阵:所有非零元集中在以主对角线为中心的带状区域中。即除了主对角线上和直接在对角线上、下方若干条对角线上的元之外,所有其他的元皆为零。

以上特殊矩阵,非零元的分布都有一个明显的规律,从而可以将其压缩存储到一维数组中,并找到每个非零元在一维数组中的对应关系。

稀疏矩阵:非零元较零元少,而且分布没有一定规律。

稀疏因子:矩阵中非零元个数与全部个数之比。

通常认为稀疏因子小于等于0.05时称为稀疏矩阵。

按照压缩存储的概念,只存储稀疏矩阵的非零元。

稀疏矩阵可由表示非零元的三元组 及其行列数唯一确定。

三种数据结构:三元组顺序表、行逻辑链接的顺序表、十字链表

1、三元组顺序表:以行序为主序顺序排列。

转置算法:

1、将矩阵的行列值相互交换;

2、将每个三元组中的i和j相互调换;

3、重排三元组之间的次序;

方法一:找到原矩阵的列序来进行转置。为了找到M的每一列中所有的非零元素,需要对其三元组表从第一行起整个扫描一遍。O(列数*非零元数)

方法二:先求出原矩阵每一列中非零元的个数,进而求得每一列第一个非零元在转置矩阵中应有的位置。 O(列数+ 非零元数)

三元组顺序表,又称为有序的双下标法。

特点:非零元在表中按行序有序存储,便于进行依行顺序处理的矩阵运算。

若需按行号存取某一行的非零元,则需从头开始进行查找。

2、行逻辑链接的顺序表

在三元组顺序表的基础上,加入指示各行第一个非零元的顺序表。

3、十字链表

可以按任意顺序输入非零元素。

链式存储结构,每个非零元用一个含5个域的结点表示,其中i、j、e分别表示该非零元所在的行、列和非零元的值,向右域right链接同一行中下一个非零元,向下域down链接同一列中下一个非零元。

同一行的非零元通过right域链接成一个线性链表,

同一列的非零元通过down域链接成一个线性链表,

每个非零元即是某个行链表中的一个结点,又是某个列链表中的一个结点整个矩阵构成一个十字交叉的链表。

用两个分别存储行链表的头指针和列链表的头指针的一维数组表示十字链表。

矩阵加法:4种情况:

(1)aij+ bij

(2)aij  插入元素

(3)bij   插入元素

(4)aij+ bij = 0 删除元素

从一个结点看,进行比较、修改指针所需的时间是一个常数;

整个运算过程是对A和B的十字链表逐行扫描,其循环次数主要取决于A和B矩阵中非零元素的个数ta和tb,由此算法时间复杂度为O(ta + tb)。

5.4广义表

广义表是线性表的推广,列表 lists

广泛地用于人工智能等领域的表处理语言LISP语言,把广义表作为基本的数据结构,就连程序也表示为一系列的广义表。

广义表一般记作

LS = (a1,a2,...,an )

LS是广义表的名称,n是它的长度。

广义表中的元素可以是单个元素,也可以是广义表,分别称为广义表的原子子表

广义表的定义是一个递归的定义。

当广义表非空时,称第一个元素为LS的表头(Head),其余元素组成的表是LS的表尾(Tail)

任何非空列表其表头可能是原子,也可能是列表,但其表尾必定为列表。

5.5 广义表的存储结构

由于广义表的数据元素可以是原子,也可以是列表,因此难以用顺序存储结构表示,通常采用链式存储结构,每个数据元素可用一个结点表示。

需要两种结构的结点:

一种是表结点,用以表示列表;

标志域 + 表头指针域 + 表尾指针域

一种是原子结点,用以表示结点。

标志域 + 值域

两种方式:

enum ElemTag {ATOM,LIST};
typedef struct GLNode
{elemTag tag;union{AtomType atom;struct{GLNode *hp, *tp;}ptr;};
}*GList;

enum ElemTag {ATOM,LIST};
typedef struct GLNode1
{elemTag tag;union{AtomType atom;GLNode1 *hp;};GLNode1 *tp;
}*GList;

第一种结构:一个列表由表头和表尾组成,表头是一个表,表尾是另一个表。

第一种结构不直观,建议采用第二种结构!

第二种结构:一个列表由表头和表尾组成,表头是原子或列表,表尾是原子或列表。

5.7 广义表的递归算法

在对问题进行分解、求解过程中得到的是和原问题性质相同的子问题。

分治法(Divide and Conquer)进行递归算法的设计。

递归定义由基本项归纳项两部分组成。

基本项:描述一个或几个递归过程的终结状态。

归纳项:描述了如何实现从当前状态到终结状态的变化。

在设计递归函数时

(1)首先应书写函数的首部和规格说明,严格定义函数的功能和接口;

(2)对函数中的每一个递归调用都看成是一个简单的操作,只要接口一致,必能实现规格说明中定义的功能,切忌想的太深太远。

数据结构05数组和广义表相关推荐

  1. 数据结构:数组和广义表

    数组 数组这部分内容在写<线性表>的的时候介绍过,所以这里就略过一部分内容(略过的内容在这里),写一写前边没写过的. 由于数组中各元素具有统一的类型,并且数组元素的下标一般具有固定的上界和 ...

  2. 数据结构之数组与广义表

    目录 联系 数组 广义表 联系 数组和广义表可看作一种扩展的线性数据结构,其特殊性在于数据元素的构成上.从组成线性表的元素角度看,数组是由具有某种结构的数据元素构成,广义表则是由单个元素或子表构成的. ...

  3. C语言数据结构学习——数组和广义表

    数组和广义表 数组 数组定义 特点 常见运算及声明方式 数组的顺序表示和实现 矩阵的压缩存储 概念 稀疏矩阵 对称矩阵 三角矩阵 广义表 数组 数组定义 数组(Array)是有序的元素序列.若将有限个 ...

  4. 六、考研数据结构笔记——数组与广义表

    一.数组的定义 一维数组:就是线性表,前面有 二维数组:准备考研的应该都知道,就是一个矩阵. 数组一旦被定义其,维数(行)和维界(列)就不能改变.只会读取加修改元素. 二.二维数组的按行(列)优先 事 ...

  5. 【数据结构】数组和广义表

    感觉数组这一段没讲什么太多的东西. 先是讲了下定义,就是每个维度上都有对应的前驱后继,首尾元素例外.操作只有初始化 销毁 取元素 修改元素.然后讲了下适合用顺序存储结构,多维情况下根据下标(j1 j2 ...

  6. 数组和广义表 - [数据结构]

    2005-09-07 数组和广义表 - [数据结构] 第五章 数组和广义表 --非线性数据结构 5.1 数组的定义和运算 ☆二维数组的逻辑结构形式定义为: 2_Array=( D, R ) 其中 D= ...

  7. 【数据结构Note4】-串、数组和广义表(kmp算法详解)

    文章目录 串.数组和广义表 1. 串 1.1 串的概念和结构 1.2 顺序串和链串 1.3 BF算法--串的模式匹配法之一 1.5 KMP算法--串的模式匹配法之一 1.5.1 next数组 1.5. ...

  8. Java数据结构和算法:字符串、数组和广义表

    数组和广义表是与前述的线性表有所区别的数据结构.它们可以看成是线性表在下述含义上的扩展:线性表中的元素本身也是一个数据结构 字符串 字符串的定义.存储结构 字符串(string)是由n (n≥0) 个 ...

  9. 数据结构----数组与广义表专题

    数组与广义表专题 数组的顺序表示和实现 前言 数组中任意一个元素存储地址的计算 一维数组 二维数组 更一般的二维数组 矩阵的压缩存储 前言 对称矩阵 三角矩阵 前言 上三角对应关系 下三角关系 三对角 ...

最新文章

  1. mysql show tables_mysql — show tables的结果不一定准确 | 学步园
  2. javaweb学习总结(十八)——JSP属性范围
  3. bootbox显示中文的按钮
  4. plupload+artdialog实现多平台文件上传
  5. 错误代码中文查询GetLastError返回代码的含义
  6. 如何使用 jMeter CSV Data Set config
  7. Java的系统Property
  8. 【面试必备】java写spark好不好
  9. qlistview 自定义控件_是否可以在QListView中添加自定义窗口小部件?
  10. 带你走进EJB--MDB
  11. matlab中text 函数在显示字符串时的使用方法
  12. 昆仑固件系统u盘引导_系统 | 把 Grub 安装到 U 盘上 / 重建 Grub 引导
  13. 您有一封阿里云自动化运维沙龙邀请函待查收
  14. 关于“无法从传输连接中读取数据: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”错误的解决方法之一
  15. OpenDDS典型idl举例(系统)
  16. 瑞利分布与瑞利衰落信道
  17. 4.2 NI-USRP驱动安装与检测
  18. 软考-架构师知识总结
  19. 产品经理的工作及职责
  20. Windows下进行域名映射并配置Nginx反向代理

热门文章

  1. 微机原理——扩展存储器设计
  2. flush python_带有示例的Python File flush()方法
  3. oracle 查询不能重复,oracle – 如何防止在选择查询中选择重复行?
  4. 分布式是写出来的(四)
  5. 27. 移除元素 golang
  6. node.js将buffer对象转换为json对象
  7. Prime Distance On Tree-树分治+FFT
  8. Linux探秘之用户态与内核态
  9. Linux网络编程——tcp并发服务器(多进程)
  10. exec函数族实例解析