首页 文章 精选 留言 我的

精选列表

搜索[蓝色链接],共10000篇文章
优秀的个人博客,低调大师

代码面试需要知道的8种数据结构(附面试题及答案链接)

译者按: 搞定面试,不要急着刷题,先弄懂什么是数据结构! 原文:The top data structures you should know for your next coding interview 译者:Fundebug 为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。 data_structure.png 1976年,一个瑞士计算机科学家写一本书《Algorithms + Data Structures = Programs》。即:算法 + 数据结构 = 程序。40多年过去了,这个等式依然成立。 很多代码面试题都要求候选者深入理解数据结构,不管你来自大学计算机专业还是编程培训机构,也不管你有多少年编程经验。有时面试题会直接提到数据结构,比如“给我实现一个二叉树”,然而有时则不那么明显,比如“统计一下每个作者写的书的数量”。 什么是数据结构? 数据结构是计算机存储、组织数据的方式。对于特定的数据结构(比如数组),有些操作效率很高(读某个数组元素),有些操作的效率很低(删除某个数组元素)。程序员的目标是为当前的问题选择最优的数据结构。 为什么我们需要数据结构? 数据是程序的核心要素,因此数据结构的价值不言而喻。无论你在写什么程序,你都需要与数据打交道,比如员工工资、股票价格、杂货清单或者电话本。在不同场景下,数据需要以特定的方式存储,我们有不同的数据结构可以满足我们的需求。 8种常用数据结构 数组 栈 队列 链表 图 树 前缀树 哈希表 1. 数组 数组(Array)大概是最简单,也是最常用的数据结构了。其他数据结构,比如栈和队列都是由数组衍生出来的。 下图展示了1个数组,它有4个元素: array.png 每一个数组元素的位置由数字编号,称为下标或者索引(index)。大多数编程语言的数组第一个元素的下标是0。 根据维度区分,有2种不同的数组: 一维数组(如上图所示) 多维数组(数组的元素为数组) 数组的基本操作 Insert - 在某个索引处插入元素 Get - 读取某个索引处的元素 Delete - 删除某个索引处的元素 Size - 获取数组的长度 常见数组代码面试题 查找数组中第二小的元素 查找第一个没有重复的数组元素 合并2个排序好的数组 重新排列数组中的正数和负数 2. 栈 撤回,即Ctrl+Z,是我们最常见的操作之一,大多数应用都会支持这个功能。你知道它是怎么实现的吗?答案是这样的:把之前的应用状态(限制个数)保存到内存中,最近的状态放到第一个。这时,我们需要栈(stack)来实现这个功能。 栈中的元素采用LIFO (Last In First Out),即后进先出。 下图的栈有3个元素,3在最上面,因此它会被第一个移除: stack.png 栈的基本操作 Push — 在栈的最上方插入元素 Pop — 返回栈最上方的元素,并将其删除 isEmpty — 查询栈是否为空 Top — 返回栈最上方的元素,并不删除 常见的栈代码面试题 使用栈计算后缀表达式 使用栈为栈中的元素排序 检查字符串中的括号是否匹配正确 3. 队列 队列(Queue)与栈类似,都是采用线性结构存储数据。它们的区别在于,栈采用LIFO方式,而队列采用先进先出,即FIFO(First in First Out)。 下图展示了一个队列,1是最上面的元素,它会被第一个移除: queue.png 队列的基本操作 Enqueue — 在队列末尾插入元素 Dequeue — 将队列第一个元素删除 isEmpty — 查询队列是否为空 Top — 返回队列的第一个元素 常见的队列代码面试题 使用队列实现栈 倒转队列的前K个元素 使用队列将1到n转换为二进制 4. 链表 链表(Linked List)也是线性结构,它与数组看起来非常像,但是它们的内存分配方式、内部结构和插入删除操作方式都不一样。 链表是一系列节点组成的链,每一个节点保存了数据以及指向下一个节点的指针。链表头指针指向第一个节点,如果链表为空,则头指针为空或者为null。 链表可以用来实现文件系统、哈希表和邻接表。 下图展示了一个链表,它有3个节点: linked_list.png 链表分为2种: 单向链表 双向链表 链表的基本操作 InsertAtEnd — 在链表结尾插入元素 InsertAtHead — 在链表开头插入元素 Delete — 删除链表的指定元素 DeleteAtHead — 删除链表第一个元素 Search — 在链表中查询指定元素 isEmpty — 查询链表是否为空 常见的队列代码面试题 倒转1个链表 检查链表中是否存在循环 返回链表倒数第N个元素 移除链表中的重复元素 5. 图 图(graph)由多个节点(vertex)构成,节点之间阔以互相连接组成一个网络。(x, y)表示一条边(edge),它表示节点x与y相连。边可能会有权值(weight/cost)。 graph.png 图分为两种: 无向图 有向图 在编程语言中,图有可能有以下两种形式表示: 邻接矩阵(Adjacency Matrix) 邻接表(Adjacency List) 遍历图有两周算法 广度优先搜索(Breadth First Search) 深度优先搜索(Depth First Search) 常见的图代码面试题 实现广度优先搜索 实现深度优先搜索 检查图是否为树 统计图中边的个数 使用Dijkstra算法查找两个节点之间的最短距离 6. 树 树(Tree)是一个分层的数据结构,由节点和连接节点的边组成。树是一种特殊的图,它与图最大的区别是没有循环。 树被广泛应用在人工智能和一些复杂算法中,用来提供高效的存储结构。 下图是一个简单的树以及与树相关的术语: tree.png 树有很多分类: 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”三个单词在前缀树中如何存储的: tries.png 单词是按照字母从上往下存储,“p”, “s”和“r”节点分别表示“top”, “thus”和“their”的单词结尾。 常见的树代码面试题 统计前缀树表示的单词个数 使用前缀树为字符串数组排序 8. 哈希表 哈希(Hash)将某个对象变换为唯一标识符,该标识符通常用一个短的随机字母和数字组成的字符串来代表。哈希可以用来实现各种数据结构,其中最常用的就是哈希表(hash table)。 哈希表通常由数组实现。 哈希表的性能取决于3个指标: 哈希函数 哈希表的大小 哈希冲突处理方式 下图展示了有数组实现的哈希表,数组的下标即为哈希值,由哈希函数计算,作为哈希表的键(key),而数组中保存的数据即为值(value): hash_table.png 常见的哈希表代码面试题 查找数组中对称的组合 确认某个数组的元素是否为另一个数组元素的子集 确认给定的数组是否互斥 参考 Fundebug博客 - Node.js面试题之2017 Fundebug博客 - 快速掌握JavaScript面试基础知识(一) Fundebug博客 - 快速掌握JavaScript面试基础知识(二) Fundebug博客 - 快速掌握JavaScript面试基础知识(三) GeeksforGeeks 关于Fundebug Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了6亿+错误事件,得到了Google、360、金山软件等众多知名用户的认可。欢迎免费试用! 版权声明: 转载时请注明作者Fundebug以及本文地址:https://blog.fundebug.com/2018/08/27/code-interview-data-structure/

优秀的个人博客,低调大师

Cloud Foundry平台中国唯一云供应商,阿里云持续链接Cloud Foundry/Kubernetes生态

日前,在Cloud Foundry Summit 2018大会上,基金会执行董事Abby Kearns宣布,阿里云成为Cloud Foundry平台中国区唯一公共云基础设施提供商:“中国企业将在Cloud Foundry和阿里云共同作用下得到更加优质的体验”。 阿里云致力于为客户提供多种选择 Cloud Foundry基金会官网显示,阿里云已经成为该基金会金牌会员。Cloud Foundry基金会撰文表示:“全球增长最快的云服务公司成为Cloud Foundry Foundation金牌会员,为Cloud Foundry打开了中国及更广阔的市场”。 Cloud Foundry发布于2011年,是一个云原生领域非常流行的开源项目。它提供给开发者自由度去选择云平台、开发框架和应用服务。 “作为业界第一个开源PaaS平台,Cloud Found

优秀的个人博客,低调大师

(附重要论文下载链接)

2016年机器学习领域取得了很多可以铭记在历史中的进展,将其称为”机器学习元年”也并不为过。市场上各大公司都在进行机器学习的研究,即使没有,他们也通过收购各类机器学习初创公司来快速进入这个领域。 造就这一轮机器学习的热潮的原因很多。虽然Google开源Tensorflow框架才过去短短一年,Tensorflow已然成为Github上最为炙手可热的项目,使用场景横跨从药物研发到自动音乐生成等各个领域。Google并不是唯一开源了机器学习基本框架的科技巨头,微软的CNTK,百度的PaddlePaddle都是目前被广泛使用的机器学习框架。Amazon虽然没有自己研发的机器学习框架,但他们已经宣布将在未来支持MXNet,以期推广他们最新的AWS ML平台。而Facebook目前主要支持两个深度学习平台:Torch以及Caffe。Google本身也同时在支持在学术和工业界都取得重大成功的机器学习框架Keras。在这个意义上来说,在AI的这场技术”军备大战”中,Google与Facebook算是打成了平手。 除了各大技术公司争相开源自己的机器学习框架,2016年也见证了无数优质的机器学习的应用,这些工作即使放到几个月前都是不可想象的。 我特别印象深刻的是Wavenet的音频生成的质量。过去我曾经处理过类似的问题,对比之下对于那些他们所完成的结果我很欣赏。我也要强调一些最近在唇读方面的成就,一个伟大的视频识别的应用,在不久的将来可能是非常有用的(也许是可怕的)。 我还应该提到谷歌在机器翻译方面取得的令人印象深刻的进步。看到这一领域在一年内有这么大进步真是令人惊讶。 事实上,机器翻译并不是我们在过去一年中在机器学习在自然语言技术领域看到的唯一有价值的进步。 通过结合深度序列神经网络以及语言相关的一些信息,我们可以生成一些更为丰富的语言模型。 例如在“A Neural Knowledge Language Model”这篇论文中,Bengio的团队将知识图谱与RNN相结合,而在“Contextual LSTM models for Large scale NLP Tasks”的论文中,Deepmind团队将文章的主题提取同时纳入到LSTM模型。 此外,我们还看到了许多在建模语言模型的attention和memory(这两个词在学术方面有专门的含义,解释成注意力和记忆也没错,但是总觉得有点不太对)方面的有趣工作。 作为一个例子,我推荐在今年的ICML(国际机器学习大会)中发表的论文“Ask Me Anything: Dynamic Memory Networks for NLP”。 此外,我还想要提及一些发表于2016年在巴塞罗那举行的NIPS上的工作。遗憾的是,我错过了这次在我的家乡举行的会议。从我了解的内容来看,两个最热门的话题可能是生成式对抗网络(包括Ian Goodfellow的非常受欢迎的教程)和结合概率模型的深度学习相关的课题。 另外我也想谈一下机器学习在我的主要专业领域,推荐系统方面的一些进步。 毫无疑问,深度学习也深刻影响了这一领域。 虽然我个人仍然不建议将DL作为推荐系统的默认方法,但看它如何在实际工作中大规模的使用是很有趣的,例如通过像Youtube这样的产品我们可以看到DL对比传统的方法上还是取得了一定进展(这里有一篇Google的paper https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/45530.pdf)。 也就是说,在该领域还是有一些有趣的研究与深度学习无关。 例如今年ACM Recsys的最佳论文奖颁给了“Local Item-Item Models For Top-N Recommendation”,这篇工作主要是针对稀疏线性方法(即SLIM)的一个有趣扩展,通过增加一个初始化非监督聚类的步骤提升效果。 此外,“Field-aware Factorization Machines for CTR Prediction”主要详细解释了在Kaggle上的Criteo CTR预测挑战赛中的获胜算法,我们不得不正视在推荐领域,Factorization Machine仍然是你的ML工具包中非常实用的一个工具。 我可以继续在接下来的段落中列举出机器学习在过去12个月里取得的有影响力的进步。例如与图像识别或者深度强化学习相关的突破,一些重要的可应用场景包括自动驾驶汽车,聊天机器人或游戏对战,这些领域在2016年都获得了巨大的进步。此外还有各类关于机器学习如何具有或可能对社会有负面影响的争论,以及关于算法偏差和公平性的讨论的兴起。 附言:(这段有点调侃,算是学术界八卦,不翻译也罢哈哈) 在我被打电话之前,我还应该提到,大多数这些进展可能是由Schmidhuber在几年前就已经发表了。 不过他至少上了今年的纽约时报特刊! Wavenet:https://arxiv.org/pdf/1609.03499.pdf 唇读方面的成就: https://arxiv.org/pdf/1611.05358.pdf 机器翻译:https://arxiv.org/pdf/1609.08144.pdf A Neural Knowledge Language Model:https://arxiv.org/pdf/1608.00318.pdf Contextual LSTM models for Large scale NLP Tasks:https://arxiv.org/pdf/1602.06291.pdf 结合概率模型的深度学习相关的课题: http://inverseprobability.com/2016/12/13/nips-highlights.html Deep Neural Networks for YouTube Recommendations: http://dl.acm.org/citation.cfm?id=2959190 Local Item-Item Models For Top-N Recommendation: http://dl.acm.org/citation.cfm?id=2959185 Field-aware Factorization Machines for CTR:Prediction:http://dl.acm.org/citation.cfm?id=2959134 算法偏差和公平性的讨论: https://www.wired.com/2016/11/humans-can-force-machines-play-fair?mbid=social_twitter Schmidhuber的纽约时报特刊: http://www.nytimes.com/2016/11/27/technology/artificial-intelligence-pioneer-jurgen-schmidhuber-overlooked.html?_r=0 本文来源于Quora,作者Xavier Amatriain,译者:郭昕(来自蚂蚁金服-人工智能部) 云栖社区兴趣翻译小组提供翻译支持

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册