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

2023-10-26

大数据文摘出品

编译:Hope、睡不着的iris、胡笳、云舟

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

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

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

  • 哈希函数

  • 哈希表的大小

  • 碰撞处理方法

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

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

  • 在数组中查找对称键值对

  • 追踪遍历的完整路径

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

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

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

END

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。


如果你觉得文章不错,文末的赞 ???? 又回来啦,记得给我「点赞」和「在看」哦~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

应对程序员面试,你必须知道的八大数据结构 的相关文章

随机推荐

  • glsl vscode写_学会用好 Visual Studio Code

    Visual Studio Code是个牛逼的编辑器 启动非常快 完全可以用来代替其他文本文件编辑工具 又可以用来做开发 支持各种语言 相比其他IDE 轻量级完全可配置还集成Git感觉非常的适合前端开发 是微软亲生的想必TypeScript
  • 13个超强的 SpringBoot 实战项目 (还不赶紧收藏起来)

    在GItHub和Gitee上找了一些超好的Spring boot项目 如果大家觉得不错 可以顺手给这些项目点个小星星 一 云收藏 云收藏是一个使用 Spring Boot 构建的开源网站 可以让用户在线随时随地收藏的一个网站 在网站上分类整
  • java使用WebSocket实现一对一实时对话

    最近的项目中有实时对话的需求 这里也是查阅了很多的资料 使用webSocket实现一对一对话是最多的 链接 https pan baidu com s 1Vn1e1qw7nRnU1 4R 4fcGg 提取码 qwer 逻辑讲解 现在我们要给
  • Linux下protobuf的简单使用

    1 创建proto文件 touch test proto 2 往proto文件添加内容 syntax proto3 message Person string name 1 int32 age 18 第一行表示使用proto3语法进行编译
  • 【CUDA入门笔记】CUDA内核与线程配置

    1 CUDA核函数 在GPU上调用的函数成为CUDA核函数 Kernel function 核函数会被GPU上的多个线程执行 每个线程都会执行核函数里的代码 当然由于线程编号的不同 执行的代码路径可能会有所不同 1 函数的最前面是声明标识符
  • Qt进程和线程之一:运行一个进程和进程间通信

    Qt提供了一个与平台无关的QProcess类 用以对进程的支持 本节讲述了怎样在Qt应用程序中启动一个外部程序进程 以及几种常用的进程间通信方法 设计应用程序时 有时不希望将一个不太相关的功能集成到程序中 或者是因为该功能与当前设计的应用程
  • pinia简介和setup语法糖

    pinia简介和setup语法糖 1 pinia的基本特点 pinia同样是一个Vue 状态管理工具 它和vuex有很多相似的地方 本质上他是vuex团队核心成员开发的 在vuex上面提出了一些改进 与vuex相比 pinia去除了vuex
  • Linux的Shell变量、环境变量、代理设置

    Linux的Shell变量 环境变量 代理设置 引言 一 shell与shell变量 环境变量 1 1 概念 1 2 作用域 1 3 SSH 连接 Linux 服务器的环境变量处理流程 1 4 环境变量文件 二 变量增删改查 2 1 查看变
  • 金融tag对照表

    tag 说明 格式 长度 值 描述 4F 应用标识符 AID b 注册应用提供商标识 RID 和专用标识符扩展 A000000333010101A000000333确定UICS注册应用提供商 所有的卡片都一样 010101表明UICS借记应
  • Axios post请求

    1 常见post请求种类 1 form表单提交 method post 是同步的 要素 页面是否刷新 2 axios post 异步操作 1 1axios post请求入门案例 1 1 1编辑前端JS h1 Axios测试案例 2 h1
  • MySQL——使用mysqldump命令备份

    使用mysqldump命令备份 mysqldump命令可以将数据库中的数据备份成一个文本文件 表的结构和表中的数据将存储在生成的文本文件中 本节将介绍mysqldump命令的工作原理和使用方法 mysqldump命令的工作原理很简单 它先查
  • java基础面试题系列(81-90)

    请你说明ConcurrentHashMap有什么优势 1 7和1 8有什么区别 参考链接 https www cnblogs com like minded p 6805301 html 请你说明一下TreeMap的底层结构 TreeMap
  • 第十篇 -- Windows 下免费的GIF录制工具

    网址 https blog csdn net u013019701 article details 80550411 本人用的第二个 亲测好用 转载于 https www cnblogs com smart zihan p 11461101
  • [CISCN2019 华北赛区 Day2 Web1]Hack World

    1 测试过滤 我想到到了 联合注入 unin被过滤 报错注入 and or updatexml被过滤 bool注入和time注入 and or被过滤 可以通过fuzz测试 模糊测试 发现哪些字符被过滤了 length为482的 全都是被过滤
  • LLVM编译流程

    LLVM概述 LLVM是构架编译器 compliter 的框架系统 以C 编写而成 用于优化以任意程序语言编写的程序的便是时间 compile time 链接时间 link time 运行时间 run time 以及空闲时间 idle ti
  • 网络编程--TCP/IP协议

    参考 https lijie blog csdn net article details 105297532 https blog csdn net qq 20785973 article details 83104695 https bl
  • 华为OD机试 - 分苹果(Python)

    题目描述 A B两个人把苹果分为两堆 A希望按照他的计算规则等分苹果 他的计算规则是按照二进制加法计算 并且不计算进位 12 5 9 1100 0101 9 B的计算规则是十进制加法 包括正常进位 B希望在满足A的情况下获取苹果重量最多 输
  • JJWT三种算法的工具类实现

    前言 最近学习jwt生成token 一直各种报错 不知道怎么生成对应的秘钥 周末研究了一下 把jjwt的HMAC RSA ECDSA三种签名算法方式都实现了 并记录下来 依赖版本如下
  • 波场链通过Tron JS SDK TronWeb发送带备注的TRC - 20 转账及使用简介

    波场链通过tronWeb发送带备注的TRC 20 转账 var contractAddress TRC 20 合约 选择合约 法 let functionSelector transfer address uint256 根据 法构造参数
  • 应对程序员面试,你必须知道的八大数据结构

    大数据文摘出品 编译 Hope 睡不着的iris 胡笳 云舟 瑞士计算机科学家Niklaus Wirth在1976年写了一本书 名为 算法 数据结构 编程 40多年后 这个等式仍被奉为真理 这就是为什么在面试过程中 需要考察软件工程师对数据