JavaScript数据结构之广义表的定义与表示方法详解

JavaScript数据结构之广义表的定义与表示方法详解

什么是广义表

广义表是一种包含了无数元素的数据结构,可以是元素或者嵌套的子表。广义表可以表示为:

$\quad\quad\quad GL = (a_0,a_1,...,a_n)$

其中$a_i$可以是元素或者一个子表,如果$a_i$为一个子表,那么$a_i$本身也是一个广义表。广义表中,第一个元素$a_0$表示广义表的类型,对于普通广义表来说,$a_0$为常量L。一个普通广义表可以表示为:

$\quad\quad\quad L = (a_0,a_1,...,a_n)$

$a_0$为常量L,$a_1$到$a_n$可以是元素或者嵌套的广义表。

广义表的表示方法

广义表有两种常见的表示方法:线性存储和二叉链表。

线性存储

线性存储方式是将广义表中的元素按照某种先后次序依次存储在一维数组中。元素与元素之间可以用逗号隔开,元素与子表之间可以用括号隔开。例如,该广义表:

$\quad\quad\quad L = (1,(2,3),4,(5,6,(7,8)))$

可以用线性存储表示为:

$\quad\quad\quad L = [1,\text{'('},2,3,\text{')'},4,\text{'('},5,6,\text{'('},7,8,\text{')'},\text{')'}]$

二叉链表

二叉链表是将广义表中的每个元素和含有嵌套广义表的元素表示为一个二叉树的结点,使用嵌套子树来表示子表。例如,该广义表:

$\quad\quad\quad L = (1,(2,3),4,(5,6,(7,8)))$

可以用二叉链表表示为:

L
├─1
├─sublist
│    ├─2
│    └─3
├─4
└─sublist
     ├─5
     ├─6
     └─sublist
          ├─7
          └─8

广义表的操作

由于广义表中的元素分为常规元素和嵌套的子表,因此一些操作定义成递归方式更合适。

求广义表长度

广义表长度可以递归表示为:如果广义表为空,长度为0,否则长度为广义表第一个元素长度加上剩下元素的长度。递归代码如下:

function glen(gl) {
  if (!gl.length) {
    return 0;
  } else if (typeof gl[0] !== 'object') {
    return 1 + glen(gl.slice(1));
  } else {
    return glen(gl[0]) + glen(gl.slice(1));
  }
}

取广义表的第$i$个元素

获取广义表的第$i$个元素也是递归的实现:如果$i=1$,则返回广义表的第一个元素,否则就是取剩下的广义表的第$i-1$个元素。递归代码如下:

function getgl(gl, i) {
  if (i === 1) {
    return gl[0];
  } else {
    let rest = gl.slice(1);
    if (typeof gl[0] === 'object') {
      rest = gl[0].concat(rest);
    }
    return getgl(rest, i - 1);
  }
}

示例说明

示例1:求广义表长度

假设我们有以下广义表:

$\quad\quad\quad L = (1,(2,3),4,(5,6,(7,8)))$

我们可以使用以上提到的glen函数来求取广义表L的长度:

let L = [1, [2, 3], 4, [5, 6, [7, 8]]];
let len = glen(L);
console.log(len); // output: 8

因此广义表L的长度为8。

示例2:取广义表的第$i$个元素

假设我们有以下广义表:

$\quad\quad\quad L = (1,(2,3),\text{'hello'},(5,6,(7,8)))$

现在我们想要取$L$的第4个元素,也就是字符串'hello':

let L = [1, [2, 3], 'hello', [5, 6, [7, 8]]];
let fourth = getgl(L, 4);
console.log(fourth); // output: hello

因此,广义表L的第4个元素为字符串'hello'。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript数据结构之广义表的定义与表示方法详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 带头节点的单链表的思路及代码实现

    带头节点的单链表的思路及代码实现(JAVA) 一、什么是的单链表 ①标准定义 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) +指针(指示后继元素存储位置,元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。) 以上是标准定义不太好让人对单链表有直观…

    算法与数据结构 2023年4月17日
    00
  • 详解Java集合中的基本数据结构

    详解Java集合中的基本数据结构 Java语言提供了丰富的集合框架,可以帮助我们高效地管理和操作数据。在这个库中,最基本的数据结构有数组、列表、映射和集合。本文将详细讲解Java集合中的基本数据结构。 数组 数组是Java中最基本的数据结构,它可以存储同一种数据类型的多个元素。在Java中,数组属于对象类型。可以通过以下方式来声明一个数组: int[] ar…

    数据结构 2023年5月17日
    00
  • Java 数据结构与算法系列精讲之二叉堆

    Java 数据结构与算法系列精讲之二叉堆 什么是二叉堆? 二叉堆是一种基于完全二叉树的数据结构,它分为大根堆(MaxHeap)和小根堆(MinHeap)。大根堆的每个节点的值都大于(或等于)它的子节点的值,小根堆的每个节点的值都小于(或等于)它的子节点的值。 二叉堆的操作 二叉堆主要有以下几种操作: 插入元素:将元素插入到堆的最后一个叶子节点,然后通过上滤操…

    数据结构 2023年5月17日
    00
  • Java面试题冲刺第十三天–数据库(3)

    当我们准备面试数据库相关的职位时,需要掌握SQL语言和常见的数据库管理系统。下面是针对Java面试中可能出现的常见数据库面试题的一些攻略。 1. 数据库连接的常见方式 在Java中,要与数据库连接有两种方式:JDBC和ORM框架。 (1) JDBC JDBC是Java连接数据库的标准方式,使用JDBC可以通过Java程序来连接不同的数据库。连接数据库的步骤包…

    数据结构 2023年5月17日
    00
  • C语言深入浅出讲解顺序表的实现

    C语言深入浅出讲解顺序表的实现 顺序表简介 顺序表是一种线性表的存储结构,它是由连续的内存空间来存储线性表中的元素。 顺序表的特点是支持查找、插入和删除操作,操作效率较高,但需要提前分配足够大的内存空间。当顺序表空间不足时,需要扩容,移动数据较为麻烦。 顺序表的实现 数据结构定义 顺序表的数据结构定义包含以下几个成员: 数据元素数组 data,存储线性表中的…

    数据结构 2023年5月17日
    00
  • 一行python实现树形结构的方法

    想要一行Python实现树形结构,我们需要使用Python的字典数据类型来完成任务。下面是详细的操作步骤: 创建树形结构字典 我们可以用嵌套字典来表示树形结构,我们需要选择其中一个节点作为根节点,并以键值对的形式保存其子节点。最终,我们将根节点作为整个字典的返回值。下面是实现代码: tree = lambda: defaultdict(tree) 插入节点 …

    数据结构 2023年5月17日
    00
  • C语言数据结构 链表与归并排序实例详解

    C语言数据结构 链表与归并排序实例详解 链表介绍 链表是一种数据结构,它对于存储数据是动态而灵活的。它可以根据我们的需要动态的分配内存空间。链表是由先后相连的数据单元(结点)组成,每个结点都包含了下一结点的地址信息,最后一个结点的地址信息为NULL。链表按照操作方式可以分为单向链表、双向链表与循环链表等几种类型。 归并排序原理 归并排序是一种分治思想的算法,…

    数据结构 2023年5月16日
    00
  • 【ACM博弈论】SG函数入门(1):从巴什博奕到尼姆游戏

    在我小时候以前做题的时候,遇到博弈题往往都是漫无目的地打表找规律,或者找一些特殊情况但是没有很好的分析方法。 其实博弈题是有比较套路的解题方法的,那就是利用SG函数,第一节不会讲到SG函数的具体用法,我们先来博弈入个门,学习一下最基本的博弈类型:Nim游戏。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式…

    算法与数据结构 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部