译者按: 搞定面试,不要急着刷题,先弄懂什么是数据结构!javascript
为了保证可读性,本文采用意译而非直译。另外,本文版权归原做者全部,翻译仅用于学习。java
1976 年,一个瑞士计算机科学家写一本书《Algorithms + Data Structures = Programs》。即:算法 + 数据结构 = 程序。40 多年过去了,这个等式依然成立。node
不少代码面试题都要求候选者深刻理解数据结构,无论你来自大学计算机专业仍是编程培训机构,也无论你有多少年编程经验。有时面试题会直接提到数据结构,好比“给我实现一个二叉树”,然而有时则不那么明显,好比“统计一下每一个做者写的书的数量”。程序员
数据结构是计算机存储、组织数据的方式。对于特定的数据结构(好比数组),有些操做效率很高(读某个数组元素),有些操做的效率很低(删除某个数组元素)。程序员的目标是为当前的问题选择最优的数据结构。面试
数据是程序的核心要素,所以数据结构的价值不言而喻。不管你在写什么程序,你都须要与数据打交道,好比员工工资、股票价格、杂货清单或者电话本。在不一样场景下,数据须要以特定的方式存储,咱们有不一样的数据结构能够知足咱们的需求。算法
**数组(Array)**大概是最简单,也是最经常使用的数据结构了。其余数据结构,好比栈和队列都是由数组衍生出来的。express
下图展现了 1 个数组,它有 4 个元素:编程
每个数组元素的位置由数字编号,称为下标或者索引(index)。大多数编程语言的数组第一个元素的下标是 0。小程序
根据维度区分,有 2 种不一样的数组:微信小程序
撤回,即 Ctrl+Z,是咱们最多见的操做之一,大多数应用都会支持这个功能。你知道它是怎么实现的吗?答案是这样的:把以前的应用状态(限制个数)保存到内存中,最近的状态放到第一个。这时,咱们须要**栈(stack)**来实现这个功能。
栈中的元素采用 LIFO (Last In First Out),即后进先出。
下图的栈有 3 个元素,3 在最上面,所以它会被第一个移除:
队列(Queue)与栈相似,都是采用线性结构存储数据。它们的区别在于,栈采用 LIFO 方式,而队列采用先进先出,即FIFO(First in First Out)。
下图展现了一个队列,1 是最上面的元素,它会被第一个移除:
**链表(Linked List)**也是线性结构,它与数组看起来很是像,可是它们的内存分配方式、内部结构和插入删除操做方式都不同。
链表是一系列节点组成的链,每个节点保存了数据以及指向下一个节点的指针。链表头指针指向第一个节点,若是链表为空,则头指针为空或者为 null。
链表能够用来实现文件系统、哈希表和邻接表。
下图展现了一个链表,它有 3 个节点:
链表分为 2 种:
图(graph)由多个节点(vertex)构成,节点之间阔以互相链接组成一个网络。(x, y)表示一条边(edge),它表示节点 x 与 y 相连。边可能会有权值(weight/cost)。
图分为两种:
在编程语言中,图有可能有如下两种形式表示:
遍历图有两周算法
**树(Tree)**是一个分层的数据结构,由节点和链接节点的边组成。树是一种特殊的图,它与图最大的区别是没有循环。
树被普遍应用在人工智能和一些复杂算法中,用来提供高效的存储结构。
下图是一个简单的树以及与树相关的术语:
树有不少分类:
其中,二叉树和二叉查找树是最经常使用的树。
**前缀树(Prefix Trees 或者 Trie)**与树相似,用于处理字符串相关的问题时很是高效。它能够实现快速检索,经常使用于字典中的单词查询,搜索引擎的自动补全甚至 IP 路由。
下图展现了“top”, “thus”和“their”三个单词在前缀树中如何存储的:
单词是按照字母从上往下存储,“p”, “s”和“r”节点分别表示“top”, “thus”和“their”的单词结尾。
哈希(Hash)将某个对象变换为惟一标识符,该标识符一般用一个短的随机字母和数字组成的字符串来表明。哈希能够用来实现各类数据结构,其中最经常使用的就是哈希表(hash table)。
哈希表一般由数组实现。
哈希表的性能取决于 3 个指标:
下图展现了有数组实现的哈希表,数组的下标即为哈希值,由哈希函数计算,做为哈希表的键(key),而数组中保存的数据即为值(value):
Fundebug专一于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了10亿+错误事件,付费客户有Google、360、金山软件、百姓网等众多品牌企业。欢迎你们免费试用!
转载时请注明做者Fundebug以及本文地址:
blog.fundebug.com/2018/08/27/…