学好数据结构和算法 —— 非线性结构(上)

序言

上篇讲到线性结构,和线性结构相反的是非线性结构,非线性结构特点是一个结点元素可能有多个直接前驱和多个直接后继。常见的非线性结构有:二(多)维数组、树、图。

本来计划是非线性结构作为一篇,写着写着发现内容确实太多了,拆分为上、中、下3篇比较合适,所以改变了之前的计划。

1、二维数组

如:a[0][0]在水平方向有后继a[0][1],垂直方向有后继a[1][0],二维数组从水平方向或垂直方向看,某个元素都有前驱或后继,并不是线性结构。

二维数组的表示方法

矩阵表示法

行向量表示法

列向量表示法

二维数组的两种存储方式

其中行向量和列向量表示法分别对应二维数组的行序为主序和列序为主序两种存储方式。对于任意一个二维数组amxn

行序为主序储存时,任意一个元素a[i][j]寻址公式为:

&a[i][j] = &a[0][0] + (i * n + j) * data_size

其中:

  &a[i][j] : 为元素a[i][j]的地址

  &a[0][0]:为a[0][0]的存储位置(即数组的起始位置)

  data_size:数组里储存元素的长度

行序为主序储存时,任意一个元素a[i][j]寻址公式为:

&a[i][j] = &a[0][0] + (j * m + i) * data_size

公式参数参考列序存储公式参数说明。

2、三(多)维数组

相对于二维数组来说,三维以及N(N>2)维数组对于很多人来说可能不太熟悉,因为日常开发中用的比较少。对于三维数组可以放到坐标系里类比,有了3个维度,如下图所示:

分不了行和列了,其实返回去再看看二维数组,行为主序存储方式和列为主序存储方式其实分别对应的就是以左下标作为主序存储方式和以右下标作为主序存储方式。对于三(多)维数组来说也只有两种存储方式:以左下标作为主序存储方式和以右下标作为主序存储方式。

按左下标作为主序存储

任意一个N(n>2)维数组A[i1][i2]…[in],按左下标作为主序存储时候,设A‘ = A[i1][i2]…[in-1],那么A[i1][i2]…[in]可以简化为A‘[0],A‘[1],A‘[2],…,A‘[in - 1],然后存储A‘时候,也用左下标优先方式转化为A‘‘[0],A‘‘[1],A‘‘[2],…,A‘‘[in-1 - 1],依次类推,当存储最后1维数组时为A[0][i2]…[in],A[1][i2]…[in],A[2][i2]…[in],…A[i1 - 1][i2]…[in],这样就完成了N维数组的存储。

给定一个A[k1][k2]…[kn]元素,求它在数组中存储的位置可以依据公式:

对于三维数组A[x][y][z]来说,当以左下标优先存储时候,元素A[1][2][3]地址代入公式计算:

&A[1][2][3] = &A[0][0][0] + (3 + 2 * z + 1 * y * z) * data_size

按右下标作为主序存储

任意一个N(n>2)维数组A[i1][i2]…[in],按右下标作为主序存储时候,设A‘ = A[i2]…[in-1][in],那么A[i1][i2]…[in]可以简化为A‘[0],A‘[1],A‘[2],…,A‘[i1 - 1],然后存储A‘时候,也用右下标优先方式转化为A‘‘[0],A‘‘[1],A‘‘[2],…,A‘‘[i2 - 1],依次类推,当存储第n维数组时为A[i1][i2]…[in-1][0],A[i1][i2]…[in-1][1],…A[i1][i2]…[in-1][in - 1],这样就完成了N维数组的存储。

给定一个A[k1][k2]…[kn]元素,求它在数组中存储的位置可以依据公式:

对于三维数组A[x][y][z]来说,当以右下标优先存储时候,元素A[1][2][3]地址代入公式计算:

&A[1][2][3] = &A[0][0][0] + (1 + 2 * x + 3 * x * y) * data_size

原文地址:https://www.cnblogs.com/mr-yang-localhost/p/9977910.html

时间: 2024-11-13 09:19:17

学好数据结构和算法 —— 非线性结构(上)的相关文章

6. C#数据结构与算法 -- 非线性结构(图)

图 图表示点之间的关系,在C#中通过节点对象的集合来表示点(Vertex),用邻接矩阵(adjacency matrix)来表示点之间的关系.下面来看C#实现. using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Graph {     //表示点

数据结构与算法---字符串(上)

   hey,you guys. 好久没有继续我们的数据结构学习了,今天让我们一起来学习,开发中非常重要的一种数据类型--字符串.关于字符串,大家应该不会陌生.例如,我们做web开发,需要校验用户输入的注册信息是否合法,或者判断用户输入的账户.密码.是否正确等等.我们通过调用字符串的相关函数,就可以解决我们的需求.古语有云:"知其然,知其所以然".我们要做的,不仅仅是会调用字符串的方法,更要明白这些方法的原理.例如,在没有学习字符串之前,我认为要比较两个字符串是否相等,只需这样: st

MySQL索引背后的数据结构及算法原理(上)

本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 文章主要内容分为三个部分. 第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础. 第二部分结合`MySQL数据库中MyIS

js数据结构与算法存储结构

数据结构(程序设计=数据结构+算法) 数据结构就是关系,没错,就是数据元素相互之间存在的一种或多种特定关系的集合. 传统上,我们把数据结构分为逻辑结构和物理结构. 逻辑结构:是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题. 物理结构:是指数据的逻辑结构在计算机中的存储形式. 常用的数据结构有: 数组,队列(queue),堆(heap),栈(stack),链表(linked list ),树(tree),图(graph)和散列表(hash) 栈(stack):运算只在表的

13. C#数据结构与算法 -- 线性结构

本文中,我们讨论了三个部分的内容: 什么是线性结构,线性结构有哪些特点 . 详细介绍了一个最简单线性结构顺序表,并且通过源代码进行一些的分析. 最后还举了一个例子,让我们更好的理解顺序表. 第一部分:什么是线性结构,线性结构有哪些特点 什么是线性结构,线性结构是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这 种一对一的关系指的是数据元素之间的位置关系,即: (1)除第一个位置的数据元素外,其它数据元素

学好数据结构和算法 —— 复杂度分析

复杂度也称为渐进复杂度,包括渐进时间复杂度和渐进空间复杂度,描述算法随数据规模变化而逐渐变化的趋势.复杂度分析是评估算法好坏的基础理论方法,所以掌握好复杂度分析方法是很有必要的. 时间复杂度 首先,学习数据结构是为了解决“快”和“省”的问题,那么如何去评估算法的速度快和省空间呢?这就需要掌握时间和空间复杂度分析.同一段代码运行在不同环境.不同配置机器.处理不同量级数据…效率肯定不会相同.时间复杂度和空间复杂度是不运行代码,从理论上粗略估计算法执行效率的方法.时间复杂度一般用O来表示,如下例子:计

python数据结构与算法——二叉树结构与遍历方法

先序遍历,中序遍历,后序遍历 ,区别在于三条核心语句的位置 层序遍历  采用队列的遍历操作第一次访问根,在访问根的左孩子,接着访问根的有孩子,然后下一层 自左向右一一访问同层的结点 # 先序遍历 # 访问结点,遍历左子树,如果左子树为空,则遍历右子树, # 如果右子树为空,则向上走到一个可以向右走的结点,继续该过程 preorder(t):    if t:       print t.value       preorder t.L       preorder t.R # 中序遍历 # 从根

7. C#数据结构与算法 -- 存储结构(单链表)

C#定义并实现单链表 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Linked {     //单链表结点类,采用泛型       public class Node<T> {         private T data; //数据域,当前结点的数据           private 

如何高效、系统地学习数据结构与算法?

数据结构与算法的应用在计算机编程领域非常广泛,甚至可以说无处不在,比如图像视频处理.数据压缩.数据库.游戏开发.操作系统.编译器.搜索引擎.AR.VR.人工智能.区块链等等领域,都是以数据结构与算法为基石.很多程序员在初次接触到算法之后因为其知识点多.复杂.思考太过艰深选择放弃,但是数据结构与算法对于程序员的重要性不言而喻,不管是提升代码质量还是面试,可以说都是必备技能.那么,如何才能快速.清晰地学好数据结构与算法呢?iOS两大流行开源框架作者,小码哥教育创始人李明杰老师特意联合汇丰银行技术总监