当前位置: 首页 > 后端技术 > PHP

初步探索数据结构,了解不同类型的数据结构

时间:2023-03-29 23:13:18 PHP

数据结构的基本概念数据元素(DataElement)数据元素是数据的基本单位,在计算机程序中通常作为一个整体来考虑和处理。一个数据元素可能由多个数据项组成。数据项(DataItem)数据项是数据结构中讨论的最小单位,是数据记录中最基本、不可分割的数据单位。数据结构数据结构是指相互之间具有一个或多个特定关系的数据元素的集合。数据结构包括逻辑结构、存储结构和数据操作三个方面。数据结构的逻辑结构是对数据之间关系的描述。它与数据存储结构无关。同一个逻辑结构可以有多种存储结构。总之,数据的逻辑结构主要有两种类型。LinearStructures简单地说,线性结构是数据元素的有序(ordered)集合。它有四个基本特征:有一个唯一的数据元素叫做“first”有一个唯一的数据元素叫做“last”除最后一个元素外,其他数据元素都有一个唯一的“后继”。除了第一个元素,所有其他数据元素都有一个唯一的“前身”。数据结构中的线性结构是指数据元素之间存在“一对一”线性关系的数据结构。如(a1,a2,a3,...,an),a1是第一个元素,an是最后一个元素,这个集合是线性结构的集合。非线性结构与线性结构不同,非线性结构中的节点是一对多的关系,又可以细分为树结构和图结构。数据的物理结构数据的物理结构也称为存储结构,是数据的逻辑结构在计算机中的表示(也称为图像)。它包括数据元素的表示和关系的表示。当一个数据元素由多个数据项组成时,数据项的表示称为数据字段;比如一个链表节点,该节点包含一个值域和一个指针域,这里节点可以看成是一个数据元素,而值域和指针域就是这个数据元素的数据域。对于数据元素之间的关系,在计算机中有两种不同的表示方法:序列图像和非序列图像。对应的两种不同的存储结构是顺序存储结构和链式存储结构。顺序映射是通过数据元素在内存中的相对位置来表达数据元素之间的逻辑关系;非时序映射就是用指针的方式来表达数据元素之间的逻辑关系。顺序存储方式顺序存储结构是存储结构的一种。该结构将逻辑上相邻的节点存储在物理上相邻的存储单元中。节点之间的逻辑关系由存储单元的邻接关系决定。关系来体现。由此产生的存储结构是一种顺序存储结构,通常用计算机编程语言(如C/C++)的数组来描述。链接存储方式这种方式不需要逻辑上相邻的节点在物理上也相邻,节点之间的逻辑关系由一个额外的指针字段来表示。这样得到的存储表示称为链式存储结构,通常用计算机编程语言(如C/C++)的指针类型来描述。不同类型的数据结构在编程世界中有许多不同类型的数据结构。其中,以下是最常用的:Struct(结构)Array(数组)Linkedlist(链表)Doublylinkedlist(双向链表)Stack(栈)Queue(队列)PriorityQueue(优先队列)Set(集合)Map(映射))Tree(树)Graph(图)Heap(堆)结构(Struct)通常,一个变量可以存储单一的数据类型,而单一的标量数据类型只能存储单一的值。在很多情况下,我们可能需要将一些数据类型组合在一起作为一个单一的复杂数据类型。例如,我们想在学生数据类型中存储一些学生信息。我们需要学生姓名、地址、电话号码、电子邮件、出生日期、学生所在的班级等。为了将每个学生记录存储到唯一的学生数据类型中,我们需要一个特殊的结构。这可以通过结构轻松实现。换句话说,结构是值的容器,通常通过名称访问。结构在C编程语言中非常流行,我们也可以在PHP中使用类似的概念。数组(Array)虽然数组在PHP中被认为是一种数据类型,但实际上数组是所有编程平台都使用的数据结构。在PHP中,数组其实就是一个有序映射(orderedmap),后面我们会学习映射(map)。我们可以将多个值作为单个变量存储在单个数组中。矩阵类型的数据很容易存储在数组中,因此数组被广泛应用于所有编程平台。通常,数组是固定大小的集合,可通过顺序数字索引进行访问。在PHP中,数组的实现方式不同,您可以定义动态数组而无需定义任何固定大小的数组。数组可以有不同的维度。如果一个数组只有一个索引来访问一个元素,我们称它为一维数组。但是如果需要两个或多个索引来访问一个元素,我们分别称它为二维或多维数组。下面是两个数组数据结构图:链表(Linkedlist)链表是一种线性数据结构,它是数据元素的集合,也称为节点,可以有不同的大小。通常,列出的数据元素由称为链接的指针链接,因此称为链表。在链表中,一个列表元素通过指针链接到下一个元素。从下图我们可以看出,链表其实维护的是一个有序的集合。链表是编程语言使用的最常见和最简单的数据结构形式。在单链表中,我们只能往前走。注意:指针存储变量地址。双向链表(Doublylinkedlist)双向链表是一种特殊类型的链表,在节点结构中不仅存储下一个节点的指针,还存储上一个节点的指针。因此,它可以在列表中向前和向后移动。通过包含前一个和后一个指针,它提供了比单链表更大的灵活性。下图描绘了一个双向链表。栈(Stack)栈是一种线性数据结构,具有后进先出的原则。因此,栈只是在一端添加新元素或移除元素。它是计算机技术中最古老和最常用的数据结构之一。我们总是使用称为堆栈顶部的单个点从堆栈中添加或删除元素。术语“push”用于表示将一个元素添加到栈顶,“pop”用于表示从栈顶移除一个元素。下图描述了堆栈。队列(Queue)队列是另一种遵循先进先出(firstinfirstout)原则的线性数据结构。队列允许对集合进行两种基本操作。第一个是enqueue,它允许我们将一个元素添加到队列的后面。第二个是(dequeue)dequeue,它允许我们从队列的前面移除一个元素。队列是计算机技术中最常用的数据结构之一。下图描述了队列。集合(Set)集合(Set)是一种抽象数据类型,用来存储一些值。Set不像Collection那样使用,我们从中检索特定值;Set用于检查其中是否存在值。值不以任何特定顺序存储,集合中不应有任何重复值。集合数据结构可以排序并称为有序集。地图(Map)地图是键值对(Collection)的集合,其中所有的键都是唯一的。我们可以将映射视为一个关联数组,其中所有键都是唯一的。事实上,PHP数组是有序映射的一种实现。树是计算中使用最广泛的非线性数据结构。它高度用于分层数据结构。一棵树是由节点组成的,有一个特殊的节点,称为根,是树结构的开始。其他节点派生自根节点。树数据结构是递归的,这意味着一棵树可以包含许多子树。节点通过边相互连接。下图描绘了树。图数据结构是一种特殊类型的非线性数据结构,由有限数量的顶点或节点和边或弧组成。图可以是有向的或无向的。有向图清楚地指示边的方向,而无向图暗示边但不指示方向。因此,在无向图中,一条边的两个方向都被认为是一条边。换句话说,我们可以说图是一对集合(V,E),其中V是顶点集合,E是边集合:V={A,B,C,D,E,F}E={AB,BC,CE,ED,EF,DB}在有向图中,AB边与BA边不同,而在无向图中,AB和BA相同。图数据结构可以轻松解决计算机领域的许多复杂问题。下图描述了图形数据结构。堆(Heap)堆是一种特殊的基于树的数据结构,它满足堆的性质。最大的键是根,较小的键是叶,称为最大堆。或者,最小的键是根,较大的键是叶,称为最小堆。虽然堆结构的根是树中最大或最小的键,但它不一定是排序结构。堆用于解决图算法的效率和排序问题。下图描述了最大堆。参考文章数据结构学习笔记(一)