1976年,一个瑞士计算机科学家写一本书《Algorithms + Data Structures = Programs》。即:算法 + 数据结构 = 程序。40多年过去了,这个等式依然成立。

很多代码面试题都要求候选者深入理解数据结构,不管你来自大学计算机专业还是编程培训机构,也不管你有多少年编程经验。有时面试题会直接提到数据结构,比如“给我实现一个二叉树”,然而有时则不那么明显,比如“统计一下每个作者写的书的数量”。

什么是数据结构?

数据结构是计算机存储、组织数据的方式。对于特定的数据结构(比如数组),有些操作效率很高(读某个数组元素),有些操作的效率很低(删除某个数组元素)。程序员的目标是为当前的问题选择最优的数据结构。

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

数据是程序的核心要素,因此数据结构的价值不言而喻。无论你在写什么程序,你都需要与数据打交道,比如员工工资、股票价格、杂货清单或者电话本。在不同场景下,数据需要以特定的方式存储,我们有不同的数据结构可以满足我们的需求。

8种常用数据结构

  1. 数组
  2. 队列
  3. 链表
  4. 前缀树
  5. 哈希表

1. 数组

数组(Array)大概是最简单,也是最常用的数据结构了。其他数据结构,比如栈和队列都是由数组衍生出来的。

下图展示了1个数组,它有4个元素:

每一个数组元素的位置由数字编号,称为下标或者索引(index)。大多数编程语言的数组第一个元素的下标是0。

根据维度区分,有2种不同的数组:

  • 一维数组(如上图所示)
  • 多维数组(数组的元素为数组)

数组的基本操作

  • Insert - 在某个索引处插入元素
  • Get - 读取某个索引处的元素
  • Delete - 删除某个索引处的元素
  • Size - 获取数组的长度

常见数组代码面试题

  • 查找数组中第二小的元素
  • 查找第一个没有重复的数组元素
  • 合并2个排序好的数组
  • 重新排列数组中的正数和负数

2. 栈

撤回,即Ctrl+Z,是我们最常见的操作之一,大多数应用都会支持这个功能。你知道它是怎么实现的吗?答案是这样的:把之前的应用状态(限制个数)保存到内存中,最近的状态放到第一个。这时,我们需要栈(stack)来实现这个功能。

栈中的元素采用LIFO (Last In First Out),即后进先出

下图的栈有3个元素,3在最上面,因此它会被第一个移除:

栈的基本操作

  • Push — 在栈的最上方插入元素
  • Pop — 返回栈最上方的元素,并将其删除
  • isEmpty — 查询栈是否为空
  • Top — 返回栈最上方的元素,并不删除

常见的栈代码面试题

  • 使用栈计算后缀表达式
  • 使用栈为栈中的元素排序
  • 检查字符串中的括号是否匹配正确
内存中的堆栈和数据结构堆栈不是一个概念,可以说内存中的堆栈是真实存在的物理区,数据结构中的堆栈是抽象的数据存储结构。
1.内存中的堆栈1)寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2)栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。) 3)堆:存放所有new出来的对象。 4)静态域:存放静态成员(static定义的) 5)常量池:存放字符串常量和基本类型常量(public static final)。 6)非RAM存储:硬盘等永久存储空间
内存空间在逻辑上分为三部分:代码区、静态数据区和动态数据区,动态数据区又分为栈区和堆区。
代码区:存储方法体的二进制代码。高级调度(作业调度)、中级调度(内存调度)、低级调度(进程调度)控制代码区执行代码的切换。
静态数据区:存储全局变量、静态变量、常量,常量包括final修饰的常量和String常量。系统自动分配和回收。
栈区:存储运行方法的形参、局部变量、返回值。由系统自动分配和回收。
例如 int method(int a){int b;}栈中存储参数a、局部变量b、返回值temp。
堆区:new一个对象的引用或地址存储在栈区,指向该对象存储在堆区中的真实数据。由程序员分配和回收(Java中由JVM虚拟机的垃圾回收机制自动回收)。
例如 Class Student{int num; int age;} main方法中Student stu = new Student();分配堆区空间中存储的该对象的num、age,变量stu存储在栈中,里面的值是对应堆区空间的引用或地址。2.数据结构中的堆栈
栈:是一种连续存储的数据结构,特点是存储的数据先进后出。
堆:是一棵完全二叉树结构,特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。

3. 队列

队列(Queue)与栈类似,都是采用线性结构存储数据。它们的区别在于,栈采用LIFO方式,而队列采用先进先出,即FIFO(First in First Out)

下图展示了一个队列,1是最上面的元素,它会被第一个移除:

队列的基本操作

  • Enqueue — 在队列末尾插入元素
  • Dequeue — 将队列第一个元素删除
  • isEmpty — 查询队列是否为空
  • Top — 返回队列的第一个元素

常见的队列代码面试题

  • 使用队列实现栈
  • 倒转队列的前K个元素
  • 使用队列将1到n转换为二进制

4. 链表

链表(Linked List)也是线性结构,它与数组看起来非常像,但是它们的内存分配方式、内部结构和插入删除操作方式都不一样。

链表是一系列节点组成的链,每一个节点保存了数据以及指向下一个节点的指针。链表头指针指向第一个节点,如果链表为空,则头指针为空或者为null。

链表可以用来实现文件系统、哈希表和邻接表。

下图展示了一个链表,它有3个节点:

链表分为2种:

  • 单向链表
  • 双向链表

链表的基本操作

  • InsertAtEnd — 在链表结尾插入元素
  • InsertAtHead — 在链表开头插入元素
  • Delete — 删除链表的指定元素
  • DeleteAtHead — 删除链表第一个元素
  • Search — 在链表中查询指定元素
  • isEmpty — 查询链表是否为空

常见的队列代码面试题

  • 倒转1个链表
  • 检查链表中是否存在循环
  • 返回链表倒数第N个元素
  • 移除链表中的重复元素

5. 图

图(graph)由多个节点(vertex)构成,节点之间阔以互相连接组成一个网络。(x, y)表示一条边(edge),它表示节点x与y相连。边可能会有权值(weight/cost)

图分为两种:

  • 无向图
  • 有向图

在编程语言中,图有可能有以下两种形式表示:

  • 邻接矩阵(Adjacency Matrix)
  • 邻接表(Adjacency List)

遍历图有两周算法

  • 广度优先搜索(Breadth First Search)
  • 深度优先搜索(Depth First Search)

常见的图代码面试题

  • 实现广度优先搜索
  • 实现深度优先搜索
  • 检查图是否为树
  • 统计图中边的个数
  • 使用Dijkstra算法查找两个节点之间的最短距离

6. 树

树(Tree)是一个分层的数据结构,由节点和连接节点的边组成。树是一种特殊的图,它与图最大的区别是没有循环。

树被广泛应用在人工智能和一些复杂算法中,用来提供高效的存储结构。

下图是一个简单的树以及与树相关的术语:

树有很多分类:

  • N叉树(N-ary Tree)
  • 平衡树(Balanced Tree)
  • 二叉树(Binary Tree)
  • 二叉查找树(Binary Search Tree)
  • 平衡二叉树(AVL Tree)
  • 红黑树(Red Black Tree)
  • 2-3树(2–3 Tree)

其中,二叉树和二叉查找树是最常用的树。

常见的树代码面试题

  • 计算树的高度
  • 查找二叉平衡树中第K大的元素
  • 查找树中与根节点距离为k的节点
  • 查找二叉树中某个节点所有祖先节点

7. 前缀树

前缀树(Prefix Trees或者Trie)与树类似,用于处理字符串相关的问题时非常高效。它可以实现快速检索,常用于字典中的单词查询,搜索引擎的自动补全甚至IP路由。

下图展示了“top”, “thus”和“their”三个单词在前缀树中如何存储的:

单词是按照字母从上往下存储,“p”, “s”和“r”节点分别表示“top”, “thus”和“their”的单词结尾。

常见的树代码面试题

  • 统计前缀树表示的单词个数
  • 使用前缀树为字符串数组排序

8. 哈希表

哈希(Hash)将某个对象变换为唯一标识符,该标识符通常用一个短的随机字母和数字组成的字符串来代表。哈希可以用来实现各种数据结构,其中最常用的就是哈希表(hash table)

哈希表通常由数组实现。

哈希表的性能取决于3个指标:

  • 哈希函数
  • 哈希表的大小
  • 哈希冲突处理方式

下图展示了有数组实现的哈希表,数组的下标即为哈希值,由哈希函数计算,作为哈希表的键(key),而数组中保存的数据即为值(value)

常见的哈希表代码面试题

  • 查找数组中对称的组合
  • 确认某个数组的元素是否为另一个数组元素的子集
  • 确认给定的数组是否互斥

参考

  • Fundebug博客 - Node.js面试题之2017
  • Fundebug博客 - 快速掌握JavaScript面试基础知识(一)
  • Fundebug博客 - 快速掌握JavaScript面试基础知识(二)
  • Fundebug博客 - 快速掌握JavaScript面试基础知识(三)
  • GeeksforGeeks

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了9亿+错误事件,得到了Google、360、金山软件等众多知名用户的认可。欢迎免费试用!

版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/08/27/code-interview-data-structure/

面试-8种 常用数据结构总结相关推荐

  1. java 中几种常用数据结构

    原文地址:http://blog.csdn.net/u010947402/article/details/51878166 JAVA中常用的数据结构(java.util. 中) Java中有几种常用的 ...

  2. redis的五种常用数据结构、Pub/Sub数据结构、Stream数据结构

    目录 Redis五种数据结构如下: 1.String 字符串类型 Redis 字符串命令 实战场景: 2.Hash (哈希) Redis hash 命令 实战场景: 3.链表 list Redis 列 ...

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

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

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

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操作.数据结构在计 ...

  5. 二叉树的字符图形显示程序_每个程序员都必须知道的8种通用数据结构

    作者:IT-Evan https://www.cnblogs.com/IT-Evan/p/12444968.html 数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操 ...

  6. 精确的数据访问冲突_每个程序员都必须知道的8种通用数据结构

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

  7. 【python基础】--常用数据结构

    list tuple dict set四种常用数据结构 list list 有序的集合,可以随时添加.删除其中元素值; 支持list嵌套模式, >>> p = ['a','b']&g ...

  8. 面试常考的常用数据结构与算法

    面试常考的常用数据结构与算法 数据结构与算法,这个部分的内容其实是十分的庞大,要想都覆盖到不太容易.在校学习阶段我们可能需要对每种结构,每种算法都学习,但是找工作笔试或者面试的时候,要在很短的时间内考 ...

  9. java set第n位_数据结构与算法——常用数据结构及其Java实现

    本文采用Java语言来进行描述,帮大家好好梳理一下数据结构与算法,在工作和面试中用的上.亦即总结常见的的数据结构,以及在Java中相应的实现方法,务求理论与实践一步总结到位. 常用数据结构 数组 数组 ...

  10. long 转为string_面试必问 Redis数据结构底层原理String、List篇

    点击关注上方"Java大厂面试官",第一时间送达技术干货. 阅读文本大概需要 8 分钟. 前言 今天来整理学习下Redis有哪些常用数据结构,都是怎么使用的呢?首先看下全局存储结构 ...

最新文章

  1. 12 Java程序员面试宝典视频课程之面向对象
  2. 协方差中的正相关与负相关 指的是线性代数中的线性相关
  3. 基于大规模结构化病例数据的新型冠状病毒传播特征和感染人群分析
  4. 用 php写的条件语句-三种条件语句
  5. python计算圆面积保留两位数_python中怎么实现保留两位小数
  6. 关于注册登陆时候进行的归档解档--严焕培
  7. linux之cat命令详解
  8. leetcode 740. 删除并获得点数(dp)
  9. Datawhale-零基础入门NLP-新闻文本分类Task06
  10. linux 分段路由怎么添加,一种IPv6实现分段路由的方法及装置与流程
  11. 面向失败的设计之播控系统!
  12. Oracle 去掉重复字符串
  13. Python 列表实现原理
  14. 怎么制作真人qq秀_QQ 首款捏脸产品「卡噗」上线,这是微信也能玩的 3D 厘米秀...
  15. 2020德勤面试开始了吗_曝!玛氏、德勤、携程面试题新鲜出炉!2020第一波面试复盘来了......
  16. 大智慧开计算机就如何自动开启,大智慧通达信选股突然变慢
  17. 带有Lowe’s算法的SURF特征提取和匹配
  18. java递归走迷宫游戏
  19. 通信:5G孕育上游投资空间
  20. UI设计(用户界面设计)的好处

热门文章

  1. 为了完成月入 3W 的目标,我都做了哪些准备?
  2. 计算机音乐专业学什么软件有哪些内容,电脑音乐入门装备(软件篇)
  3. Bex5文档服务器,不通过登录直接打开BeX5的首页和功能页的url是什么?
  4. 卓越产品计划丨神策分析性能优化详解:数据重组织查询优化
  5. JS导出excel表格
  6. 汉王考勤机管理系统服务器,汉王考勤管理系统7
  7. 人脸识别技术已成考勤门禁行业发展趋势
  8. Java之简单人机五子棋(一)
  9. 开源阅读书源_强力推荐一个开源阅读软件
  10. VScode配置C/C++环境以及stdafx.h报错解决方法