日常工作中,你经常使用算法和数据结构吗?曾就职于 Uber 等科技公司的工程师 Gergely Orosz 提出了这样一个问题。此外,他也注意到,越来越多的人觉得算法是无用的,并认为它们只是科技公司提出的一种强制性措施罢了。
本文作者 Gergely Orosz。 不仅如此,也有更多的人抱怨称算法只是纯粹的学术练习。在 Homebrew 作者 Max Howell 发表他的谷歌面试经历之后,这样的想法被进一步普及。
虽然 Gergely Orosz 自己也从来不需要使用二叉树翻转(binary tree inversion),但是他在 Skype、Microsoft、Skyscanner 以及 Uber 工作时,每天都会遇到使用数据结构和算法的情况。 此外,他有时也需要基于这些概念编写代码和做出决策。最后,Gergely Orosz 借助这些知识来理解有些事物如何和为何构建,以及如何使用或修改它们。 由此可见,数据结构和算法并不是如人们所言用处不大。在本文中,Gergely Orosz 列举了一系列现实世界的实例,包含生产中会用到的树、图等数据结构和各种算法。 值得肯定的,所有这些都出自他的第一手经验,借此希望表达他的观点,即通用数据结构和算法知识并不只是「为了面试」,而是你在快速成长的创新型科技公司工作时,可能会经常遇到的东西。 Gergely Orosz 表示自己曾经用过非常小的算法子集,但几乎包含了所有的数据结构。毫不奇怪,他不喜欢繁琐的算法以及包含红黑树或 AVL 树等不常见数据类型的不切实际的面试问题。 接下来具体来看作者列举出来的实例,以第一人称的口吻进行讲述。 树和树遍历:Skype、Uber 和 UI 框架 在微软时,当我们构建 Xbox One 游戏机(由微软发布)的 Skype 软件时,我们使用的是内置操作系统 Xbox OS,但缺少关键库。我们当时正在该平台上构建首个成熟的应用程序之一,所以需要一个能够结合触摸手势和语音命令的导航解决方案。 我们在微软 WinJS 库上构建了一个通用的导航框架。为了做到这一点,我们需要维护一个类似于 DOM(文档对象模型)的图来跟踪可操作的元素。为了找出这些元素,我们执行了 DOM 遍历,基本上是现有 DOM 上的 B - 树遍历(B-tree traversal)。这便是 BFS(广度优先搜索)或者 DFS(深度优先搜索)的经典示例。 在 Uber 时,团队构建了很多实现节点、依赖关系以及它们之间连接可视化的工具。有一个例子就是 RIB 节点的可视化工具。该可视化工具需要维护一棵树,将它可视化为可缩放矢量图形(SVG),然后更新这棵树,同时移动设备上的 RIB 树也发生变化。RIB 自己也会为状态管理维护一个逻辑树结构(logical tree structure),但这个树结构与呈现对象不同,这就是他们设计背后的关键所在。