瑞士计算机科学家Niklaus Wirth在1976年写了一本书,名为《算法+数据结构=编程》。

40多年后,这个等式仍被奉为真理。这就是为什么在面试过程中,需要考察软件工程师对数据结构的理解。

几乎所有的问题都需要面试者对数据结构有深刻的理解。无论你是初入职场的新兵(刚从大学或者编程培训班毕业),还是拥有几十年经验的职场老鸟。

有些面试题会明确提及某种数据结构,例如,“给定一个二叉树。”而另一些则隐含在面试题中,例如,“我们希望记录每个作者相关的书籍数量。”

即便是对于一些非常基础的工作来说,学习数据结构也是必须的。那么,就让我们先从一些基本概念开始入手。

什么是数据结构?

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

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

数据是计算机科学当中最关键的实体,而数据结构则可以将数据以某种组织形式存储,因此,数据结构的价值不言而喻。

无论你以何种方式解决何种问题,你都需要处理数据——无论是涉及员工薪水、股票价格、购物清单,还是只是简单的电话簿问题。

数据需要根据不同的场景,按照特定的格式进行存储。有很多数据结构能够满足以不同格式存储数据的需求。

常见的数据结构

首先列出一些最常见的数据结构,我们将逐一说明:

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

数组

数组是最简单、也是使用最广泛的数据结构。栈、队列等其他数据结构均由数组演变而来。下图是一个包含元素(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树

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

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

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

字典树(Trie)

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

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

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

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

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

哈希表

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

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

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

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

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

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

•   在数组中查找对称键值对
•   追踪遍历的完整路径
•   查找数组是否是另一个数组的子集
•   检查给定的数组是否不相交

以上是在编程面试之前你应该知晓的八大数据结构。

来源:网络大数据

版权归原作者所有,转载仅供学习使用,不用于任何商业用途,如有侵权请留言联系删除,感谢合作。

数据与算法之美

用数据解决不可能

长按扫码关注

应对程序员面试,你必须知道的8大数据结构相关推荐

  1. 收藏 | 应对程序员面试,你必须知道的8大数据结构

    来源:大数据文摘 本文共2200字,建议阅读6分钟. 本文我们介绍了应对程序员面试过程中,必须掌握的几大数据结构. 瑞士计算机科学家Niklaus Wirth在1976年写了一本书,名为<算法+ ...

  2. 程序员们都必须知道的8种通用数据结构

    数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操作. 数据结构在计算机科学和软件工程领域具有广泛而多样的用途. 几乎所有已开发的程序或软件系统都使用数据结构. 此外, ...

  3. 应对程序员面试,你必须知道的八大数据结构

    大数据文摘出品 编译:Hope.睡不着的iris.胡笳.云舟 瑞士计算机科学家Niklaus Wirth在1976年写了一本书,名为<算法+数据结构=编程>. 40多年后,这个等式仍被奉为 ...

  4. 每个程序员都必须知道的8种数据结构

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | http://suo.im/6oo92L 快速 ...

  5. c语言闯关考试题讲解,程序员面试闯关(二):数据结构考点与细节分析

    上一篇文章程序员面试闯关(一):字符串匹配+排序+查找列举说明了各种常见的排序算法等算法基础,这里,主要分析下数据结构相关的基础和注意点. 一.线性表 1. 数组(顺序存储结构) 效率分析 查找:O( ...

  6. 嵌入式程序员面试时应该知道的16个问题

    1.预处理器(Preprocessor) 2.如何定义宏 3.预处理器标识#error的目的是什么? 4.死循环(Infinite loops) 5.数据声明(Data declarations) 6 ...

  7. 程序员必须知道的10大基础实用算法及其讲解

    2014-06-17 WEB开发者 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但 ...

  8. 《转》程序员必须知道的10大基础实用算法及其讲解

    来源: Cricode  发布时间: 2014-06-19 08:27  阅读: 2018 次  推荐: 8   原文链接   [收藏] 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算 ...

  9. 程序员必须知道的10大算法(转)

    算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通 ...

最新文章

  1. Python的输出:Python2.7和Python3.7的区别
  2. 【camera-radar】基于ROS的多传感器融合感知系统实现(雷达+相机)(1)
  3. C 语言编程 — 程序的编译流程
  4. hyperledge环境安装
  5. python 打包exe出现RuntimeError: Could not find the matplotlib data files 的解决方法
  6. Android中Service类onStartCommand
  7. 如何使用Node.js,Express和MongoDB设置GraphQL服务器
  8. Oracle中listener does not currently know of SID given in connect descriptor
  9. 滴滴试行“选择路线”功能 乘客可自主选择行驶路线
  10. ubuntu下环境变量详解 bashrc, profile, environment
  11. 编程之美 1.4买书问题常数时间空间解法
  12. CLO3D.Modelist.V2.2.134 X64 三维服装设计软件
  13. python图像平移_仿射变换——图像平移 原理讲解及python实现
  14. 高斯win和linux,微软雅黑在 win 和 Linux 下安装使用的对比
  15. 一阶微分方程组c语言编程,一阶常微分方程数值解的C语言编程实现.doc
  16. IMO 2017 T1解答
  17. Egret 使用自定义皮肤
  18. 计算机博士毕业致谢,这篇博士论文《致谢》刷屏,句句扎心……
  19. 华为杯数学建模2020获奖名单_2020建模国赛获奖名单公布!你上榜了吗?
  20. Linux matlab mysql,在linux系统里面安装matlab运行环境mcr

热门文章

  1. .NET CORE(C#) WPF 值得推荐的动画菜单设计
  2. net下的高性能轻量化半自动orm+linq的《SqlBatis》
  3. EF Core 3 的 40 个中断性变更
  4. EF Core下利用Mysql进行数据存储在并发访问下的数据同步问题
  5. Unity3damp;amp;C#分布式游戏服务器ET框架介绍-组件式设计
  6. .NET平台微服务项目汇集
  7. C#连接Excel和Access(包括2003和2007版)方法总结
  8. Flutter之Decoration
  9. Andorid之jni里面崩溃然后用errno分析结果解决问题
  10. linux c之使用#define定义多行函数总结