图表能够比其他方法更好地解决哪些问题?请举出一些良好的例子。

50

阅读了 Stevey Yegge 的 Get That Job At Google 文章后,我发现这句话很有意思:

每当有人给你一个问题时,想到图形。它们是表示任何关系的最基本和灵活的方式,所以任何有趣的设计问题都有50%的可能涉及图形。在尝试其他解决方案之前,请确保无法考虑使用图形解决它。这个提示很重要!

哪些问题最适合使用图形数据结构/算法来表示和/或解决?

我能想到的一个例子是:导航设备(如 Garmin、TomTom),提供从当前位置到另一个位置的路线指示,利用图形和高级路径算法。

还有哪些例子?


3
顺便说一下,不要相信关于谷歌面试的那些神话。与其他公司相比,他们有时会问非常简单直接的问题,这实际上可能会使你迷惑。 - Uri
19个回答

29

计算机网络:图形直观地模拟了计算机网络和互联网。通常,节点代表终端系统或路由器,而边缘表示这些系统之间的连接。

数据结构:任何利用指针将数据链接在一起的数据结构都使用了某种类型的图形。这包括树形结构和链表,这些数据结构经常被使用。

路径和地图:寻找从某个位置到目的地的最短或最长路径使用了图形。这可以包括在应用程序中看到的路径,例如Google地图,或者为视频游戏中的AI角色计算路径等类似问题。

约束满足:AI中的一个常见问题是找到满足一系列约束条件的目标。例如,对于大学制定课程计划,它需要确保某些课程不冲突,教授不同时教授两门课程,演讲在特定时间段内进行等等。像这样的约束满足问题通常使用图形建模和解决。

分子:图形可以用于对原子和分子进行建模,以研究它们的相互作用和结构等其他问题。


5
对于约束满足问题,给予赞成。 - hasan
1
约束满足的那一部分听起来很有趣。你有关于这个主题的文章或论文可以分享吗? - Markus Johnsson
@MahlerFive,我也很想了解更多关于约束满足的知识。您能否指出一些值得深入研究的资源? - Uzbekjon

17

我对图论非常感兴趣,并且已经使用它解决了许多不同类型的问题。你可以使用图来解决很多与路径相关的问题、匹配问题和结构问题。

  • 路径问题有许多应用。

    这是一个Career Cup的面试题。比如说,你想要找到一个子数组中的最长子序列和。例如:[1, 2, 3, -1] 的最长和为6。将其建模成一个有向无环图 (DAG),添加一个虚拟源和虚拟终点。将每个节点连接到具有相应数字权重的边缘。现在使用DAG中的最长路径算法来解决此问题。

    同样,金融领域的套利问题或者几何学中找到最长重叠结构的问题也是类似的路径问题。

  • 一些明显的问题是网络问题(其中您的网络可能包括计算机、人员、组织图等)。
    您可以了解许多结构信息,例如:

    • 哪个点将图分成两部分
    • 最佳连接方式是什么
    • 从一个地方到另一个地方的最佳方法是什么
    • 从一个地方到另一个地方是否有到达的方法等等。
  • 我使用图解决了许多与项目管理相关的问题。 事件序列可以被描绘为一个有向图(如果你没有循环那就更好了)。现在,您可以:

    • 按照优先级对事件进行排序
    • 找到最关键的事件(即可以释放许多其他项目的事件)
    • 找到解决整个项目所需的持续时间(路径问题),等等。
  • 许多关于匹配问题的难题都可以用图解决。例如,当你需要将处理器与工作负载匹配或者将工人与他们的工作匹配时。在我的期末考试中,我需要将人们与餐厅桌子匹配。这遵循着相同的原理(二分匹配 -> 网络流算法)。它简单而强大。

  • 一种特殊的图——树,在计算机科学领域有众多应用。例如,在编程语言的语法中或者在数据库索引结构中。

  • 最近,我还在编译器优化问题中使用了图表。我正在使用 Morgan 的书,它教授了我很多有趣的技巧。

这个列表真的是无穷无尽。图表是一个美妙的数学抽象,用于描述关系。如果你能正确地建模,你就能创造奇迹。由于图论已经找到了如此之多的应用,所以该领域有很多活跃的研究。因为有许多研究,我们正在看到更多的应用,这又推动了更多的研究。

如果你想开始学习图论,可以阅读一本好的初级离散数学书籍(我想起了 Rosen),你也可以购买像 Fould 或 Even 这样的作者的书籍。CLRS 也有很好的图算法。


14

你的源代码是树形结构,而树是一种图形结构。当你听到人们谈论AST(抽象语法树)时,他们谈的就是一种图形结构。

指针构成了图形结构。任何使用指针的东西都在进行某种图形操作。

Web是一个巨大的有向图。Google的关键洞察力,导致他们在搜索领域占主导地位,就是Web的图形结构与页面的文本内容同等或更重要。

状态机是图形结构。状态机用于网络协议、正则表达式、游戏和各种其他领域。

很难想象你所做的任何事情都不涉及某种图形结构。


11

一个大多数人都熟悉的例子是构建系统。Make 是典型的例子,但几乎所有好的构建系统都依赖于有向无环图 (DAG)。基本想法是方向模型源和目标之间的依赖关系,并且您应该按照特定顺序“遍历”图以正确构建事物 -> 这是拓扑排序的一个例子。

另一个例子是源代码控制系统:同样基于 DAG。它用于合并,例如查找公共父项。


8

很多编译器使用的程序优化算法都是基于图形的(例如,找出调用图、流控制、大量静态分析等)。

许多优化问题都基于图形。由于许多问题可以归约为图形着色和类似问题,因此许多其他问题也是基于图形的。

我不确定图形是表示每个关系的最佳方式,我肯定会尽量避免这些“有一个钉子,我们来找一个锤子”的方法。图形通常具有较差的内存表示,并且许多算法实际上在使用矩阵、位集和其他东西实现时更有效(在实践中)。


7
OCR。想象一下,扫描了一张倾斜的文本页面,并且图像中存在一些噪点,在其中您必须找到文本行之间的空格。一种方法是制作像素图,并从页面的一侧到另一侧找到最短路径,其中亮度差是像素之间的距离。
此示例来自算法设计手册,其中有许多其他实际图形问题的示例。

4
以下内容基于图论:
  • 二叉树和其他树结构,例如红黑树、伸展树等。
  • 链表
  • 任何被建模为状态机的东西(如GUI、网络堆栈、CPU等)
  • 决策树(用于人工智能和其他应用程序)
  • 复杂的类继承

4

一个流行的例子是垃圾回收。

垃圾回收器从一组引用开始,然后遍历它们所引用的所有对象,然后遍历引用的所有对象以此类推。它发现的所有内容都会被添加到可达对象图中。所有其他对象都是不可达的并将被回收。


4
要找出两种分子是否可以拼合。在开发药物时,人们常常希望看到药物分子是否可以适应身体中更大的分子。确定这是否可能的问题在于分子并不是静态的。分子的不同部分可以绕着它们的化学键旋转,因此一个分子可以变成很多不同的形状。
每个形状可以被认为是空间中的一个点。解决这个问题涉及到在这个空间中找到一条路径。你可以通过创建一个空间路线图来实现这一点,这本质上是一个由合法形状组成的图表,并指出一个形状可以转变成哪个形状。通过使用 A* 图搜索算法在这个路线图中找到一个解决方案。
好的,刚才可能有很多难以理解或不清晰的话语。但我的观点是,在各种问题中都会出现图表。

4
图表不是数据结构,它们是关系的数学表示。是的,你可以使用图表来思考和理论化问题,并且有大量的理论研究。但是当你需要实现一个算法时,你要选择最好地表示问题的数据结构,而不是图表。有许多数据结构可以表示一般图形,甚至更多的专门用于特殊类型的图形。
在你的问题中,你混淆了这两个东西。同样的理论解决方案可能是以图表的形式,但实际解决方案可能使用不同的数据结构来表示图表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接