数据结构(数组)

数组:
1.数组的概念:
数组是下标与值组成的数偶的有限集合。在数组中一旦给定下标,就存在一个与之对应的值,这个值称为数据元素。数组可以看成线性表的推广。
数组一旦被定义,它的维数和维界就不再改变。数组规模是固定的,称之为静态结构。
主要的操作:
1.给定一个数组下标,检索对应的数组元素
2.给定一组下标,存,取或者修改对应数据元素的值
3.检索满足条件的数组元素
4.对数组元素的所有元素按照值的大小进行升序或者降序排序
数组的存储结构:一般情况下采用顺序存储结构。
若一个数组的每个元素占k个存储单元,并且从地址l0开始存储第一个元素,则数组的第i个元素的存储位置LOC(ai)可以确定为:
LOC(ai)=LOC(a1)+(i-1)k=l0+(i-1)k
对于二维数组来说,至少有两种存储方式来存放数组,一种是以行为主序的方式,另一种是以列为主序的方式。
若已知元素a11的存储地址为LOC(a11),并且每个元素占用k个存储单元,则数组第i行第j列的元素的存储位置:
LOC(aij)=LOC(a11)+(i-1)nk+(j-1)k
矩阵的压缩存储:
所谓的压缩矩阵,是指为多个值相同的元素只分配一个存储空间,而对于值为0的元素不分配存储空间。
对称矩阵的压缩存储:
若一个n阶矩阵A的元素满足性质
aij=aji 1<=i,j<=n
则该矩阵称为一个n阶的对称矩阵。在对称矩阵中位于主对角线的元素值都相同。因此只需要对上(下)三角形 部分一共有n
(n+1)/2个元素。
设一维数组LTA[0…n
(n+1)/2-1]作为对称矩阵A的存储结构,那么当A中任意元素aij与LTA[k]之间的关系为:
i
(i-1)/2+j-1 i>=j
K=
j*(j-1)/2+i-1 i<j
对角阵的压缩存储:
对角阵就是指矩阵中的所有非零元素都几种在以对角线为中心的带状区域中,即除了主对角线上和直接在主对角线上,下方对称的若干条对角线上元素之外,其余的元素均为0.
稀疏矩阵的三元组表存储方法:
一般认为,一个较大的矩阵中,值为零的元素的个数相对于整个矩阵元素的总个数所占的比例较大时,就可以称该矩阵为系数矩阵。
1.稀疏矩阵里的转置算法:
一个稀疏矩阵转置后仍然是一个稀疏矩阵。
2.稀疏矩阵的相加算法
3.稀疏矩阵的相乘算法
稀疏矩阵的链表表示:
线性链表的存储方法:
方法之一就是将所有非零元素以行序为主采用循环链表连接起来。链接点的构造由四个域组成:

Row Col Value link
Row,col分别表示某非零元所在的行号和列号;value表示该非零元的值;link域用来指向下一个非零元所在的节点,它是一个指针。
为整个链表设立一个表头
m n t link

m,n分别表示稀疏矩阵总的行数与总的列数;t为稀疏矩阵中非零元素的总个数;link域为指针域,用以指向第一个非零元素对应的链接点。
缺点就是效率低

带行指针向量的链表存储方法:
第二种是带行指针向量的链表结构。在这种链表结构中,将具有相同行数的元素所对应的链接点按照列号从小到大的顺序连接成为一个线性链表,也就是说稀疏矩阵的每一行对应一个线性链表。同时每一行设置一个头节点,头节点中存放该行一个个元素的地址。
十字链表存储方法:
算法思想可以归纳为以下几点:
1.建立max(m,n)个头节点,此时,头节点的right域与value域均指向头节点本身

2.依次输入三元组表的一个三元组(row,col,value),同时申请一个新的节点,分别将row,col与value送入新节点的相应域内,并将新节点分别连接到相应的行链表和列链表
3.当某一行的非零元素全部处理完毕,及时将该链表封成一个循环链表。
4.将所有列链表封装成循环链表
5.创建稀疏矩阵十字链表的一个总头节点,并利用value域将总头节点与各个链表的头节点连城一个循环链表,并设总头节点为HEAD。
数组的应用举例:
1.一元多项式的数组表示
方法1:定义一个一维数组A[0,…n+1].其中a[0]用来存放多项式的An(x)的阶数n;从第二个数组元素A[1]到第n个数组元素A[n+1]依次用来存放An(x)的n+1个系数an,an-1,…a1,a0.也就是说,多项式中各个系数以指数递减顺序进行存储。
方法二:定义一个一维数组A[0,2m]来存储多项式,其中,第一个数组元素A[0]存放多项式中系数非零项的总项数m(设非零 总项数为m);从第二个元素到第2m+1个元素(一共2m个数据元素)依次存放系数非零项的系数与数偶对(一共m个这样的偶对)。
二.n阶魔方
游戏中要求将1~n2个数字不重复的填入一个由n行,n列,共n2个方格组成的方阵中,使得方阵中的每一行,每一列及两对角线的数字之和分别等于同一个数,称这个方阵为一个n阶魔方。这里,设n为任意奇数。
规律如下:先将第一个数“1”填入方阵中第一行位置居中的方格中。若用(i,j)分别表示方阵中(数组中)某一位置的行坐标与列坐标,则第一个数的位置为(0,n/2)。填入一个数字后,将适合下一个数字的位置修改到刚才已经填入的这个数的位置(i,j)的左上角位置(i1,j1)
(i1=i-1,j1=j-1),然后根据下面两种情况做出修改,让后将下一个数填入修改后的位置。
1.若(i1,j1)位置已经填过数字,则修改i1为i1+2,修改j1为j1+1
2.若i1小于0,但是j1不小于零,修改i1为n-1;若j1小于零,但i1不小于0,则修改j1为n-1;若i1与j1同时小于0,则将i1修改为1,j1修改为0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值