AI研习图书馆,发现不一样的精彩世界
数据搞定求职笔试or面试,不要着急刷题,先弄懂什么是数据结构~~
1976 年,一个瑞士计算机科学家写了一本书:《Algorithms + Data Structures = Programs》。即: 算法 + 数据结构 = 程序。40 多年过去了,这个等式依然成立~如今,许多互联网大厂的笔试题目都要求候选者必须深入理解算法与数据结构,不管你来自计算机专业还是其他专业,也不管你有多少年编程经验。一般情况下,面试题会直接提问数据结构知识点,例如“编码实现一个二叉树”,然而有时则不那么明显,譬如“迷宫问题”。
数据结构是计算机存储、组织数据的方式。对于特定的数据结构,例如数组,有些操作效率很高,譬如读取某个数组元素,有些操作的效率很低,譬如删除某个数组元素。程序员的目标:为当前问题选择最优的数据结构。
数据是程序的核心要素,因此数据结构的价值不言而喻。无论你在写什么程序,你都需要与数据打交道,例如员工薪资、股票价格or商品清单。在不同的场景下,数据需要以特定的方式存储,因此我们需要有不同的数据结构满足我们的需求。
数组
栈
队列
链表
图
树
前缀树
哈希表
下图展示了 1 个数组,它有 4 个元素:
每一个数组元素的位置由数字编号,称为下标或者索引(index)。大多数编程语言的数组第一个元素的下标为0。
根据维度区分,有 2 种不同的数组:
一维数组(如上图所示)
多维数组(数组的元素为数组)
Insert - 在某个索引处插入元素
Get - 读取某个索引处的元素
Delete - 删除某个索引处的元素
Size - 获取数组长度
查找数组中第二小的元素
查找第一个没有重复的数组元素
合并 2 个排序好的数组
重新排列数组中的正数和负数
栈中的元素采用 LIFO (Last In First Out),即后进先出。
下图的栈有 3 个元素,3 在最上面,因此它会被第一个移除:
Push — 在栈的最上方插入元素
Pop — 返回栈最上方的元素,并将其删除
isEmpty — 查询栈是否为空
Top — 返回栈最上方的元素,并不删除
使用栈计算后缀表达式
使用栈为栈中的元素排序
检查字符串中的括号是否匹配正确
下图展示了一个队列,1 是最上面的元素,它会被第一个移除:
Enqueue — 在队列末尾插入元素
Dequeue — 将队列第一个元素删除
isEmpty — 查询队列是否为空
Top — 返回队列的第一个元素
使用队列实现栈
倒转队列的前 K 个元素
使用队列将 1 到 n 转换为二进制
链表可以用来实现文件系统、哈希表和邻接表。
下图展示了一个链表,它有 3 个节点:
链表分为 2 种:
单向链表
双向链表
InsertAtEnd — 在链表结尾插入元素
InsertAtHead — 在链表开头插入元素
Delete — 删除链表的指定元素
DeleteAtHead — 删除链表第一个元素
Search — 在链表中查询指定元素
isEmpty — 查询链表是否为空
倒转 1 个链表
检查链表中是否存在循环
返回链表倒数第 N 个元素
移除链表中的重复元素
图分为两种:
无向图
有向图
在编程语言中,图有可能有以下两种形式表示:
邻接矩阵(Adjacency Matrix)
邻接表(Adjacency List)
遍历图有两周算法
广度优先搜索(Breadth First Search)
深度优先搜索(Depth First Search)
实现广度优先搜索
实现深度优先搜索
检查图是否为树
统计图中边的个数
使用 Dijkstra 算法查找两个节点之间的最短距离
下一个简单的树以及与树相关的术语:
树的分类:
N 叉树(N-ary Tree)
平衡树(Balanced Tree)
二叉树(Binary Tree)
二叉查找树(Binary Search Tree)
平衡二叉树(AVL Tree)
红黑树(Red Black Tree)
2-3 树(2–3 Tree)
其中,二叉树和二叉查找树是最常用的树。
计算树的高度
查找二叉平衡树中第 K 大的元素
查找树中与根节点距离为 k 的节点
查找二叉树中某个节点所有祖先节点
下图展示了“top”, “thus”和“their”三个单词在前缀树中如何存储的:
单词是按照字母从上往下存储,“p”, “s”和“r”节点分别表示“top”, “thus”和“their”的单词结尾。
统计前缀树表示的单词个数
使用前缀树为字符串数组排序
哈希表通常由数组实现
哈希表的性能取决于 3 个指标:
哈希函数
哈希表的大小
哈希冲突处理方式
查找数组中对称的组合
确认某个数组的元素是否为另一个数组元素的子集
确认给定的数组是否互斥
关注AI研习图书馆,发现不一样的精彩世界