多重表(广义表)

在深入浅出数据结构系列前面的文章中,我们一直在讨论“线性表”,其形式如下:

由a1,a2,a3,……a(n-1)个元素组成的序列,其中每一个元素ai(0<i<n)都是一个“原子”,“原子”的意思就是说元素本身是一个个体,所有元素都是相同的结构。

但是在我们常见的某些应用,比如Excel的表格中,我们发现表并不一定是线性表,Excel中的表就明显是二维的结构

image

那么在数据结构中,我们会使用这种广义上的表吗?答案是会,我们也会、或者说我们也能使用这样的非线性表。其实我们早就已经在使用这样的非线性表、广义表了,那就是多维数组。不难发现二维数组就可以抽象成Excel当中的表的样子。那么,广义表的定义是怎样的呢?其实很简单,就是在线性表的基础上稍加修改,我会用绿色将修改了的部分标识出来:

由a1,a2,a3,……a(n-1)个元素组成的序列,其中每一个元素ai(0<i<n)可能又是一个广义表。

可能会有人发现一个小小的问题,就是为什么我又将广义表叫作多重表呢?这其实只是一个理解角度的不同而带来的不同叫法罢了,多重表这种叫法想表达的主要意思是表中的元素可以是另一个表,而这另一个表中的元素又可以是一个表,相当于“一重又一重”的表,所以叫多重表。这个叫法其实并不是很重要。

讲到这儿,多重表的定义和可能的使用场景(想想多维数组可能使用的情况)想必大家都心里有数了,但是这篇博文肯定不能就这么结束了? 其实我们今天真正想讨论的,是当多维数组不能满足或者说不适合我们遇到的情况时,我们该如何用其他途径实现一个多重表?

为了说明这一点,显然我们需要先举一个多维数组不适合、却又需要使用多重表的例子:

假设我们的程序要存储一所大学的学生选课情况,然后允许用户执行两个操作,一个是查询某名学生选了哪些课程,另一个是查询某个课程有哪些学生选择了。对于这样的应用场景,显然需要使用到一个多重表,准确的说是一个二维的多重表,其中一维表示课程,另一维表示学生,就像下面的图。那么提到二维的多重表,我们脑海中最先浮现的应该就是二维数组了?

image

(存储学生选课的抽象的二维多重表,横向代表学生A,B,C……纵向代表课程1,2,3……,若某一项打勾则表示该学生选了该课程,比如若A1打勾则表示学生A选择了课程1)

但是,现在情况有了新条件,这一所大学我们知道三个信息:学生人数大约为5000人,学校所有开设的课程大约有1000门,一般来说一个学生选的课程也就10门。

  那么,根据这三个信息我们会发现,如果我们使用二维数组来存储学生选课的信息,总共将需要500万个元素,而平均来说其中只有5万个元素是“打勾”的,其它495万个元素都是“空”的,这样的浪费显然是巨大的!

  所以我们现在需要的就是一个“不那么浪费空间”的二维多重表。回顾我们学习线性表的历史,我们会发现,为了避免使用一维数组带来的巨大浪费,我们使用了一维的链表来替代,那么现在我们在二维数组上遇到了麻烦,是否可以用“二维链表”来替代呢?或者换句话说,是否有用链表实现的多重表呢?答案是肯定的,实现也是简单的。其实就是令每个课程作为一个链表的表头,每个学生作为一个链表的表头,除去学生结点和课程结点,其他结点均有一个nextStudent指针和一个nextCourse指针,分别指向下一个学生和下一门课程。我们用一张图片来展示一下用链表实现多重表大致是“长什么样”的:
  
  
image

不难看出,使用链表来实现需要的二维多重表能够节省下很多的空间(495万个结点),因为我们“跳过了”不需要的那些结点。那么现在,我们给出实现这个二维多重链表的各个结点定义:

struct node
{bool choose;struct node *hNextNode;struct node *vNextNode;struct student *student;struct course * course;
}struct student
{char name[SIZE];struct node *firstNode;
}struct course
{char name[SIZE];struct node *firstNode;
}

有了结点的定义,抽象图,想来实现二维多重链表也不是什么难事了,所以对这个问题的讨论就到此为止。

  

  稍微回顾一下本文讨论的顺序就不难发现,其实我们只是将“一维表中浪费空间的解决办法”扩展到了“二维表中浪费空间的解决办法”罢了,也可以说将“链表替代数组”扩展到了“二维链表替代二维数组”的情况,类似的我们还可以继续扩展到更高的维度,比如上面的例子中,我们除了学生、课程,还可以有“某个学生在某门课程的历次成绩”,这样一来就出现了第三维度。

转载于:https://www.cnblogs.com/linhaostudy/p/11193231.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单教你React父子组件间平级组件间传值

国庆充电特辑&#xff1a; 堵车堵死&#xff0c;废话不多说直接上菜。 1.父组件对子组件传值 利用props属性传值 class Component extends React.Component {constructor (props) {super(props);}render() {return (<div><h1>I am {this.props.name}</h1>…

Requests库的主要方法:requests.request为requests.get和requests.post两个的汇总,只是需要传方法...

1. requests.request(method,url,**kwargs&#xff09; method&#xff1a;请求方式&#xff0c;对应get/put/post等七种&#xff1a;拟获取页面的url链接&#xff1a;控制访问参数&#xff0c;共13个method&#xff1a;请求方式rrequests.request(GET,url,**kwargs) r reques…

jQuery插件开发教程

jQuery插件开发精品教程&#xff0c;让你的jQuery提升一个台阶 要说jQuery 最成功的地方&#xff0c;我认为是它的可扩展性吸引了众多开发者为其开发插件&#xff0c;从而建立起了一个生态系统。这好比大公司们争相做平台一样&#xff0c;得平台者得天下。苹果&#xff0c;微软…

微服务深入浅出(7)-- 网关路由Zuul

Zuul用于构建边界服务&#xff0c;致力于动态路由&#xff0c;过滤&#xff0c;监控&#xff0c;弹性伸缩和安全等方向。 1、ZuulRibbonEureka结合&#xff0c;可以实现智能路由和负载均衡 2、网关将所有服务的API接口统一聚合统一暴露 3、网关统一爆率接口后&#xff0c;可以做…

C# webkit内核 网页填表

比如我要操作的是下面的input 用到的方法是 调用如下&#xff1a; webkit.StringByEvaluatingJavaScriptFromString("document.getElementsByClassName(login_i_con_li_ipt name)[0].valueThis is a Demo."); 类似这种div在webkit中好像是无法通过常规方法模拟的 这时…

p字间距 html段落内文字设置字间距间隔

只对段落p内文字设置字间距&#xff0c;段落<p>是html段落标签&#xff0c;以<p>开始&#xff0c;以</p>结束&#xff0c;通常文章分段使用p标签&#xff0c;而有时小局部布局也可以使用p来布局。通过css设置其样式实现排版目的。 这里针对p设置字间距&…

基本数据类型

上节回顾 1.循环打印数列1&#xff0c;3&#xff0c;5&#xff0c;.........&#xff0c;99 for i in range(100):if i%21:print (i) 2.turtle 库 # penup 抬笔 # pendown 落笔 # pensize 画笔大小 # pencolor 画笔颜色## 画笔运动函数 # fd 前进 # bk 后退 # goto 到达指定的坐…

修改系统默认 alert 弹框样式

修改默认 alert 弹框&#xff0c;思路很简单&#xff0c;定义一个 alert(e) 函数&#xff0c;加载最开头即可。 css部分&#xff1a; <style>#msg{width:266px;position: fixed;z-index:999;top: 49%;margin-top:-80px;left:50%;margin-left:-133px;background:#fff;bo…

:nth-child(n)与:nth-of-type(n)为啥显示不对呢

首先是二者的区别 :nth-child(n) 是选择父元素的第n个子元素。 :nth-of-type(n) 是选择父元素的第n个同类型的子元素 举个例子&#xff1a; <div class"read"><h1>title</h1><p>paragraph1</p><p>paragraph2</p> <!…

css3 box-shadow阴影(内外阴影与发光)讲解

基础说明&#xff1a; 外阴影&#xff1a;box-shadow: X轴 Y轴 Rpx color; 属性说明&#xff08;顺序依次对应&#xff09;&#xff1a; 阴影的X轴(可以使用负值) 阴影的Y轴(可以使用负值) 阴影模糊值&#xff08;大小&#xff09; 阴影的颜色 内阴影&#xff1a;b…

远程链接错误:这可能是由于credssp加密oracle修正

此错误解决办法 1.WinR 输入regedit打开注册表 找到对应的以下目录HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 此时如果System下没有CredSSP时创建CredSSP没有Parameters时,创建Parameters 创建方法:右建>>新建>>项 2.在Para…

SpringBoot入门最详细教程

https://www.jianshu.com/p/af3d5800f763 网上有很多springboot的入门教程&#xff0c;自己也因为项目要使用springboot&#xff0c;所以利用业余时间自学了下springboot和springcloud&#xff0c;使用下来发现springboot还是挺简单的&#xff0c;体现了极简的编程风格&#xf…

通过Vue CLI3 快速创建Vue项目并部署到tomcat

1、前提 首先你要安装好nodejs和yarn,直接在官网下载安装包&#xff0c;一键安装即可&#xff0c;不需要什么环境配置&#xff0c;我安装的是最新版本&#xff08;node-v10.13.0、yarn-1.12.3&#xff09; 2、安装 同时写Vue CLI 3和Vue CLI 2 的原因是官方默认的是3&#x…

简述区块链(1)- 也许只有这一篇

一、唠叨两句 最近一直在考虑一个事情&#xff0c;就是怎么给不太了解技术的人讲清楚区块链。我先试着写下来&#xff0c;然后在逐步打磨吧&#xff0c;目标就是让哪些说看区块链看的云里雾里的同学能对区块链有一些认知。 二、定义 简单的给区块链下个定义&#xff1a;基于加密…

Vue CLI 3.0脚手架如何在本地配置mock数据json

前后端分离的开发模式已经是目前前端的主流模式&#xff0c;至于为什么会前后端分离的开发我们就不做过多的阐述&#xff0c;既然是前后端分离的模式开发肯定是离不开前端的数据模拟阶段。 我们在开发的过程中&#xff0c;由于后台接口的没有完成或者没有稳定之前我们都是采用…

python 通过下载包setup.py安装模块

下载安装包&#xff0c;并解压到相应的位置 1、打开cmd 2、到达安装目录 3、python setup.py build 4、python setup.py install 转载于:https://www.cnblogs.com/liuchunxiao83/p/11207340.html

Anaconda3自带jupyter

1、cmd命令行中输入 JupyterNotebook 2、系统自动调起下面页面&#xff08;注册端口冲突是打不开的&#xff09; 转载于:https://www.cnblogs.com/liuchunxiao83/p/11207385.html

理解Shadow DOM

1. 什么是Shadow DOM? Shadow DOM 如果按照英文翻译的话可以理解为 影子DOM, 何为影子DOM呢&#xff1f;可以理解为一般情况下使用肉眼看不到的DOM结构&#xff0c;那如果一般情况下看不到的话&#xff0c;那也就是说我们无法直接控制操纵的DOM结构。 Shadow DOM 它是HTML的一…

046 实例11-自动轨迹绘制

目录 一、"自动轨迹绘制"问题分析1.1 问题分析1.2 自动轨迹绘制二、"自动轨迹绘制"实例讲解2.1 自动轨迹绘制2.2 数据接口定义2.3 数据文件三、"自动轨迹绘制"举一反三3.1 理解方法思维3.2 应用问题的扩展一、"自动轨迹绘制"问题分析 …

python 操作 elasticsearch-7.0.2 遇到的问题

错误一&#xff1a;TypeError: search() got an unexpected keyword argument doc_type&#xff0c;得到不预期外的参数 解决方法&#xff1a;elasticsearch7里不用文档类型&#xff0c;所以去掉 doc_typecredit_data 错误二&#xff1a;RequestError(400, illegal_argument_ex…