数据结构基础

177 阅读4分钟

写在最前

简单地说,数据结构是以某种特定的布局方式存储数据的容器。这种“布局方式”决定了数据结构对于某些操作是高效的,而对于其他操作则是低效的。首先我们需要理解各种数据结构,才能在处理实际问题时选取最合适的数据结构。

为什么我们需要数据结构?

数据是计算机科学当中最关键的实体,而数据结构则可以将数据以某种组织形式存储,因此,数据结构的价值不言而喻。无论你以何种方式解决何种问题,你都需要处理数据,无论是涉及员工薪水、股票价格、购物清单,还是只是简单的电话簿问题。 数据需要根据不同的场景,按照特定的格式进行存储。有很多数据结构能够满足以不同格式存储数据的需求。

数据结构,直白地理解,就是研究数据的存储方式。

常见的数据结构

最常见的数据结构有数组队列链表字典树散列表(哈希表),接下来我们将逐一说明:

数组(Array)

数组是最简单、使用最频繁的一种数据结构。它一种线性表数据结构,用一组连续的内存空间来存储一组相同类型的数据。栈、队列等其他数据结构均由数组演变而来。

下图是一个包含元素(1,2,3和4)的简单数组,数组长度为4。

image-20220113145939245

如上图所示,数据是按照顺序存储在内存的连续空间内。每个数据元素都关联一个正数值,我们称之为索引,它表明数组中每个元素所在的位置。大部分语言将数组初始索引定义为零。

栈(Stack)

栈也是一种数据呈线性排列的数据结构,栈的特点先进后出、后进先出,就是常说的 LIFO(Last in First Out)。

例如:,我们想拿到桶底的东西,需要先把压在上面的东西先拿出去。

image-20220113173258400

队列(Queue)

与栈相似,队列是另一种顺序存储元素的线性数据结构。栈与队列的最大差别在于栈是 LIFO(后进先出),而队列是 FIFO(First in First Out:先进先出),即操作数据是从两端进行的。

例如:售票亭排队队伍。如果有新人加入,他需要到队尾去排队。排在前面的人会先拿到票,然后离开队伍

image-20220113174327299

链表(Linked List)

链表是另一个重要的线性数据结构,乍一看可能有点像数组,但在内存分配、内部结构以及数据插入和删除的基本操作方面均有所不同。

链表就像一个节点链,其中每个节点包含着数据和指向后续节点的指针。链表还包含一个头指针,它指向链表的第一个元素,但当列表为空时,它指向 null 或无具体内容。

image-20220113200136705

图(Graph)

图是相对复杂的一种数据结构,由顶点(Vertex)和连接每对顶点的边(Edge)所构成的图形就是图。边可以包含权重/成本,显示从顶点 x 到 y 所需的成本。

image-20220113203506881

图在存储数据上有着比较复杂和高效的算法,分别有邻接矩阵、邻接表、十字链表、邻接多重表、边集数组等存储结构。常见的图遍历算法就是广度优先搜索深度优先搜索

树(Tree)

树形结构是一种层级式的数据结构,由顶点(节点)和连接它们的边组成。树类似于图,但区分树和图的重要特征是树中不存在环路。

树形结构被广泛应用于人工智能和复杂算法,它可以提供解决问题的有效存储机制。

image-20220113205218099

树的结构特点是:

  • 每个节点有零个或多个子节点;
  • 没有父节点的节点称为根节点;
  • 每一个非根节点有且只有一个父节点;
  • 除了根节点外,每个子节点可以分为多个不相交的子子节点;

字典树(Trie)

字典树,也称为“前缀树”,是一种特殊的树状数据结构,对于解决字符串相关问题非常有效。它能够提供快速检索,主要用于搜索字典中的单词,在搜索引擎中自动提供建议,甚至被用于 IP 的路由。

以下是在字典树中存储三个单词“top”,“then”和“thus”的例子:

image-20220114164955606

这些单词以顶部到底部的方式存储,其中浅蓝色节点“p”,“n”和“s”分别表示“top”,“then”和“thus”的底部。

散列表(哈希表)

散列表又叫哈希表,存储的是由键(key)和值(value)组 成的数据,根据键直接访问存储在内存存储位置的数据结构。

哈希表通常使用数组实现。

image-20220113210452089

散列数据结构的性能取决于以下三个因素:

  • 哈希函数
  • 哈希表的大小
  • 碰撞处理方法