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日

相关文章

  • JS中数据结构之栈

    接下来我将为大家讲解JS中数据结构之栈的完整攻略。 一、栈的定义 栈是一种受限的线性数据结构,它具有先进后出(Last In First Out, LIFO)的特点,即后进入的元素先出来。栈主要有两个操作:入栈和出栈,同时还需要考虑栈空和栈满两种特殊情况。 二、栈的实现 在JS中,可以通过数组来实现栈的功能。下面是一个实现栈的类: class Stack {…

    数据结构 2023年5月17日
    00
  • C语言 数据结构堆排序顺序存储(升序)

    C语言 数据结构堆排序顺序存储(升序)攻略 1. 堆排序概述 堆排序是一种常见的排序算法,通过构建最大堆或最小堆来实现排序。本文介绍的是使用顺序存储方式实现的最大堆排序,也就是升序排序。 2. 最大堆的定义和实现 最大堆指的是堆结构中父节点的值大于子节点的值,根节点的值最大。对于一棵完全二叉树,若父节点的下标为i,则其左子节点的下标为2i+1,右子节点的下标…

    数据结构 2023年5月17日
    00
  • Go语言数据结构之希尔排序示例详解

    Go语言数据结构之希尔排序示例详解 希尔排序简介 希尔排序,也称为缩小增量排序,是插入排序的一种更高效的改进版本;希尔排序是非稳定排序算法。 希尔排序的基本思想是已距离进行“减半”的插入排序;先将整个待排序的记录序列分割成若干个子序列,分别进行直接插入排序,待各子序列中的记录基本有序时,再将子序列合并为整体有序序列。 希尔排序的过程 从上面的简介中我们可以得…

    数据结构 2023年5月17日
    00
  • 常用的Java数据结构知识点汇总

    常用的Java数据结构知识点汇总 简介 Java中的数据结构是Java程序开发中非常重要的一部分。掌握常用的数据结构知识点是编写高效、优秀的Java程序的关键之一。本文将详细讲解Java中常用的数据结构知识点,并提供代码示例说明。 数组(Array) 数组是一组相同类型的数据集合,通过数组下标来访问数据,数组长度确定后就无法改变。在Java中,数组可以是基本…

    数据结构 2023年5月17日
    00
  • C语言线性表顺序表示及实现

    C语言线性表顺序表示及实现 线性表的概念 线性表是一种数据结构,它是由n(n≥0)个数据元素a1,a2,…,an 组成的有限序列(元素个数为0时,称为空表),并且这些数据元素遵循一定的线性关系。 线性表的存储结构 线性表的存储结构有两种:顺序存储和链式存储。顺序存储指的是用一段连续的存储单元依次存储线性表的数据元素,线性表中的元素在物理位置上也是相邻的;…

    数据结构 2023年5月17日
    00
  • C++ 超详细分析数据结构中的时间复杂度

    C++ 超详细分析数据结构中的时间复杂度攻略 什么是时间复杂度? 时间复杂度是用来衡量算法效率的指标,它表示的是算法的执行时间与问题规模之间的关系,通常用大O记法来表示。 如何分析时间复杂度? 1. 常见时间复杂度 以下是常见的时间复杂度及其对应的执行次数: 时间复杂度 对应执行次数 O(1) 常数级别 O(log n) 对数级别 O(n) 线性级别 O(n…

    数据结构 2023年5月17日
    00
  • 「线段树」!(简单)的线段树

    本题为3月20日23上半学期集训每日一题中B题的题解 题面 题目描述 给你一个序列 \(A[1],A[2],…,A[n]\) .( \(|A[i]| \leq 15007, 1 \leq N \leq 50,000\) ). M( \(1 \leq M \leq 500,000\) ) 次询问,每次询问 \(Query(x, y) = Max{A[i] …

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

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

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