首页 > 其他分享 >广义表的学习

广义表的学习

时间:2024-04-08 13:00:17浏览次数:20  
标签:元素 学习 GenNode 广义 深度 子表 节点

广义表的定义:

广义表(Generalized List)是一种数据结构,它是线性表的推广。线性表是由零个或多个元素组成的有限序列,而广义表可以包含原子元素(即非广义表的元素)和子表(即广义表),这使得广义表能够表示更加复杂的数据结构。

广义表(Lists,又称列表)是一种非连续性的数据结构,是线性表的一种推广。在线性表的定义中,a[i]只限于单个元素,而在广义表中,a[i]不仅可以是单个元素,还可以是另一个广义表,从而放松了对表元素的原子限制,容许它们具有其自身的结构。因此,广义表是由零个或多个单元素或子表所组成的有限序列。通常用大写字母表示广义表的子表,用小写字母表示原子。当广义表非空时,称第一个元素a[i]为表头,称其余元素组成的表(a[2],a[3],a[4],…… ,a[n])为表尾。

广义表具有多种性质:

递归结构:广义表可以包含其他广义表作为其元素,形成多层次的嵌套结构。

可变长度:广义表是一个可变长度的数据结构,它可以包含零个或多个元素。

不唯一性:两个广义表可能具有相同的元素,但它们的顺序和嵌套结构可能不同。

灵活性:广义表支持插入、删除、查找等操作,可以动态增长或缩小。

广义表通常使用链式存储结构来存储数据,但也可以使用数组等其他存储结构来实现。这些数据通常具有嵌套和层次结构,而广义表可以很好地表示这些特性

广义表语法:

广义表的语法通常遵循一定的规则来表示其结构和内容。以下是一些关于广义表语法的关键要点:

表示方法:

广义表通常使用圆括号 () 来括起其元素,并使用逗号 , 来分隔不同的元素。

为了区分原子(基本类型的数据)和子表(另一个广义表),通常会使用大写字母来表示子表,而小写字母表示原子。

递归定义:

广义表是递归定义的,即广义表的元素可以是另一个广义表。这种递归性质使得广义表能够表示复杂的数据结构。

空表和原子:

空表是一个特殊的广义表,它不包含任何元素,通常表示为 ()。

原子是广义表的基本元素,它们不是广义表,而是基本类型的数据,如数字、字符等。

长度和深度:

广义表的长度是指其包含的元素的个数。

广义表的深度是指其嵌套的层数。原子的深度为0,空表的深度为1,而包含子表的广义表的深度则大于1。

子表和表头表尾:

如果一个元素是另一个广义表,则称该元素为子表。

对于非空广义表,第一个元素称为表头,其余元素组成的表称为表尾。

以下是一些广义表语法的示例:

E = ():E 是一个空表,其长度为0。

L = (a, b):L 是一个长度为2的广义表,其元素都是原子。

A = (x, L) = (x, (a, b)):A 是一个长度为2的广义表,第一个元素是原子x,第二个元素是子表L。

C = (A, B) = ((x, (a, b)), ((x, (a, b)), y)):C 的长度为2,两个元素都是子表。

D = (a, D) = (a, (a, (a, (…)))):D 是一个递归的广义表,其长度为2,第一个元素是原子a,第二个元素是D自身。

这些示例展示了广义表的基本语法和表示方法,通过不同的组合和嵌套,可以构建出复杂的数据结构。需要注意的是,具体的语法规则可能会因不同的编程语言或应用领域而有所差异,因此在实际应用中需要参考相应的文档或规范。

广义表(Lists,又称列表)具有多种特性,以下是一些主要的特性:

  1. 层次性:广义表的元素可以是子表,而子表的元素还可以是子表,由此,广义表是一个多层次的结构。这种层次性使得广义表能够表示更为复杂的数据结构,满足了实际应用中对于嵌套数据的需求。
  2. 共享性:广义表可以为其他广义表所共享。这种共享性提高了数据的复用性,减少了数据的冗余,从而优化了存储空间的使用。
  3. 递归性:广义表可以是其自身的一个子表,形成递归表。递归表在定义上可以是无穷的,但在实际应用中,其长度通常是有限的。这种递归性使得广义表能够表达更为复杂和灵活的数据结构。
  4. 元素多样性:广义表中的元素可以是原子(如数字、字符等),也可以是另一个广义表。这种元素的多样性使得广义表能够表示更为丰富和复杂的数据关系。
  5. 有序性:广义表中的元素是按照一定的顺序排列的,这种有序性使得我们可以按照特定的顺序来访问和处理元素。

广义表的深度和长度:

广义表的深度定义为子表的最大嵌套层数。具体地说,空表的深度为1,原子(即不含任何括号的元素)的深度为0。而当一个元素是另一个广义表时,其深度为子表的深度加1。

广义表的长度则是指该广义表中元素的个数,包括子表。子表被算作单一元素,而不是被拆分成多个元素计算。

例如,对于广义表LS=((),a,b,(a,b,c),(a,(a,b),c)),其长度为5(因为包含5个元素:一个空子表、a、b、一个包含三个元素的子表、和一个包含两个元素的子表),深度为3(因为子表(a,(a,b),c)是嵌套层数最深的子表)。

为了更深刻的理解我们的深度和长度的概念,下面,我们来做点练习:

以下是一些广义表的例子,以及它们的长度和深度的判断:

例1: 广义表 L1 = (a, (b, c, d), e)

  • 长度: 广义表 L1 包含三个元素:a,一个子表 (b, c, d),以及 e。因此,L1 的长度为 3。
  • 深度: 子表 (b, c, d) 的深度为 1(因为它没有嵌套子表)。整个广义表 L1 的深度也是 1,因为最深的嵌套层数就是 1。

例2: 广义表 L2 = (f, (g, (h, i), j))

  • 长度: 广义表 L2 包含两个元素:f 和一个子表 (g, (h, i), j)。因此,L2 的长度为 2。
  • 深度: 子表 (g, (h, i), j) 包含另一个子表 (h, i),而 (h, i) 没有再嵌套子表。所以 (g, (h, i), j) 的深度为 2。整个广义表 L2 的深度也是 2。

例3: 广义表 L3 = ()

  • 长度: 空广义表不包含任何元素,所以其长度为 0。
  • 深度: 空广义表被视为一个单独的实体,因此其深度为 1。

例4: 广义表 L4 = (((a), (b, (c, d)), e)

  • 长度: 广义表 L4 包含两个元素:一个子表 (((a), (b, (c, d))) 和 e。因此,L4 的长度为 2。
  • 深度: 子表 (b, (c, d)) 的深度为 2,因为它包含一个嵌套子表 (c, d)。而整个广义表 L4 的最深嵌套层数也是 2(由子表 (b, (c, d)) 贡献),因此其深度为 2。

通过这些例子,我们可以看到,要确定广义表的长度,我们只需计算最外层包含的元素的个数;而要确定深度,我们需要找到最深的嵌套子表,并计算其嵌套层数。注意,在计算深度时,我们可能需要递归地检查子表的结构。

广义表的存储结构:

广义表采用链式存储结构时,通常使用链表来表示广义表的元素之间的关系。由于广义表中的元素既可以是原子也可以是子表,因此链式存储结构需要能够灵活地处理这两种情况。

在链式存储结构中,每个节点通常包含两部分信息:数据域和指针域。数据域用于存储节点的值,而指针域则用于指向其他节点。

对于广义表的链式存储,可以采用如下方式:

  1. 原子节点
    • 数据域:存储原子的值。
    • 指针域:通常不需要额外的指针,或者可以设置一个指向下一个同层节点的指针。
  2. 表节点(即子表的节点):
    • 数据域:通常不存储具体的值,而是作为子表的标识。
    • 指针域:需要至少两个指针。一个指针指向子表的第一个元素(即表头),另一个指针指向子表的剩余部分(即表尾)。如果子表还有更深层次的子表,那么表尾指针可能需要指向下一层的第一个节点。

此外,为了区分原子节点和表节点,可以在节点结构中增加一个标志位。例如,标志位为0表示该节点是原子节点,标志位为1表示该节点是表节点。

这种链式存储结构能够灵活地表示广义表的结构,允许表中有表,且表的长度可以是任意的。同时,由于链表本身的动态性,这种存储结构也能够方便地实现广义表的插入、删除等操作。

需要注意的是,由于链式存储结构需要额外的空间来存储指针,因此在某些情况下可能会比顺序存储结构占用更多的空间。此外,链式存储结构在访问元素时通常需要从头节点开始遍历,因此在某些情况下可能不如顺序存储结构高效。

结构:

广义表节点(data数据域,child子表地址域,next后继节点地址域)

将原子节点的child域值设置为null,因此,child域是否为null成为区分原子和子表的标志。

广义表的抽象数据类型:

声明GenLList<T>接口:


public interface GenLList<T> {
	boolean isEmpty();
	int size();
	int depth();
	GenNode<T> get(int i);
	GenNode<T> insert(int i,T x);
	GenNode<T> insert(int i,GenList<T>genlist);
	GenNode<T> remove(int i);
	void clear();
	GenNode<T> search(T key);
	GenNode<T> remove(T key);
}

解释:

public interface GenLList<T> {  
    // 检查广义表是否不包含任何元素(即是否为空)。  
    boolean isEmpty();  
  
    // 返回广义表中包含的元素个数。  
    int size();  
  
    // 返回广义表的最大括号嵌套层数,即深度。  
    int depth();  
  
    // 返回广义表中指定位置的节点。如果索引超出范围,可能抛出异常或返回特定值。  
    GenNode<T> get(int i);  
  
    // 在广义表的指定位置插入一个原子元素。如果索引超出范围,可能抛出异常。  
    GenNode<T> insert(int i, T x);  
  
    // 在广义表的指定位置插入一个子表。如果索引超出范围,可能抛出异常。  
    GenNode<T> insert(int i, GenList<T> genlist);  
  
    // 从广义表中删除指定位置的节点,并返回被删除的节点。如果索引超出范围,可能抛出异常或返回null。  
    GenNode<T> remove(int i);  
  
    // 清空广义表,移除所有节点。  
    void clear();  
  
    // 在广义表中搜索具有指定值的节点,并返回第一个匹配的节点。如果没有找到,可能返回null。  
    GenNode<T> search(T key);  
  
    // 从广义表中删除第一个具有指定值的节点,并返回被删除的节点。如果没有找到,可能返回null。  
    GenNode<T> remove(T key);  
}

声明广义表节点类:


public class GenNode<T> {
	public T data;
	public GenList<T> child;
	public GenNode<T> next;
	public GenNode(T data, GenList<T> child, GenNode<T> next) {
		super();
		this.data = data;
		this.child = child;
		this.next = next;
	}
	
	public GenNode()
	{}

未完待续......

标签:元素,学习,GenNode,广义,深度,子表,节点
From: https://blog.csdn.net/2301_77523055/article/details/137432059

相关文章

  • 联合学习MOON——无需共享原始数据,通过模型对比联合学习实现准确的图像分类
    1.概述联合学习(FederatedLearning)是一种分布式的机器学习方法,它允许多个参与者协作训练一个共享的模型,同时保持各自数据的隐私性。这种方法特别适用于那些涉及敏感数据的场景,如医疗、金融和个人设备等。在传统的中心化机器学习方法中,所有的数据需要被收集到一个中心服务......
  • 前端学习<四>JavaScript基础——11-流程控制语句:选择结构(if和switch)
    代码块用{}包围起来的代码,就是代码块。在ES5语法中,代码块,只具有分组的作用,没有其他的用途。代码块中的内容,在外部是完全可见的。举例: {   vara=2;   alert('qianguyihao');   console.log('千古壹号'); } ​ console.log('a='+a);打印结......
  • 前端学习<四>JavaScript基础——10-运算符
    我们在前面讲过变量,本文讲一下运算符和表达式。运算符的定义和分类运算符的定义运算符:也叫操作符,是一种符号。通过运算符可以对一个或多个值进行运算,并获取运算结果。表达式:数字、运算符、变量的组合(组成的式子)。表达式最终都会有一个运算结果,我们将这个结果称为表达式的......
  • PCB学习记录-----入门&基础知识
    一、搭建环境1.下载嘉立创EDA 软件下载-嘉立创EDA(lceda.cn)选专业版在线编辑:嘉立创EDA(专业版)-V2.1.45(lceda.cn)官方教程:立创EDA专业版-使用教程(lceda.cn)2.新建工程文件-新建-项目,右键Board1可以重命名,原理图右键新增图页右侧图纸尺寸可自定义调整图纸......
  • 吴恩达2022机器学习专项课程(一) 5.5 特征缩放1 & 5.6 特征缩放2
    问题预览/关键词什么是特征缩放?作用是什么?特征尺度和参数w权重的关系是?算法为什么要调节w权重?不进行特征缩放对梯度下降的影响?有特征缩放对梯度下降的影响?实现特征缩放的三种方法是?如何实现最大值缩放?如何实现均值归一化?如何实现Z-score标准化?判断缩放成功的标准是?什么情况......
  • 从零开始的深度学习项目(PyTorch识别人群行为)
    PyTorch识别人群行为系统环境介绍环境版本Python3.11.5pandas2.0.3numpy1.24.3torch2.1.2+cu121注意:2.1.2+cu121这样的版本号通常用于描述TensorFlow等深度学习框架的版本信息,其中:2.1.2是TensorFlow的主要版本号,表示主要的功能和接口的变化。cu121表示该Tenso......
  • 深度学习-卷积神经网络--什么是manifold embedding--66
    目录参考:流形假设(ManifoldHypothesis)在介绍流形学习(Manifoldlearning)之前,首先需要理解一个假设,就是流形假设(ManifoldHypothesis)。这个假设认为,高维数据很多都是低维流形嵌入(embedding)于高维空间当中,比如说三维空间里的各种平面或者曲面,虽然这些平面或者曲面处于三......
  • JAVA语言学习-Day5
    集合Java中的集合是工具类,可以存储任意数量的具有共同属性的对象应用场景无法预测存储数据的数据同时存储具有一对一关系的数据需要进行数据的增删数据重复问题体系结构Collection:List、Queue、SetMap:HashMapList有序且可重复,ArrayList、LinkedList......
  • 学习笔记445—白盒测试用例设计方法(语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组
    白盒测试用例设计方法(语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖、基本路径覆盖语句覆盖:每条语句至少执行一次。判定覆盖:每个判定的所有可能结果至少出现一次。(又称“分支覆盖”)条件覆盖:每个条件的所有可能结果至少执行一次。判定/条件覆盖:一个判定中的每......
  • 【学习笔记】基础数据结构:猫树
    猫树是线段树的一个特殊版本,猫树不再支持修改操作,类似\(\text{ST}\)表猫树支持高速区间查询,每次查询都只需要进行\(1\)次合并操作,设单次合并操作的复杂度为\(O(k)\),建立猫树的复杂度是\(O(kn\logn)\)的,而查询的复杂度是\(O(k)\)的一般单次查询的复杂度是\(O(1)\),所......