0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

编程面试之前你应该知晓的八大数据结构

算法与数据结构 来源:未知 作者:李倩 2018-08-30 11:55 次阅读

瑞士计算机科学家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)”)中的过程。因此,对象以键值对的形式存储,这些键值对的集合被称为“字典”。可以使用键搜索每个对象。基于哈希法有很多不同的数据结构,但最常用的数据结构是哈希表。

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

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

哈希函数

哈希表的大小

碰撞处理方法

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

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

在数组中查找对称键值对

追踪遍历的完整路径

查找数组是否是另一个数组的子集

检查给定的数组是否不相交

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据结构
    +关注

    关注

    3

    文章

    573

    浏览量

    40088
  • 存储数据
    +关注

    关注

    0

    文章

    85

    浏览量

    14092

原文标题:应对程序员面试,你必须知道的八大数据结构

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    大话数据结构pdf下载

    大话数据结构是一本很值得初学者看的编程书籍,用简单的语言然人深刻的理解数据结构,强烈程序员推荐下载收藏,下面是部分内容预览: 完整的pdf格式电子书下载: 《大话数据结构》.pdf
    发表于 07-04 00:33

    收藏 | 程序员面试必须知道的8大数据结构

    哈希结构的常见问题:在数组中查找对称键值对追踪遍历的完整路径查找数组是否是另一个数组的子集检查给定的数组是否不相交以上是在编程面试之前
    发表于 09-30 09:35

    数据结构的几个重要知识点

    。如果从事编程的工作,不管你现在是不是需要用到数据结构的相关知识,在工作的过程中理解、掌握好数据结构,对现在的工作和以后的发展都是有帮助的。
    发表于 02-27 15:01

    常见的数据结构

    顺序表结构的底层实现借助的就是数组,因此对于初学者来说,可以把顺序表完全等价为数组,但实则不是这样。数据结构是研究数据存储方式的一门学科,它囊括的都是各种存储结构,而数组只是各种
    发表于 05-10 07:58

    C语言与数据结构

    目录个人介绍笔试单选题C语言数据结构计算机与操作系统网络通信填空题C语言与数据结构网络通信问答题嵌入式基础知识C语言与数据结构C编程一面二面功能快捷键合理的创建标题,有助于目录的生成如
    发表于 08-06 07:10

    数据结构教程,下载

    1. 数据结构的基本概念 2. 算法与数据结构3. C语言的数据类型及其算法描述要点4. 学习算法与数据结构的意义与方法
    发表于 05-14 17:22 0次下载
    <b class='flag-5'>数据结构</b>教程,下载

    数据结构在游戏编写中的应用

    在游戏的编写中,不可避免的出现很多应用数据结构的地方,有些简单的游戏,只是由几个 数据结构 的组合,所以说,数据结构在游戏编程中扮演着很重要的角色。 本文主要讲述
    发表于 07-25 16:26 0次下载

    数据结构是什么_数据结构有什么用

    数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高
    发表于 11-17 14:45 1.6w次阅读
    <b class='flag-5'>数据结构</b>是什么_<b class='flag-5'>数据结构</b>有什么用

    数据结构常见的八大排序算法

    本文总结了数据结构常见的八大排序算法。详细分析请看下文
    发表于 02-05 15:26 1824次阅读
    <b class='flag-5'>数据结构</b>常见的<b class='flag-5'>八大</b>排序算法

    什么是数据结构?为什么要学习数据结构数据结构的应用实例分析

    本文档的主要内容详细介绍的是什么是数据结构?为什么要学习数据结构数据结构的应用实例分析包括了:数据结构在串口通信当中的应用,数据结构在按键
    发表于 09-26 15:45 14次下载
    什么是<b class='flag-5'>数据结构</b>?为什么要学习<b class='flag-5'>数据结构</b>?<b class='flag-5'>数据结构</b>的应用实例分析

    java常见数据结构面试

    Java面试过程中,经常会被问到数据结构和算法相关的知识。对于工作多年的程序员来说,这些理论的知识可能已经忘得差不多了吧,所以面试前还是有必要临时抱抱佛脚的。
    的头像 发表于 08-15 16:09 9967次阅读
    java常见<b class='flag-5'>数据结构</b><b class='flag-5'>面试</b>

    数据结构的存储方式及基本操作

    首先,这里讲的都是普通的数据结构和算法,咱不是搞竞赛的,野路子出生,只解决常规的问题,以面试为最终目标。另外,以下是我个人的经验的总结,没有哪本算法书会写这些东西,所以请读者试着理解我的角度,别纠结于细节问题,因为这篇文章就是对数据结构
    的头像 发表于 04-19 10:47 1334次阅读
    <b class='flag-5'>数据结构</b>的存储方式及基本操作

    数据结构解决滑动窗口问题

    前文用 [单调栈解决三道算法问题]介绍了单调栈这种特殊数据结构,本文写一个类似的数据结构「单调队列」。 也许这种数据结构的名字没听过,其实没啥难的,就是一个「队列」,只是使用了一点
    的头像 发表于 04-19 10:50 631次阅读
    <b class='flag-5'>数据结构</b>解决滑动窗口问题

    epoll的基础数据结构

    一、epoll的基础数据结构 在开始研究源代码之前,我们先看一下 epoll 中使用的数据结构,分别是 eventpoll、epitem 和 eppoll_entry。 1、eventpoll 我们
    的头像 发表于 11-10 10:20 762次阅读
    epoll的基础<b class='flag-5'>数据结构</b>

    探索编程世界的七大数据结构

    结构就像是一颗倒挂的小树,有根、有枝、有叶。它是一种非线性的数据结构,以层级的方式存储数据,顶部是根节点,底部是叶节点。
    的头像 发表于 04-16 12:04 355次阅读