数据结构初探,了解不一样类型的数据结构

数据结构基本概念

数据元素(Data Element)

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

数据项 (Data Item)

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

数据结构

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

数据结构的逻辑结构

数据的逻辑结构是对数据之间关系的描述,它与数据的存储结构无关,同一种逻辑结构能够有多种存储结构。概括起来数据的逻辑结构主要有两大类。数组

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

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

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

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

数据的物理结构

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

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

  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中使用相似的概念。3d

数组(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

参考文章

数据结构学习笔记(一)

相关文章
相关标签/搜索