在程序设计语言中大都提供了数组作为构造数据类型,本章重点讨论数组以及特殊矩阵的存储与寻址。

目录

数组

数组的定义

数组的特点

数组的基本操作

数组的存储结构与寻址

一维数组

二维数组

按行优先存储的寻址

矩阵的压缩存储

特殊矩阵和稀疏矩阵

压缩存储的基本思想

对称矩阵

三角矩阵

下三角矩阵:

上三角矩阵:

对角矩阵

稀疏矩阵

转置操作:

十字链表

本章总结


数组

数组的定义

数组是由一组类型相同的数据元素构成的有序集合,每个数据元素称为一个数组元素(简称为元素),每个元素受n(n≥1)个线性关系的约束,每个元素在n个线性关系中的序号i1、i2、…、in称为该元素的下标,并称该数组为 n 维数组。

如上图表示的二维数组中,元素a22受两个线性关系的约束,在行上有一个行前驱a21和一个行后继a23,在列上有一个列前驱a12和和一个列后继a32。

数组的特点

  • 元素本身可以具有某种结构,属于同一数据类型;
  • 数组是一个具有固定格式和数量的数据集合。

数组的基本操作

  • 读操作:给定一组下标,读出对应的数组元素;
  • 写操作:给定一组下标,存储或修改与其相对应的数组元素。

读操作和写操作本质上只对应一种操作——寻址

在数组上一般不能做插入和删除元素的操作,所以不用预留空间,适合采用顺序存储。

数组的存储结构与寻址

一维数组

设一维数组的下标的范围为闭区间[lh],每个数组元素占用 c 个存储单元,则其任一元素 ai 的存储地址可由下式确定:

Loc(ai)=Loc(al)+(ilc

二维数组

常用的映射方法有两种:

  • 优先:先行后列,先存储行号较小的元素,行号相同者先存储列号较小的元素。
  • 优先:先列后行,先存储列号较小的元素,列号相同者先存储行号较小的元素。

按行优先存储的寻址

aij前面的元素个数=阴影部分的面积=整行数×每行元素个数+本行中aij前面的元素个数

=(i -l1)×(h2 -l2+1)+(j -l2)

矩阵的压缩存储

特殊矩阵和稀疏矩阵

 特殊矩阵:矩阵中很多值相同的元素并且它们的分布有一定的规律:对称矩阵、三角矩阵、对角矩阵

 稀疏矩阵:矩阵中有很多零元素。

 压缩存储的基本思想

  ⑴ 为多个值相同的元素只分配一个存储空间;

  ⑵ 对元素不分配存储空间。

对称矩阵

压缩存储:存储下三角部分的元素。由于下三角中共有n×(n+1)/2个元素,可将这些元素按行存储到一个数组SA[n×(n+1)/2]中。

aij在一维数组中的序号=阴影部分的面积=[(i-1)(i-1)+(i-1)]/2 + j  =  i×(i-1)/2+ j

一维数组下标从0开始  aij在一维数组中的下标  k= i×(i-1)/2+ j-1

对于下三角中的元素aijij,在数组SA中的下标kij的关系为:ki×(i-1)/2+j -1

上三角中的元素aijij),因为aijaji则访问和它对应的元素aji即可,即:kj×(j-1)/2+i -1

三角矩阵

压缩存储:只存储上三角(或下三角)部分的元素。

下三角矩阵:

矩阵中任一元素aij在数组中的下标kij的对应关系:

上三角矩阵:

矩阵中任一元素aij在数组中的下标kij的对应关系:

对角矩阵

所有非零元素都集中在以主对角线为中心的带状区域中,除了主对角线和它的上下方若干条对角线的元素外,所有其他元素都为零。

 寻址计算方法:

元素aij在一维数组中的序号 =2 + 3(i-2)+( ji + 2) =2i+ j -2         

一维数组下标从0开始    ∴元素aij在一维数组中的下标   k = 2i+ j -3

稀疏矩阵

由于稀疏矩阵中的非零元素的分布没有规律,因此将稀疏矩阵中的每个非零元素表示为(行号,列号,非零元素值)——三元组

三元组表:将稀疏矩阵的非零元素对应的三元组所构成的集合,按行优先的顺序排列成一个线性表。

转置操作:

 算法1:直接取,顺序存(时间复杂度较高)

A的三元组顺序表中依次找第0列、第1列、…直到最后一列的三元组,并将找到的每个三元组的行、列交换后顺序存储到B的三元组顺序表中。

伪代码:

1. 设置转置后矩阵B的行数、列数和非零元个数;

2. 在B中设置初始存储位置pb;

3. for (col=最小列号; col<=最大列号; col++)

    3.1 A中查找列号为col的三元组;

    3.2 交换其行号和列号,存入Bpb位置;

    3.3 pb++;

  算法2:顺序取,直接存。即在A中依次取三元组,交换其行号和列号放到B 适当位置。

引入两个数组作为辅助数据结构:

num[nu]:存储矩阵A中某列的非零元素的个数;

cpot[nu]:初值表示矩阵A中某列的第一个非零元素在B中的位置。

numcpot存在如下递推关系:

cpot[0]=0;         cpot[col]=cpot[col-1]+num[col-1];   1≤col<nu

将矩阵Acol列元素存放在B中下标为cpot[col]的位置

伪代码:

1. 设置转置后矩阵B的行数、列数和非零元素的个数;

2. 计算A中每一列的非零元素个数;

3. 计算A中每一列的第一个非零元素在B中的下标;

4. 依次取A中的每一个非零元素对应的三元组;

    4.1 确定该元素在B中的下标pb

    4.2 将该元素的行号列号交换后存入Bpb的位置;

    4.3 预置该元素所在列的下一个元素的存放位置;

十字链表

采用链接存储结构存储三元组表,每个非零元素对应的三元组存储为一个链表结点,结构为:

row:存储非零元素的行号

col:存储非零元素的列号

item:存储非零元素的值

right:指针域,指向同一行中的下一个三元组

down:指针域,指向同一列中的下一个三元组

稀疏矩阵的压缩存储——十字链表的具体存储方法

1) 每一行的非零元素按其列号由right域链成一个带头结点的循环链表。

2)每一列的非零元素按其行号由down域链成一个带头结点的循环链表。

3)由于各行列链表头结点row域、col域和item域均为空,行链表头结点只用right域,列链表头结点只用down域,故这两组链表头结点可以合用。

4)为了实现对某一行(或某一列)头指针的快速查找,将指向这些头结点的头指针存在一个数组中。

本章总结

【python数据结构】多维数组相关推荐

  1. Python Numpy多维数组.sum(axis=0/1/2...) 详解

    Python Numpy多维数组.sum(axis=0/1/2-) 详解 numpy中axis取值的说明 首先对numpy中axis取值进行说明:一维数组时axis=0,二维数组时axis=0,1,维 ...

  2. python输入二维数组_Python输入二维数组方法

    Python输入二维数组方法 前不久对于Python输入二维数组有些不解,今日成功尝试,记以备忘.这里以输入1-9,3*3矩阵为例 n=int(input()) line=[[0]*n]*n for ...

  3. python读取二维数组的行列数_Python获取二维数组的行列数的2种方法

    Python获取二维数组的行列数的2种方法 这篇文章主要介绍了Python获取二维数组的行列数的2种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考 ...

  4. python 构件二维数组_通过这四个构件块来升级您的javascript数组

    python 构件二维数组 Arrays in JavaScript are something special, as they leverage the prototype feature of ...

  5. Python练习——二维数组中每行最大值和每行和

    Python练习--二维数组中每行最大值和每行和 求一个3*3二维数组中每行的最大值和每行的和. 输入格式: 在一行中输入9个小于100的整数,其间各以一个空格间隔 输出格式: 输出3行3列的二维数组 ...

  6. 【python】二维数组按照某行或某列排序(numpy lexsort)

    这里介绍的排序方法主要是针对最后一行和最后一列,如果要指定某一行目前没有很好的方法,有个笨办法可以先把排序的该列(或行)换到最后,排序后再换回来 曾经以为排序只能使用list的sort函数,后来发现a ...

  7. python 对二维数组赋值

    最近做力扣遇到一个问题, obstacleGrid=[[0],[1]]m = len(obstacleGrid) n = len(obstacleGrid[0]) # 需要考虑m=1 n=1dp = ...

  8. python将二维数组转换为一维数组_python的set处理二维数组转一维数组的方法示例...

    for splitValue in set(dataset[:, featureIndex].tolist()): 首先set是一个无序,无重复的数据结构,所以很多时候使用它来进行去重:但是set接收 ...

  9. python创建二维数组的方法_Python创建二维数组的正确姿势

    本文原创发布于微信公众号「极客猴」,欢迎关注第一时间获取更多原创分享 List (列表)是 Python 中最基本的数据结构.在用法上,它有点类似数组,因为每个列表都有一个下标,下标从 0 开始.因此 ...

  10. python对二维数组统计某一行的去重计数_Python数据分析笔记——Numpy、Pandas库

    利用Python进行数据分析中有两个重要的库是Numpy和Pandas,本章将围绕这两个库进行展开介绍. Numpy库 Numpy最重要的一个特点是就是其N维数组对象,即ndarray,ndarray ...

最新文章

  1. 尺度空间理论与图像金字塔(二)
  2. 观点丨机器学习未必是人工智能 未必依赖于大数据
  3. javascript对于DOM加强
  4. Objective-C method及相关方法分析
  5. android获取系统当前年月日时分秒的时间
  6. Cadence Virtuoso IC617的启动和新建工程
  7. mysql索引的创建及删除
  8. Taro button点击切换选中状态
  9. 基于Lumisoft.NET组件的POP3邮件接收和删除操作
  10. 编码格式(UTF-8 与 ANSI)各种编码解码(encode、decode)
  11. UVa 10986 - Sending email
  12. 设计模式练习:Composite模式
  13. Android Framework实战视频系列
  14. 华成英-模拟电子技术P9 静态工作点的稳定 笔记
  15. debug and releas 不显示 调试窗口(DOS窗口/控制台)
  16. 计算机强制关机后桌面图标不见了,强制关机后桌面上的图标全不见了怎么办
  17. python 正则表达式爬图片_利用python正则表达式爬取图片
  18. html5学生dw网页设计大作业,hbuilder仿茅台集团网页设计成品模板,图片轮播网页设计模板
  19. mysql sysvar int_MySQL:如何编写daemon plugin
  20. 【杂题】cf1041fF. Ray in the tube

热门文章

  1. 计算机应用对交通,计算机应用基础 交通学习文学.pdf
  2. 使用Arduino的自动开门器
  3. hdu 4826 Labyrinth
  4. 攻防世界 WEB mfw
  5. python node.js ruby_Python/Ruby/Node.js/Perl - 随笔分类 - bluefrog - 博客园
  6. Fractional Fourier Image Transformer forMultimodal Remote Sensing Data Classification
  7. 麻瓜编程python爬虫微专业_网易微专业Python Web开发工程师课程下载
  8. 新加坡国立计算机硕士转专业,【NUS计算机硕士毕业就业】 - 院校新闻 - 新加坡国立大学(Nus)...
  9. discuz 获取会员头像
  10. android 录屏功能,Android开发如何实现录屏小功能