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

640?wx_fmt=gif


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

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

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

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

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

什么是数据结构?


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

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


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

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

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

常见的数据结构


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

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

数组


数组是最简单、也是使用最广泛的数据结构。栈、队列等其他数据结构均由数组演变而来。下图是一个包含元素(1,2,3和4)的简单数组,数组长度为4。


640?wx_fmt=png


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

  • 以下是数组的两种类型:

•   一维数组(如上所示)
•   多维数组(数组的数组)

  • 数组的基本操作

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

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

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


著名的撤销操作几乎遍布任意一个应用。但你有没有思考过它是如何工作的呢?这个问题的解决思路是按照将最后的状态排列在先的顺序,在内存中存储历史工作状态(当然,它会受限于一定的数量)。这没办法用数组实现。但有了栈,这就变得非常方便了。

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

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


640?wx_fmt=png


  • 栈的基本操作

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

  • 面试中关于栈的常见问题

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

队列


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

一个完美的队列现实例子:售票亭排队队伍。如果有新人加入,他需要到队尾去排队,而非队首——排在前面的人会先拿到票,然后离开队伍。

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


640?wx_fmt=png


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

  • 队列的基本操作

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

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

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

链表


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

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

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

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

640?wx_fmt=png


  • 链表包括以下类型:

•   单链表(单向)
•   双向链表(双向)

  • 链表的基本操作:

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

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

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


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


640?wx_fmt=png


  • 图的类型

•   无向图
•   有向图

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

•   邻接矩阵
•   邻接表

  • 常见图遍历算法

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

  • 面试中关于图的常见问题

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


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

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

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


640?wx_fmt=jpeg


•   Root - 根节点
•   Parent - 父节点
•   Child - 子节点
•   Leaf - 叶子节点
•  Sibling - 兄弟节点

  • 以下是树形结构的主要类型:

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

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

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

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

字典树(Trie)


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

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


640?wx_fmt=jpeg


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

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

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

哈希表


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

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

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

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

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


640?wx_fmt=jpeg


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

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

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


来源:网络大数据

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


数据与算法之美

用数据解决不可能


640?wx_fmt=jpeg

长按扫码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows Phone 知识锦(12月版)

很久没有更新Windows Phone 知识锦了,今天更新一下:将不同分类的文章进行归类,方便大家查看。 相信大家都喜欢jeffblankenburg的windows phone 31日开放谈吧,之前金山将它反映为中文了。如今他有退出了Mango版的31日开发谈&#…

自由、开源及其敌人 —— RMS事件簿

点击上方“开源社”关注我们| 作者:庄表伟| 编辑:沈于蓝| 设计:朱亿钦目前国际开源界和一些开源软件基金会对于道德和平权的争论正方兴未艾,我们觉得值得关注与了解。前置申明这是一篇严肃的八卦文,希望搞清楚一些社区…

Google 机器学习应用的43条经验法则

Google 的研究科学家 Martin Zinkevich 曾在 NIPS 2016 Workshop 分享了谷歌机器学习实践的四十三条法则。Martin Zinkevich 也在自己的博客上分享了这四十三条经验法则。文章《Rules of Machine Learning: Best Practices for ML Engineering》旨在帮助具备机器学习基础知识的…

lua虚拟机字节码修改_Java虚拟机(JVM)面试题大集合

本文整理自:ThinkWon 链接:blog.csdn.net/ThinkWon/article/details/104390752本文知识目录1、Java内存区域说一下 JVM 的主要组成部分及其作用?说一下 JVM 运行时数据区深拷贝和浅拷贝说一下堆栈的区别?队列和栈是什么&#xff…

SQL Server CDC配合Kafka Connect监听数据变化

写在前面好久没更新Blog了,从CRUD Boy转型大数据开发,拉宽了不少的知识面,从今年年初开始筹备、组建、招兵买马,到现在稳定开搞中,期间踏过无数的火坑,也许除了这篇还很写上三四篇。进入主题,通…

惊喜开学季,教你如何在人工智能时代站稳脚跟!

暑假咻地一下过完啦,前几天,小天介绍了关于数模课程的开学季限时优惠(传送门),今天要介绍的是python课程。接下来,小天来详细说明一下!领取方式:公众号后台对话框回复“人工智能”免…

矢量合成和分解的法则_力的合成与分解专题解析,寒假复习!

合力与分力如果几个力共同作用在物体上产生的效果与一个力单独作用在物体上产生的效果相同,则把这个力叫做这几个力的合力,而那几个力叫做这一个力的分力。合力与分力的关系是等效替代关系,即一个力若分解为两个分力,在分析和计算…

.NET WebSocket 核心原理初体验

上个月我写了《.NET gRPC核心功能初体验》, 里面使用gRPC双向流做了一个打乒乓球的Demo, [实时][双向]这两个标签是不是很熟悉,对, WebSockets也可以做实时双向通信。本文将利用WebSockets(SignalR的一部分)搭建一个可双向通信的A…

CvBlobDetector 新目标检测算法简析

CvBlobDetector用于检测和判定当前帧中的Blob是否是新产生的目标,方法如下:

原来这些流弊的老板,曾经还是牛逼的程序猿!

“生活就像巧克力,你永远不知道下一颗是什么味道”,这句话用在互联网最适合不过,互联网从人类里面创造了一批神,说起他们的名字无人不知,但是你可知道这些神曾经也只是一个名不见经传的程序员。一起来看看他们是怎么一…

phpstormp新建PHP保存在哪里_记一次windows配置PHP环境

前言因为疫情原因一直不能回学校,电脑还在学校宿舍,所以在笔记本上搭建PHP环境,总不能在家混吃等死吧。正文【0】安装Apache2.40-0:Apache的下载链接The Apache HTTP Server Project0-1:点击a number of third party vendors下载window版本0-…

通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务...

我个人认为Actor应该是Dapr里比较重头的部分也是Dapr一直在讲的所谓“stateful applications”真正具体的一个实现(个人认为),上一章讲到有状态服务可能很多同学看到后的第一反应是“不就是个分布式缓存吗”。那今天就讲讲Actor,看看这个东西…

想转行人工智能?哈佛博士后有话说!

从17年开始,各大高校的数据科学与大数据技术专业持续火爆,2018年,北京大学、西安交通大学等高校更在本科阶段设立人工智能一级学科,中国顶尖人才的流向在悄然改变……据目前最新的数据显示,AI行业开发人员的月薪基本上…

转载标明出处用英语_英语原版阅读:At the beach

今天分享一篇阅读理解。可以学完一般现在时后进行同步阅读,也可以作为日常的阅读材料。每日10分钟英语阅读,养成习惯,孩子的英语学习不用愁。这篇文章的题目是At the beach图片来源于网络先来读文章:图片来源于网络1.In summer I …

12 月份 10 个新鲜的 jQuery 插件和教程

1. MASHA (Mark & Share) MASHA (Mark & Share 的缩写) 是一个可以让你分享网页部分内容的 JavaScript 库。 2. JScraft scroller 通过点击某个图片,该图将移到网页中央,其他相应的图片进行位置滑动。在线演示:here. 3. Windows-like…

大数据时代,如何才能提高自身竞争力?

暑假咻地一下过完啦,前几天,小天介绍了关于数模课程的开学季限时优惠(传送门),今天要介绍的是python课程。接下来,小天来详细说明一下!领取方式:公众号后台对话框回复“人工智能”免…

从容器到容器云,什么才是Kubernetes的本质?

这两年,Kubernetes 击败了 Swarm 和 Mesos,几乎成为容器编排的事实标准,BAT、滴滴、京东、头条等大厂,都争相把容器和 K8S 项目作为技术重心,试图“放长线钓大鱼”。就说阿里吧,目前基本所有业务都跑在云上…

Java 的日子屈指可数,这是真的吗?

斯坦福大学的计算机科学入门课采用JavaScript,摈弃Java,但是它的基数很大。年4月初,斯坦福大学开始试推行计算机科学入门课CS 106A的新版本。这个名为CS 106J的新版本用JavaScript来教,而不是用Java来教。斯坦福大学的官方网站解释…

5gh掌上云计算认证不通过_【众志成城战疫情】法官助理告诉你“移动微法院”、“掌上法庭”有多便捷、有多硬核~!...

今天中午,小编收到了一篇来自普定法院白岩法庭法官助理的投稿,她一方面告知小编白岩法庭今天上午通过微法院“掌上法庭”成功审理了一起买卖合同纠纷案纷,一方面强烈给小编安利了这个小程序,并且要求在本文结尾附上微法院的操作手…

“杀”一个程序员不需要用枪,改三次需求就可以了!

在很多软件公司,特别是一些创业型的团队中,对于这样的情景可能大家都很熟悉:项目经理或者产品经理(产品狗)口头或者简单记录一下软件产品的大致要做的功能,直接就让研发团队的兄弟(程序猿&#…