【python数据结构】多维数组
在程序设计语言中大都提供了数组作为构造数据类型,本章重点讨论数组以及特殊矩阵的存储与寻址。
目录
数组
数组的定义
数组的特点
数组的基本操作
数组的存储结构与寻址
一维数组
二维数组
按行优先存储的寻址
矩阵的压缩存储
特殊矩阵和稀疏矩阵
压缩存储的基本思想
对称矩阵
三角矩阵
下三角矩阵:
上三角矩阵:
对角矩阵
稀疏矩阵
转置操作:
十字链表
本章总结
数组
数组的定义
数组是由一组类型相同的数据元素构成的有序集合,每个数据元素称为一个数组元素(简称为元素),每个元素受n(n≥1)个线性关系的约束,每个元素在n个线性关系中的序号i1、i2、…、in称为该元素的下标,并称该数组为 n 维数组。
如上图表示的二维数组中,元素a22受两个线性关系的约束,在行上有一个行前驱a21和一个行后继a23,在列上有一个列前驱a12和和一个列后继a32。
数组的特点
- 元素本身可以具有某种结构,属于同一数据类型;
- 数组是一个具有固定格式和数量的数据集合。
数组的基本操作
- 读操作:给定一组下标,读出对应的数组元素;
写操作:给定一组下标,存储或修改与其相对应的数组元素。
读操作和写操作本质上只对应一种操作——寻址
在数组上一般不能做插入和删除元素的操作,所以不用预留空间,适合采用顺序存储。
数组的存储结构与寻址
一维数组
设一维数组的下标的范围为闭区间[l,h],每个数组元素占用 c 个存储单元,则其任一元素 ai 的存储地址可由下式确定:
Loc(ai)=Loc(al)+(i-l)×c
二维数组
常用的映射方法有两种:
- 按行优先:先行后列,先存储行号较小的元素,行号相同者先存储列号较小的元素。
- 按列优先:先列后行,先存储列号较小的元素,列号相同者先存储行号较小的元素。
按行优先存储的寻址
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
对于下三角中的元素aij(i≥j),在数组SA中的下标k与i、j的关系为:k=i×(i-1)/2+j -1。
上三角中的元素aij(i<j),因为aij=aji,则访问和它对应的元素aji即可,即:k=j×(j-1)/2+i -1
三角矩阵
压缩存储:只存储上三角(或下三角)部分的元素。
下三角矩阵:
矩阵中任一元素aij在数组中的下标k与i、j的对应关系:
上三角矩阵:
矩阵中任一元素aij在数组中的下标k与i、j的对应关系:
对角矩阵
所有非零元素都集中在以主对角线为中心的带状区域中,除了主对角线和它的上下方若干条对角线的元素外,所有其他元素都为零。
寻址计算方法:
元素aij在一维数组中的序号 =2 + 3(i-2)+( j-i + 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 交换其行号和列号,存入B中pb位置;
3.3 pb++;
算法2:顺序取,直接存。即在A中依次取三元组,交换其行号和列号放到B 中适当位置。
引入两个数组作为辅助数据结构:
num[nu]:存储矩阵A中某列的非零元素的个数;
cpot[nu]:初值表示矩阵A中某列的第一个非零元素在B中的位置。
num与cpot存在如下递推关系:
cpot[0]=0; cpot[col]=cpot[col-1]+num[col-1]; 1≤col<nu
将矩阵A中col列元素存放在B中下标为cpot[col]的位置
伪代码:
1. 设置转置后矩阵B的行数、列数和非零元素的个数;
2. 计算A中每一列的非零元素个数;
3. 计算A中每一列的第一个非零元素在B中的下标;
4. 依次取A中的每一个非零元素对应的三元组;
4.1 确定该元素在B中的下标pb;
4.2 将该元素的行号列号交换后存入B中pb的位置;
4.3 预置该元素所在列的下一个元素的存放位置;
十字链表
采用链接存储结构存储三元组表,每个非零元素对应的三元组存储为一个链表结点,结构为:
row:存储非零元素的行号
col:存储非零元素的列号
item:存储非零元素的值
right:指针域,指向同一行中的下一个三元组
down:指针域,指向同一列中的下一个三元组
稀疏矩阵的压缩存储——十字链表的具体存储方法
(1) 每一行的非零元素按其列号由right域链成一个带头结点的循环链表。
(2)每一列的非零元素按其行号由down域链成一个带头结点的循环链表。
(3)由于各行列链表头结点row域、col域和item域均为空,行链表头结点只用right域,列链表头结点只用down域,故这两组链表头结点可以合用。
(4)为了实现对某一行(或某一列)头指针的快速查找,将指向这些头结点的头指针存在一个数组中。
本章总结
【python数据结构】多维数组相关推荐
- Python Numpy多维数组.sum(axis=0/1/2...) 详解
Python Numpy多维数组.sum(axis=0/1/2-) 详解 numpy中axis取值的说明 首先对numpy中axis取值进行说明:一维数组时axis=0,二维数组时axis=0,1,维 ...
- python输入二维数组_Python输入二维数组方法
Python输入二维数组方法 前不久对于Python输入二维数组有些不解,今日成功尝试,记以备忘.这里以输入1-9,3*3矩阵为例 n=int(input()) line=[[0]*n]*n for ...
- python读取二维数组的行列数_Python获取二维数组的行列数的2种方法
Python获取二维数组的行列数的2种方法 这篇文章主要介绍了Python获取二维数组的行列数的2种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考 ...
- python 构件二维数组_通过这四个构件块来升级您的javascript数组
python 构件二维数组 Arrays in JavaScript are something special, as they leverage the prototype feature of ...
- Python练习——二维数组中每行最大值和每行和
Python练习--二维数组中每行最大值和每行和 求一个3*3二维数组中每行的最大值和每行的和. 输入格式: 在一行中输入9个小于100的整数,其间各以一个空格间隔 输出格式: 输出3行3列的二维数组 ...
- 【python】二维数组按照某行或某列排序(numpy lexsort)
这里介绍的排序方法主要是针对最后一行和最后一列,如果要指定某一行目前没有很好的方法,有个笨办法可以先把排序的该列(或行)换到最后,排序后再换回来 曾经以为排序只能使用list的sort函数,后来发现a ...
- python 对二维数组赋值
最近做力扣遇到一个问题, obstacleGrid=[[0],[1]]m = len(obstacleGrid) n = len(obstacleGrid[0]) # 需要考虑m=1 n=1dp = ...
- python将二维数组转换为一维数组_python的set处理二维数组转一维数组的方法示例...
for splitValue in set(dataset[:, featureIndex].tolist()): 首先set是一个无序,无重复的数据结构,所以很多时候使用它来进行去重:但是set接收 ...
- python创建二维数组的方法_Python创建二维数组的正确姿势
本文原创发布于微信公众号「极客猴」,欢迎关注第一时间获取更多原创分享 List (列表)是 Python 中最基本的数据结构.在用法上,它有点类似数组,因为每个列表都有一个下标,下标从 0 开始.因此 ...
- python对二维数组统计某一行的去重计数_Python数据分析笔记——Numpy、Pandas库
利用Python进行数据分析中有两个重要的库是Numpy和Pandas,本章将围绕这两个库进行展开介绍. Numpy库 Numpy最重要的一个特点是就是其N维数组对象,即ndarray,ndarray ...
最新文章
- 尺度空间理论与图像金字塔(二)
- 观点丨机器学习未必是人工智能 未必依赖于大数据
- javascript对于DOM加强
- Objective-C method及相关方法分析
- android获取系统当前年月日时分秒的时间
- Cadence Virtuoso IC617的启动和新建工程
- mysql索引的创建及删除
- Taro button点击切换选中状态
- 基于Lumisoft.NET组件的POP3邮件接收和删除操作
- 编码格式(UTF-8 与 ANSI)各种编码解码(encode、decode)
- UVa 10986 - Sending email
- 设计模式练习:Composite模式
- Android Framework实战视频系列
- 华成英-模拟电子技术P9 静态工作点的稳定 笔记
- debug and releas 不显示 调试窗口(DOS窗口/控制台)
- 计算机强制关机后桌面图标不见了,强制关机后桌面上的图标全不见了怎么办
- python 正则表达式爬图片_利用python正则表达式爬取图片
- html5学生dw网页设计大作业,hbuilder仿茅台集团网页设计成品模板,图片轮播网页设计模板
- mysql sysvar int_MySQL:如何编写daemon plugin
- 【杂题】cf1041fF. Ray in the tube
热门文章
- 计算机应用对交通,计算机应用基础 交通学习文学.pdf
- 使用Arduino的自动开门器
- hdu 4826 Labyrinth
- 攻防世界 WEB mfw
- python node.js ruby_Python/Ruby/Node.js/Perl - 随笔分类 - bluefrog - 博客园
- Fractional Fourier Image Transformer forMultimodal Remote Sensing Data Classification
- 麻瓜编程python爬虫微专业_网易微专业Python Web开发工程师课程下载
- 新加坡国立计算机硕士转专业,【NUS计算机硕士毕业就业】 - 院校新闻 - 新加坡国立大学(Nus)...
- discuz 获取会员头像
- android 录屏功能,Android开发如何实现录屏小功能