不同的数据结构

我们可以将数据结构分为两个不同的组:

  • 线性数据结构

  • 非线性数据结构

在线性数据结构中,项目是以线性或顺序的方式构建的。数组、列表、堆栈和队列就是线性结构的例子。在非线性结构中,数据不是按顺序排列的。图和树是非线性数据结构最常见的例子。

现在,让我们探索数据结构的世界,总结不同类型的数据结构及其用途。稍后,我们将详细探讨每一种数据结构。

编程世界中有许多不同类型的数据结构。其中,最常用的有以下几种:

  • Struct

  • Array

  • Linked list

  • Doubly linked list

  • Stack

  • Queue

  • Priority queue

  • Set

  • Map

  • Tree

  • Graph

  • Heap

Struct

通常,一个变量只能存储一个数据类型,而一个标量数据类型只能存储一个值。在很多情况下,我们可能需要将一些数据类型组合成单一的复杂数据类型。例如,我们想把一些学生信息存储在学生数据类型中。我们需要学生姓名、地址、电话号码、电子邮件、出生日期、当前班级等信息。为了将每条学生记录存储到唯一的学生数据类型中,我们需要一种特殊的结构来实现这一目的。这可以通过 struct 轻松实现。换句话说,结构体是值的容器,通常使用名称进行访问。虽然结构体在 C 编程语言中非常流行,但我们也可以在 PHP 中使用类似的概念。我们将在接下来的章节中对此进行探讨。

Array

虽然数组在 PHP 中被认为是一种数据类型,但数组实际上是一种数据结构,在所有编程平台中都被广泛使用。在 PHP 中,数组实际上是一个有序的映射(我们将在后面几节中了解映射)。我们可以将多个值作为一个变量存储在一个数组中。矩阵类型的数据很容易存储在数组中,因此它在所有编程平台中都被广泛使用。数组通常是一个固定大小的集合,通过顺序数字索引进行访问。在 PHP 中,数组的实现方式不同,可以定义动态数组,而无需定义数组的固定大小。我们将在下一章详细介绍 PHP 数组。数组可以有不同的维数。如果一个数组只有一个索引来访问一个元素,我们称之为单维数组。但如果需要两个或更多索引才能访问一个元素,我们就分别称之为二维数组或多维数组。下面是两个数组数据结构的示意图:

image 2023 11 06 15 18 14 470

单链

链表是一种线性数据结构,是数据元素(也称为节点)的集合,可以有不同的大小。通常,列表项通过指针连接,指针被称为链接,因此被称为链表。在链接表中,一个列表元素通过指针链接到下一个元素。从下图中我们可以看出,链表实际上是在维护一个有序集合。链接表是编程语言中最常见、最简单的数据结构形式。在单个链接表中,我们只能前进。在第 3 章 "使用链接表" 中,我们将深入探讨链接表的概念和实现:

image 2023 11 06 15 18 54 517

双链

双链表是一种特殊类型的链表,我们不仅要存储下一个节点,还要在节点结构中存储上一个节点。因此,它可以在列表中前后移动。通过同时拥有上一个和下一个指针,它比单一链表或链表具有更大的灵活性。我们将在第 3 章 "使用链接表" 中进一步探讨。下图描述了一个双链表:

image 2023 11 06 15 20 13 138

Stack

正如我们在前面几页中谈到的堆栈,我们已经知道堆栈是一种线性数据结构,采用后进先出原则。因此,堆栈只有一端可以添加新项目或删除项目。它是计算机技术中最古老、最常用的数据结构之一。我们总是使用名为 top 的单点来添加或删除堆栈中的项目。术语 "push" 表示在栈顶添加一个项目,"pop" 表示从栈顶删除一个项目;如下图所示。我们将在第 4 章 "构建堆栈和队列" 中进一步讨论堆栈。

image 2023 11 06 15 20 59 874

Queue

队列是另一种遵循先进先出原则的线性数据结构。队列允许对集合进行两种基本操作。第一个操作是 enqueue,允许我们将一个项目添加到队列的后面。第二个操作是去队列(dequeue),允许我们从队列前面删除一个项目。队列是计算机技术中另一种最常用的数据结构。我们将在第 4 章 "堆栈和队列" 中详细了解队列。

image 2023 11 06 15 21 39 426

Set

集合是一种抽象的数据类型,用于存储某些值。这些值不按特定顺序存储,但集合中不应有任何重复值。集合并不像集合那样用来检索特定的值;集合是用来检查其中是否存在某个值。有时,集合数据结构可以排序,我们称之为有序集合。

Map

映射是键和值对的集合,其中所有键都是唯一的。我们可以把映射看作一个关联数组,其中所有的键都是唯一的。我们可以使用键和值对进行添加和删除,也可以使用键从映射中进行更新和查找。事实上,PHP 数组就是有序映射的实现。我们将在下一章对此进行探讨。

Tree

树是计算机世界中使用最广泛的非线性数据结构。它被广泛用于分层数据结构。树由节点组成,树的根节点是树结构的起点。其他节点从根节点开始。树形数据结构是递归的,这意味着一棵树可以包含许多子树。节点之间通过边相互连接。我们将在第 6 章 "理解和实现树" 中讨论不同类型的树、它们的操作和用途。

image 2023 11 06 15 22 55 963

Graph

图数据结构是一种特殊的非线性数据结构,由有限数量的顶点或节点以及边或弧组成。图既可以是有向的,也可以是无向的。有向图明确指出了边的方向,而无向图只提及边,而不指明方向。因此,在无向图中,边的两个方向都被视为一条边。换句话说,我们可以说一个图是一对集合(V, E),其中 V 是顶点集合,E 是边集合:

V = {A, B, C, D, E, F}
E = {AB, BC, CE, ED, EF, DB}

在有向图中,边 AB 与边 BA 不同,而在无向图中,AB 与 BA 相同。在编程世界中,图可以方便地解决很多复杂的问题。我们将在第 9 章 "将图付诸行动" 中继续讨论图数据结构。在下图中,我们有:

image 2023 11 06 15 24 15 155

Heap

堆是一种特殊的树形数据结构,它满足堆属性。最大的键是根,较小的键是叶子,这被称为最大堆。或者,最小的键是根,较大的键是叶子,这被称为最小堆。虽然堆结构的根是树中最大或最小的键,但它并不一定是排序结构。堆可用于高效解决图算法,也可用于排序。我们将在第 10 章 "理解和使用堆" 中探讨堆数据结构。

image 2023 11 06 15 24 53 291