数据结构概述

算法 + 数据结构 = 编程

什么是数据结构?

通俗的来说,数据结构是计算机存储、组织数据的方式。

常用的数据机构有:

  • 数组
  • 队列
  • 链表
  • 字典树(这是一种高效的树形结构,但值得单独说明)
  • 散列表(哈希表)

数组

数组是最简单、也是使用最广泛的数据结构。栈、队列等其他数据结构均是由数组演变过来的。

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

数组

每个数据元素都关联一个正数值,我们称之为索引,它表明数组中每个元素所在的位置。大部分语言将初始索引定义为零。

数组的两种类型:

  • 一维数组
  • 多维数组

数组的基本操作

  • Insert——在指定索引位置插入一个元素
  • Get——返回指定索引位置的元素
  • Delete——删除指定索引位置的元素
  • Size——得到数组所有元素的数量

面试中关于数组的常见问题

  • 寻找数组中第二小的元素
  • 找到数组中第一个不重复出现的整数
  • 合并两个有序数组
  • 重新排列数组中的正值和负值

著名的撤销操作几乎遍布任意一个应用。但是你有没有想过他是如何实现的?这个问题的解决思路是按照将最后的状态排列在前的顺序,在内存中存储历史工作状态。这没办法用数组实现,但是有了栈,这就变得很方便了。

可以把栈想象成一摞书,为了拿到中间的书,你需要移除放置在这上面的所有书。这就是LIFO(后进先出)的工作原理。

下图是包含三个数据元素(1、2、3)的栈,其中顶部的3将被最先移除:

栈

栈的基本操作

  • Push——在顶部插入一个元素
  • Pop——返回并移除栈顶元素
  • isEmpty——如果栈为空,则返回true
  • Top——返回顶部元素,但并不移除它

面试中关于栈的常见问题

  • 使用栈计算后缀表达式
  • 对栈的元素进行排序
  • 判断表达式是否括号平衡

队列

与栈类似,队列是另一种顺序存储元素的线性数据结构。栈与队列的最大差别在于栈是LIFO(后进先出),而队列是FIFO(先进先出)

常见的队列:排队上车,如果有新人加入,他需要到队尾排队,而非队首。排在前面的人会先上车,然后离开队伍。

下图是包含四个元素(1,2,3,4)的队列,其中在顶部的1将被最先移除:

队列

移除先入队的元素、插入新元素

队列的基本操作

  • Enqueue() —— 在队列尾部插入元素
  • Dequeue() ——移除队列头部的元素
  • isEmpty()——如果队列为空,则返回true
  • Top() ——返回队列的第一个元素

面试中关于队列的常见问题

  • 使用队列表示栈
  • 对队列的前k个元素倒序
  • 使用队列生成从1到n的二进制数

链表

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

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

链表一般用于实现文件系统、哈希表和邻接表。

这是链表内部结构的展示:

链表

链表包括以下类型:

  • 单链表
  • 双向链表

链表的基本操作:

  • InsertAtEnd - 在链表的末尾插入指定元素
  • InsertAtHead - 在链接列表的开头/头部插入指定元素
  • Delete  - 从链接列表中删除指定元素
  • DeleteAtHead - 删除链接列表的第一个元素
  • Search  - 从链表中返回指定元素
  • isEmpty - 如果链表为空,则返回true

面试中关于链表的常见问题

  • 反转链表
  • 检测链表中的循环
  • 返回链表倒数第N个节点
  • 删除链表中的重复项

图是一组以网络形式相互连接的节点,节点也称为顶点。一对节点(x,y)称为边(edge),表示顶点x连接到顶点y。边可以包含权重/成本,显示从顶点x到y所需的成本。

图

图的类型

  • 无向图
  • 有向图

在程序语言中,图可以用两种形式表示

  • 邻接矩阵
  • 邻接表

常见的图遍历算法

  • 广度优先搜索
  • 深度优先搜索

面试中关于图的常见问题

  • 实现广度和深度优先搜索
  • 检查图是否为树
  • 计算图的边数
  • 找到两个顶点之间的最短路径

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

这是一个简单树的示意图,以及树数据结构中使用的基本术语:

树

Root - 根节点

Parent - 父节点

Child - 子节点

Leaf - 叶子节点

Sibling - 兄弟节点

树形结构的主要类型

  • N元树
  • 平衡树
  • 二叉树
  • 二叉搜索树
  • AVL树
  • 红黑树
  • 2-3树
  • B 树
  • B+ 树

其中,二叉树和二叉搜索树是最常用的树。

面试中关于树结构的常见问题

  • 求二叉树的高度
  • 在二叉搜索树中查找第k个最大值
  • 查找与根节点距离k的节点
  • 在二叉树中查找给定节点的祖先节点

字典树

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

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

字典树

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

面试中关于字典树的常见问题

  • 计算字典树中的总单词数
  • 打印存储在字典树中的所有单词
  • 使用字典树对数组的元素进行排序
  • 使用字典树从字典中形成单词
  • 构建T9字典(字典树+ DFS )

哈希表

哈希法(Hashing)是一个用于唯一标识对象并将每个对象存储在一些预先计算的唯一索引(称为“键key”)中的过程。因此,对象以键值对的形式存储,这些键值对集合被称为“字典”。可以使用键搜索每个对象。基于哈希法有很多不同的数据结构,但最常用的数据结构是哈希表。

哈希表通常用数组实现。

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

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

下图为如何在数组中映射哈希键值对的说明。该数组的索引是通过哈希函数计算的。

哈希表

面试中关于哈希结构的常见问题:

  • 在数组中查找对称键值对
  • 追踪遍历的完整路径
  • 查找数组是否是另一个数组的子集
  • 检查给定的数组是否不相交
-------------本文结束感谢您的阅读-------------

本文标题:数据结构概述

文章作者:Cui Zhe

发布时间:2018年10月14日 - 11:10

最后更新:2018年10月21日 - 10:10

原始链接:https://cuizhe1023.github.io/2018/10/14/数据结构概述/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。