数据结构基本概念

数据元素(Data Element)

数据元素是数据的基本单位,在计算机程序中通常将其作为一个整体进行考虑和处理。一个数据元素可由若干个数据项组成。

数据项 (Data Item)

数据项是数据结构中讨论的最小单位,是数据记录中最基本的,不可分的数据单位。

数据结构

数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。数据结构包括3方面的内容:逻辑结构,存储结构和对数据的运算

数据结构的逻辑结构

数据的逻辑结构是对数据之间关系的描述,它与数据的存储结构无关,同一种逻辑结构可以有多种存储结构。归纳起来数据的逻辑结构主要有两大类。

  1. 线性结构 简单地说,线性结构是一个数据元素的有序(次序)集合。它有四个基本特征:

    • 存在唯一的一个被称做“第一个”的数据元素
    • 存在唯一的一个被称做“最后一个”的数据元素
    • 除最后元素之外,其它数据元素均有唯一的“后继”。
    • 除第一元素之外,其它数据元素均有唯一的“前驱”。

数据据结构中线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构。如(a1,a2,a3,.....,an),a1为第一个元素,an为最后一个元素,此集合即为一个线性结构的集合。

  1. 非线性结构 与线性结构不同,非线性结构中的结点存在着一对多的关系,它又可以细分为树形结构和图形结构。

数据的物理结构

数据的物理结构又称为存储结构,是数据的逻辑结构在计算机中的表示(又称映像)。它包括数据元素的表示和关系的表示。当数据元素是由若干数据项构成的时候,数据项的表示称为数据域;比如一个链表结点,结点包含值域和指针域,这里结点可以看做一个数据元素,其中的值域和指针域都是这个数据元素的数据域。

数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像和非顺序映像。对应的两种不同的存储结构分别是顺序存储结构和链式存储结构。顺序映像是借助数据元素在存储器中的相对位置来表示数据元素之间的逻辑关系;非顺序映像是借助指针表示数据元素之间的逻辑关系。

  1. 顺序存储方法 顺序存储结构是存储结构类型中的一种,该结构是把逻辑上相邻的结点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储结构为顺序存储结构,通常顺序存储结构式借助于计算机程序设计语言(例如C/C++)的数组来描述的。
  2. 链式存储方法 该方法不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构,通常借助于计算机程序设计语言(例如C/C++)的指针类型来描述它。

不同类型的数据结构

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

  • Struct(结构体)
  • Array(数组)
  • Linked list(链表)
  • Doubly linked list(双链表)
  • Stack(栈)
  • Queue(队列)
  • Priority Queue(优先队列)
  • Set(集合)
  • Map(映射)
  • Tree(树)
  • Graph(图)
  • Heap(堆)

结构体(Struct)

通常,变量可以存储单个数据类型,单个标量数据类型只能存储单个值。在许多情况下,我们可能需要将一些数据类型组合在一起作为单个复杂数据类型。例如,我们希望将一些学生信息存储在学生数据类型中。 我们需要学生姓名,地址,电话号码,电子邮件,出生日期,学生所在班级等。 为了将每个学生记录存储到一个独特的学生数据类型,我们需要一个特殊的结构。 这可以通过结构体轻松实现。 换句话说,结构体是值的容器,通常使用名称访问。 结构体在C编程语言中非常流行,我们也可以在PHP中使用类似的概念。

数组(Array)

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

数组数据结构图

链表(Linked list)

链表是线性数据结构,它是数据元素的集合,也称为节点,可以具有不同的大小。通常,列出的数据元素通过称为链接的指针链接,因此称为链接列表。在链表中,一个列表元素通过指针链接到下一个元素。从下图中,我们可以看到链表实际上维护了一个有序集合。 链表是编程语言使用的最常见和最简单的数据结构形式。 在单个链表中,我们只能前进。

链表

注意:指针存储变量地址。

双链表(Doubly linked list)

双向链表是一种特殊类型的链表,不仅存储下一个节点的指针,还将前一个节点指针存储在节点结构。因此,它可以在列表中前后移动。 它通过同时包含前一个和下一个指针,提供比单链表更多的灵活性。下图描述了一个双向链表。

clipboard.png

栈(Stack)

栈是一个具有后进先出(last in first out)原理的线性数据结构。因此,栈只在一端添加新元素或删除元素。 它是计算机技术中最古老,最常用的数据结构之一。我们总是使用名为栈顶的单个点在栈中添加或删除元素。 术语“入栈(push)”用于指示添加元素到栈顶,“出栈(pop)”是从栈顶顶删除元素。下图描述了栈。

clipboard.png

队列(Queue)

队列是遵循先进先出(first in first out)原理的另一种线性数据结构。队列允许对集合进行两个基本操作。 第一个是入队(enqueue),它允许我们将一个元素添加到队列的后面。 第二个是(出队)dequeue,它允许我们从队列的前面删除一个元素。 队列是计算机技术中最常用的数据结构之一。下图描述了队列。

clipboard.png

集合(Set)

集合(Set)是一种抽象数据类型,用于存储某些值。集合(Set)不像我们从中检索特定值的集合(Collection)那样使用; 集合(Set)用于检查其中是否存在值。这些值不以任何特定顺序存储,且集合中不应有任何重复值。可以将集合数据结构进行排序,并将其称为有序集合(Ordered Set)。

映射(Map)

映射是键值对的集合(Collection),其中所有键都是唯一的。我们可以将映射视为一个所有键都是唯一的关联数组。实际上,PHP数组是有序映射的实现。

树(Tree)

树是计算领域中使用最广泛的非线性数据结构。 它高度用于分层数据结构。树由节点组成,并且有一个特殊节点,称为树根,它是树结构的开始。其他节点派生于根节点。树数据结构是递归的,这意味着树可以包含许多子树。节点通过边缘相互连接。下图描述了树。

clipboard.png

图(Graph)

图数据结构是一种特殊类型的非线性数据结构,由有限数量的顶点或节点以及边或弧组成。图表既可以是有向的,也可以是无向的。 有向图清楚地表示边缘的方向,而无向图提示边缘而不是方向。 结果,在无向图中,边缘的两个方向都被认为是单个边缘。 换句话说,我们可以说图是一对集合(V,E),其中V是顶点集,E是边集:

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

在有向图中,边AB不同于边BA,而在无向图中,AB和BA都相同。 图数据结构可以很方便地解决计算机领域中的许多复杂问题。下图描述了图数据结构。

clipboard.png

堆(Heap)

堆是一种特殊的基于树的数据结构,它满足堆属性。最大的键是根,较小的键是叶子,称为最大堆。或者,最小的键是根,较大的键是叶子,称为最小堆。虽然堆结构的根是树的最大或最小键,但它不一定是排序结构。 堆用于解决图算法的效率和排序。下图描述了最大堆。

clipboard.png

参考文章

数据结构学习笔记(一)


tusi
106 声望1 粉丝