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日

相关文章

  • C语言树状数组的实例详解

    首先需要了解什么是树状数组。树状数组(Binary Indexed Tree,BIT),也叫做 Fenwick 树(树状数组的发明者是Peter M. Fenwick),是一个查询和修改复杂度都为 log(n) 的数据结构,与线段树类似,但使用起来比线段树更加方便以及简洁。 在该攻略中,我们将通过两条树状数组的实例,详细讲解树状数组,让读者更好地理解树状数组…

    数据结构 2023年5月17日
    00
  • 用C语言举例讲解数据结构中的算法复杂度结与顺序表

    让我来为你讲解“用C语言举例讲解数据结构中的算法复杂度结与顺序表”的完整攻略。具体如下: 一、算法复杂度 1.1 什么是算法复杂度 算法复杂度是衡量算法运行效率的重要指标。包括时间复杂度和空间复杂度。时间复杂度指算法解决问题所用的时间,通常用大O符号表示;空间复杂度指算法解决问题所需的内存空间大小。 1.2 如何分析算法复杂度 可以从以下三个方面来分析算法复…

    数据结构 2023年5月17日
    00
  • 数据结构之堆详解

    数据结构之堆详解 什么是堆? 堆(Heap)是一种特殊的树形数据结构。堆具有以下两个特点: 堆是一颗完全二叉树; 堆中每个节点的值都必须大于等于或小于等于其左右子节点的值,分别称作大根堆和小根堆。 上述的大根堆和小根堆其实是两种不同的堆的实现方式。对于大根堆,每个节点的值都比其左右子节点的值要大;小根堆则相反,每个节点的值都比其左右子节点的值要小。 堆的基本…

    数据结构 2023年5月17日
    00
  • Java性能优化之数据结构实例代码

    Java性能优化之数据结构实例代码攻略 本篇攻略主要介绍Java性能优化之数据结构实例代码的相关内容,包括数据结构的优化方法以及示例代码等。我们使用以下两个示例来说明性能优化的过程和方法。 示例1:字符串拼接 在Java中字符串拼接通常使用”+=”方式,但是在循环中频繁地使用该操作会导致性能问题。这时可以使用StringBuilder类的append()方法…

    数据结构 2023年5月17日
    00
  • C语言数据结构实现银行模拟

    C语言数据结构实现银行模拟攻略 背景介绍 银行模拟是计算机学科中一个重要的数据结构实践练习项目。它涉及到队列(Queue)等数据结构的应用,也是计算机基础课程的一个重要组成部分。 代码实现 1. 队列的实现 首先,我们需要实现一个队列(Queue)结构体,包含 QueueSize、Front、Rear 三个成员变量: struct Queue { int Q…

    数据结构 2023年5月17日
    00
  • Python数据结构之链表详解

    Python数据结构之链表详解 链表简介 链表是一种数据结构,其每个节点都包含一个指向下一个节点的指针。链表可以用来表示序列,集合或映射等数据结构。在Python中,链表通常由节点和链表类来实现。 单向链表 单向链表是一种链表,每个节点包含指向下一个节点的指针。在Python中,一个节点可以由一个简单的对象表示,而整个链表必须由相互链接的节点组成。 下面是一…

    数据结构 2023年5月17日
    00
  • C语言数据结构之迷宫求解问题

    C语言数据结构之迷宫求解问题攻略 1. 前言 迷宫求解问题是计算机科学中一个经典的问题,也是许多初学者接触数据结构和算法时常用的题目。本文将通过C语言实现一个迷宫求解算法,介绍迷宫求解问题的基本思路和实现方法。 2. 迷宫求解问题的基本思路 迷宫求解问题的基本思路是利用深度优先搜索(DFS)或广度优先搜索(BFS)的算法去遍历整个迷宫,直到找到出口为止。在实…

    数据结构 2023年5月17日
    00
  • C语言数据结构之图书借阅系统

    C语言数据结构之图书借阅系统是一款基于C语言的软件,主要用于管理图书馆的借阅信息,并提供图书查询、借阅、归还等功能。本文将介绍图书借阅系统的完整攻略。 设计思路 图书借阅系统的设计主要包括三个阶段:系统设计、数据结构设计和用户接口设计。 系统设计 系统设计是构建整个系统的重要阶段,需要确定系统的功能需求、模块划分和流程控制。本系统的主要功能包括: 图书查询:…

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