当前课程知识点:数据结构 >  第5章 数组 >  5.1 数组定义和表示 >  5.1 数组定义和表示

返回《数据结构》慕课在线视频课程列表

5.1 数组定义和表示在线视频

下一节:5.2 矩阵的压缩存储

返回《数据结构》慕课在线视频列表

5.1 数组定义和表示课程教案、知识点、字幕

同学们大家好

我是云南大学信息学院教师孔兵

这节开始我们讨论第5章数组

首先介绍一下数组的定义

在这里,我们把数组看成是一种特殊的线性表

其特殊性在于表中的数据元素本身也是一个线性表

我们以二维数组为例

如果把二维数组的每行或者每列看成是一个数据元素的话

因每行或者每列本身就是一个线性表

那么二维数组就是一个数据元素为线性表的线性表

下面我们通过数据类型的定义方式来说明一下这个问题

我们首先定义了一个数组类型array2

它是一个的数据元素为elemtype的m行n列的二维数组类型

好,下面我们换一种定义方式

首先定义了一个数组类型array1

它是一个数据元素为elemtype的长度为n的一维数组类型

随后我们又定义了一个数组类型array2

它是一个数据元素为array1的长度为m的一维数组类型

两个array2虽然从他们的定义方式来看不同

但是从效果来看,两种定义的结果是等价的

都是定义一个M行和n列的二维数组类型

第2种定义方式

把一维数组类型array1看做一个元素类型

体现了二维数组是一个数据元素是为一维线性表的线性表

那么,同样的道理

三维数组可以看成是以二维数组为数据元素的线性表

依次类推

n维数组可以看成是以n-1为数组为数据元素的线性表

下面我们看一下数组的顺序表示和实现

数组一旦定义以后,其存储的元素类型就确定

存储元素的个数也被确定

也就是说,数组需要的存储空间大小

也就确定下来了

在已经明确存储空间大小的情况下

用顺序存储实现数组就比较自然了

数组的存储,会遇到一个问题

由于计算机的内存结构是一维的

不管它内存有多大,内存地址都是连续编号的

图中给出了内存结构的一个实例

内存地址从0000000连续编址

那么,我们分配给数组的存储空间

也是一维的一块连续空间

但数组呢?

在逻辑结构上是多维的

我们遇到的问题就是

要把逻辑结构上多维的数组存储到一维的内存空间中

为了实现多维数组的存储,就必须按照某种次序

把多维数组中的数组元素排成一个一维的序列

然后按照这个一维的序列把数组存储到一维的内存当中

下面我们仍然以二维数组为例,看一下它的存储实现

示例是一个M行和n列的二维数组

要把这样一个二维的结构变成一个一维的序列

有两种方式,称为行序和列序

行序意思就是说,在一维空间中存储的时候

先存第0行,再存第一行

依次类推,最后存m-1行

类似的,以列序存放的时候

我们先存第0列,再存第1列

最后存n-1列,以这样的方式

就把一个二维结构转为一个一维的序列

用这样的方式实现了二维数组的存储

下面我们看一下以行序实现二维数组存储的图示

以行序为主序存放

具体来说就是先存第1个元素a00,随后存a01

一直到a0,n-1,把第一行的n个元素存完

随后从a10开始存第2行,以此类推。最后存,第n-1行

不管是行序也好列序也好

我们都可以实现二维数组的存储

这个时候,我们又需要考虑一个问题

就是二维数组元素的存取,大家在编程的时候

可能都注意到了,我们存取二维数组元素的时候

是按逻辑结构来使用它的,也就是用下标

比如说存取a[i][j],意思就是说我们现在需要存取

二维数组中第i行第j列的这个元素

从刚才的讨论当中,我们注意到

二维数组是被化为一维的序列来实现存储的

那么,我们就需要解决一个问题

如何从数组元素的逻辑下标找到该元素在内存单元当中的具体地址

以实现对该元素的存取

我们以行序为例,要存取a[i][j]

如何从下标i,j计算出该元素在内存中的存储地址

数组空间的起始地址LOC(0,0)我们是知道的

C语言中数组名就是数组空间的起始地址

那么,求LOC(i,j)的核心问题实际上是要求一个偏移

也就是要求出按行序存放的时候

a[i][j]这个元素之前他存了多少个元素?

设列数是b2,就是每行有b2个元素

从0行开始,在第i行前面

存了0到i-1行,共i行

b2*i求出这i行元素的总数

在第i行中,a[i][j]是第j个

我们用b2*i+j就得到了a[i][j]这个元素之前他存了多少个元素

由此得到LOC(i,j)的计算公式

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

总的来说,求数组当中某个元素的具体存储地址

就是用数组起始地址加上在该元素之前已存储的数据元素的个数

当然,编程时我们并不用关心这个问题

系统内部会进行计算和映射

但是我们应该明白其原理

类似的套路,我们会在矩阵压缩中使用

这样行序和列序的方式

可以推广到多维数组的情况

分别称为行优先顺序和列优先顺序

行优先顺序就是规定,先排最右的下标

随后从右到左,最后排最左的下标

二维数组中就是,a00之后后排a01,a 02

排完a0,n-1之后

排左边的一个下边,那么下一个排的就是a10

列优先的话

就是a00之后排a10,a20,先排最左的下标

排完am-1,0以后

排右边的一个下标,下一个呢排a01以此类推

多维数组不过是下标的个数多一些

道理是一样的

多维数组具体的计算公式大家可以看一下教材当中的内容

同学们,这节课我们就讲到这儿

下次课再见

数据结构课程列表:

前言

-1.算法概念导入

--1.1 算法概念导入

-2.数据结构课程介绍

--2.数据结构课程介绍

-数据结构前言PPT

第0章 预备知识

-0.1变量、类型和表达式

--0.1变量、类型和表达式

-0.2 函数

--0.2 函数

-0.3 指针和单链表

--0.3 指针和单链表

-0.4 数组、指向函数的指针

--0.4 数组、指向函数的指针

-第0章 预备知识讨论题

-数据结构第0章预备知识PPT

第1章 绪论

-1.1什么是数据结构

--1.1什么是数据结构

--测试题

-1.2基本概念和术语

--1.2基本概念和术语

--测试题

-1.3数据结构的描述

--1.3数据结构的描述

--测试题

-1.4抽象数据类型的定义和实现

--1.4抽象数据类型的定义和实现

--测试题

-1.5算法和算法分析概念

--1.5算法和算法分析概念

--测试题

-1.6算法分析示例

--1.6算法分析示例

--测试题

-第1章 绪论讨论题

-数据结构第1章 绪论PPT

第2章 线性表

-2.1 线性表的类型定义

--2.1线性表的类型定义

--测试题

-2.2线性表的顺序表示和实现

--2.2 线性表的顺序表示和实现

--测试题

-2.3 线性链表

--2.3 线性链表

--测试题

-2.4 静态链表

--2.4 静态链表

--测试题

-2.5 循环链表和双向链表

--2.5 循环链表和双向链表

--测试题

-第2章 线性表讨论题

-数据结构第2章线性表PPT

第3章 栈和队列

-3.1 栈

--3.1栈

--测试题

-3.2 栈的实现

--3.2 栈的实现

--测试题

-3.3 栈的应用

--3.3 栈的应用

-3.4 栈与递归的实现

--3.4栈与递归的实现

--测试题

-3.5 队列和链队列

--3.5 队列和链队列

--测试题

-3.6 循环队列

--3.6 循环队列

--测试题

-第3章 栈和队列讨论题

-数据结构第3章栈和队列PPT

第4章 串

-4.1 串

--4.1 串

--测试题

-数据结构第4章 串PPT

第5章 数组

-5.1 数组定义和表示

--5.1 数组定义和表示

--测试题

-5.2矩阵的压缩存储

--5.2 矩阵的压缩存储

--测试题

-第5章 数组讨论题

-数据结构第5章数组PPT

第6章 树和二叉树

-6.1 树的定义和基本术语

--6.1 树的定义和基本术语

-6.2 二叉树和二叉树的性质

--6.2 二叉树和二叉树的性质

--测试题

-6.3 二叉树的存储结构

--6.3二叉树的存储结构

--测试题

-6.4 遍历二叉树

--6.4 遍历二叉树(1)

--6.4 遍历二叉树(2)

--测试题

-6.5 线索二叉树

--6.5 线索二叉树

--测试题

-6.6 树的存储

--6.6树的存储

-6.7 树的转换和遍历

--6.7 树的转换和遍历

--测试题

-6.8 赫夫曼树

--6.8 赫夫曼树

-6.9 赫夫曼编码

--6.9 赫夫曼编码

--测试题

-第6章 树和二叉树讨论题

-数据结构第6章树和二叉树PPT

第7章 图

-7.1 图的定义和术语

--7.1.1图的定义和术语(1)

--7.1.2图的定义和术语(2)

--测试题

-7.2 图的存储结构

--7.2.1 数组表示法(1)

--7.2.2 数组表示法(2)

--7.2.3 邻接表

--测试题

-7.3 图的遍历

--7.3.1 深度优先搜索

--7.3.2 广度优先搜索

--测试题

-7.4 最小生成树

--7.4.1 普里姆算法

--7.4.2 克鲁斯卡尔算法

--测试题

-7.5 有向无环图

--7.5.1 拓扑排序

--7.5.2 关键路径

--测试题

-7.6 最短路径

--7.6.1 单源最短路径-迪杰斯特拉算法

--7.6.2 每一对顶点之间的最短路径-弗洛伊德算法

--测试题

-第7章 图讨论题

-数据结构第7章图PPT

第8章 查找

-8.1 查找基本概念和顺序查找

--8.1 查找基本概念及顺序查找

--测试题

-8.2 有序表的查找

--8.2 有序表的查找

--测试题

-8.3 二叉排序树

--8.3.1 二叉排序树(1)

--8.3.2 二叉排序树(2)

--测试题

-8.4 平衡二叉树

--8.4 平衡二叉树

--测试题

-8.5 哈希表

--8.5.1 哈希表及哈希函数的构造

--8.5.2 解决冲突的方法

--8.5.3 哈希表的查找和性能分析

--测试题

-第8章 查找讨论题

-数据结构第8章查找PPT

第9章 内部排序

-9.1插入排序

--9.1.1 插入排序(1)

--9.1.2 插入排序(2)

--测试题

-9.2 希尔排序

--9.2 希尔排序

--测试题

-9.3 快速排序

--9.3 快速排序

--测试题

-9.4 选择排序

--9.4 选择排序

--测试题

-9.5 堆排序

--9.5 堆排序

--测试题

-9.6 归并排序

--9.6 归并排序

--测试题

-9.7 基数排序

--9.7 基数排序

--测试题

-9.8 排序方法总结

--9.8 排序方法总结

-第9章 内部排序讨论题

-数据结构第9章内部排序PPT

5.1 数组定义和表示笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。