数据结构与算法基础(七):数组&广义表

1.数组的定义

数组:按一定格式排列起来,有相同类型(即每个元素所占的是相同大小的存储空间)的数据元素的集合。

一维数组: 若线性表中的数据元素为非结构的简单元素,则称为一维数组。

一维数组的逻辑结构: 线性结构。定长的线性表。声明格式:数据类型 变量名称[长度];

二维数组:线性结构的拓展:声明格式数据类型 变量名称[行数][列数];

如此拓展:

三维数组: 若二维数组中的元素是一个一维数组,则称作三维数组。

...

n 维数组: 若n-1维数组中的元素又是一个一维数组结构,则称作n维数组。

则线性表结构是数组结构的一个特例;而数组结构又是线性表结构的扩展。

数组的特点结构固定——定义后,维数和维界(每个维的长度)都不会再改变。

2.数组的抽象数据类型定义:

以二维数组为例:

3.数组的顺序存储结构:

数组的特点是结构固定,一般不做插入删除操作,所以数组一般不用链式结构。

一维数组下标为i的元素的位置

二维数组存储:分为行优先/列优先:行优先就是一行一行的存,存完第一行再存第二行;列优先就是一列一列的存,存完第一列再存第二列。则具体的存储方式如下:

则此时会有一个次序约定问题,即如何确定某个元素的位置,以行优先举例:

解决方法为:1.确定行优先还是列优先->2.将行、列分开去计算前面有多少个元素,即可确定位置:

例题:

由此拓展到三维数组->n维数组:

4.特殊矩阵的压缩存储

压缩存储:若多个数据元素的值都相同,则只分配一个元素值的存储空间,且零元素不占存储空间。

一些特殊矩阵可以压缩存储:对称矩阵、对角矩阵、三角矩阵、稀疏矩阵(矩阵中非零元素低于5%)....

  1. 对称矩阵:沿主对角线对称的元素相等:

用一维数组即可存放,确定元素位置时,依然按照行列分开去算位置,其中第i行就是等差数列1到i-1求和,第j列就是前面有j个,最后二者相加即可:

  1. 三角矩阵:对角线以上或以下的元素都是同一个常数(不包括对角线上的):

  1. 对角矩阵:集中在以主对角线为中心的带状区域,如图有三条,则称为三对角矩阵:

用二维数组来存储:

  1. 稀疏矩阵:非零元素非常少(占比小于等于0.05),即超过95%的元素都是0。

1)用三元组来表示元素

压缩存储原则: 存各非零元的值、行列位置和矩阵的行列数

三元组的不同表示方法可决定稀疏矩阵不同的压缩存储方法,例如:

三元组顺序表又称有序的双下标法优点为非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算缺点则为不能随机存取。若按行号存取某一行中的非零元,则需从头开始进行查找。

2)稀疏矩阵的链式存储结构十字链表链式存储即可克服三元组不能随机存取的缺点

十字链表举例

5.广义表

1)定义:

广义表就是线性表的推广,又称做列表 Lists,是n>=0个元素的有限序列,其中每一个 ai或者是原子,或者是一个广义表。

广义表通常记作:LS=(a1a2, ..., an);

LS是表名,n为表的长度,每一个ai为表的元素,习惯用大写字母表示广义表,小写字母表示原子。

表头:广义表当中的第一个元素;

表尾:除了表头后其他所有元素构成的一个子表;

举例

其中E称为共享广义表;F称为递归/嵌套广义表。

2)广义表的性质

(1)有相对次序,都有一个直接前趋和直接后继;

(2)广义表的长度即最外层所包含的元素个数;

(3)广义表的深度即为该广义表展开后所含的括号的重数,原子深度为0,空表深度为1;

(4)广义表可以和其他的广义表共享,如上图中: 广义表B就共享表 A,在B中不必列出A的值,而是通过名称来引用,B= (A);

(5)广义表可以是一个递归的表,如: F=(a, F=(a, (a,(a ...)))。注意: 递归表的深度是无穷值,长度是有限值。

(6)广义表是多层次结构,广义表的元素可以是单元素也可以是子表,而子表的元素还可以是子表,可以用图形象地表示,如图:

广义表和线性表的区别?:

3)广义表的基本运算

(1)求广义表的表头:表头可以是一个原子,也可以是一个子表;

(2)求广义表的表尾:表尾一定是一个子表!

由于每个元素可能是表可能是原子,存储空间大小是不一定相同的,所以广义表通常用链表来存储

6.病毒检测案例的实现:

在主串中查找模式串,即模式串的匹配运算算法:

由于病毒是环状的,因此我们可以设计如图所示的2m串,再从baa开始依次后移进行m次匹配运算:

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值