在阅读Stevey Yegge的Get That Job At Google文章后,我发现这个小小的引用很有趣:
每当有人给你一个问题时,请考虑图表。它们是表示任何一种关系的最基本和最灵活的方式,因此任何有趣的设计问题都有一个图表涉及50-50左右。在转向其他解决方案类型之前,请确保您无法想出使用图表解决问题的方法。这个提示很重要!
图形数据结构/算法能够最好地表示和/或解决的问题有哪些?
我能想到的一个例子:导航单元(ala Garmin,TomTom),提供从当前位置到另一个位置的道路方向,利用图形和高级路径算法。
其他一些人是什么?
答案 0 :(得分:26)
计算机网络:图形模型直观地模拟计算机网络和互联网。节点通常代表终端系统或路由器,而边缘代表这些系统之间的连接。
数据结构:任何使用指针将数据链接在一起的数据结构都在使用某种图形。这包括一直使用的树结构和链表。
路径和地图:尝试查找从某个位置到目的地的最短路径或最长路径,可以使用图表。这可以包括您在Google地图等应用程序中看到的路径,或计算人工智能角色在视频游戏中的路径以及许多其他类似问题。
约束满足:AI中的一个常见问题是找到满足约束列表的目标。例如,对于大学设定课程安排,需要确保某些课程不会发生冲突,教授不会同时教授两门课程,讲座会在某些时段发生,等等。像这样的约束满足问题经常使用图形来建模和解决。
分子:图形可用于模拟原子和分子,以研究它们之间的相互作用和结构。
答案 1 :(得分:15)
我对图论非常感兴趣,并且我用它解决了很多不同类型的问题。您可以使用图解决很多Path相关问题,匹配问题,结构问题。
路径问题有很多应用程序。
这是职业杯的面试问题。
假设您要查找子数组的最长总和。例如,[1, 2, 3, -1]
具有最长的总和6.将其建模为定向非循环图( DAG ),添加虚拟源,虚拟目标。使用具有与数字对应的权重的边连接每个节点。现在使用DAG中的最长路径算法来解决此问题。
同样,金融世界中的套利问题甚至是寻找最长重叠结构的几何问题都是类似的路径问题。
一些明显的问题是网络问题(您的网络可能包含计算机人员,组织结构图等)。
您可以收集很多结构信息,如
我使用图表解决了很多项目管理相关问题。 一系列事件可以被描绘为有向图 (如果你没有周期,那就更好了)。那么,现在你可以
许多匹配问题可以通过图表解决。例如,如果您需要将处理器与工作负载匹配或将工作者与工作匹配。在我的期末考试中,我不得不将人们与餐馆的桌子相匹配。它遵循相同的原则(二分匹配 - >网络流算法)。它简单而有力。
特殊图表树在计算机科学界拥有众多应用程序。例如,在编程语言的语法中,或在数据库索引结构中。
最近,我还在编译器优化问题中使用了图表。我正在使用Morgan的书,它正在教我迷人的技巧。
列表真的一直在继续。图形是关系的漂亮数学抽象。如果你能正确建模,你真的可以创造奇迹。由于图论已经发现了如此多的应用,因此该领域有许多积极的研究。由于大量的研究,我们看到更多的应用正在推动研究。
如果你想开始使用图论,那么请找一本优秀的初学者离散数学书(罗森),你可以从像 Fould 或甚至。 CLRS 也有很好的图算法。
答案 2 :(得分:13)
您的源代码是树结构的,树是一种图形。每当你听到人们谈论AST(抽象语法树)时,他们都在谈论一种图形。
指针形成图形结构。任何行走指针的东西都在进行某种图形处理。
网络是一个巨大的有向图。谷歌的关键洞察力,导致他们在搜索中占据主导地位,是网络的图形结构与页面的文本内容相比或更重要。
状态机是图表。状态机用于网络协议,正则表达式,游戏和各种其他领域。
很难想到你做的任何不涉及某种图形结构的事情。
答案 3 :(得分:10)
大多数人都熟悉的例子:构建系统。 Make是典型的例子,但几乎任何好的构建系统都依赖于Directed Acyclic Graph。基本思想是方向模拟源和目标之间的依赖关系,你应该按照一定的顺序“走”图形以正确构建事物 - >这是拓扑排序的一个例子。
另一个例子是源控制系统:再次基于DAG。例如,它用于合并以查找公共父级。
答案 4 :(得分:8)
嗯,编译器使用的许多程序优化算法都是基于图形的(例如,弄清楚调用图,流控制,大量静态分析)。
许多优化问题都基于图表。由于许多问题可以减少到图形着色和类似问题,因此许多其他问题也是基于图形的。
我不确定我是否同意图表是代表每个关系的最好方式,我当然会尽量避免这些“得到一个钉子,让我们找到一把锤子”的方法。图形通常具有较差的存储器表示,并且当使用矩阵,位集和其他东西实现时,许多算法实际上更有效(在实践中)。
答案 5 :(得分:7)
OCR。画出以一定角度扫描的文本页面,图像中有一些噪点,您必须在这里找到文本行之间的空格。一种方法是制作像素图,并找到从页面一侧到另一侧的最短路径,其中亮度差异是像素之间的距离。
此示例来自Algorithm Design Manual,其中包含许多其他图形问题的真实示例。
答案 6 :(得分:4)
一个流行的例子是垃圾收集。
收集器以一组引用开始,然后遍历它们引用的所有对象,然后遍历引用的所有对象,依此类推。它找到的所有内容都会添加到可到达对象的图形中。所有其他对象都无法访问和收集。
答案 7 :(得分:4)
找出两个分子是否可以配合在一起。在开发药物时,人们常常想知道药物分子是否能够适应体内更大的分子。确定这是否可能的问题是分子不是静态的。分子的不同部分可以围绕它们的化学结合旋转,使得分子可以变成许多不同的形状。
每个形状可以说代表由形状组成的空间中的一个点。解决这个问题涉及找到通过这个空间的路径。您可以通过在空间中创建路线图来实现这一点,该路线图本质上是一个由合法形状组成的图形,并说明形状可以变成哪种形状。通过此路线图使用A *图搜索算法,您可以找到解决方案。
好吧,这可能是不太可理解或清楚的很多喋喋不休。但我的观点是,各种问题都出现了图表。
答案 8 :(得分:3)
图表不是数据结构。它们是关系的数学表示。是的,你可以使用图表来思考和理论问题,并且有很多关于它的理论。但是当您需要实现算法时,您选择的数据结构最能代表问题,而不是图形。有许多数据结构代表一般图形,甚至更多用于特殊类型的图形。
在你的问题中,你混合了这两件事。相同的理论解决方案可以是图形,但实际的解决方案可能使用不同的数据结构来表示图形。
答案 9 :(得分:3)
你可以看一下Neo4j wiki中的一些例子,
和Neo4j使用的项目(已知的)
否则,推荐算法很适合图形,例如参见PageRank和其他内容
答案 10 :(得分:3)
恕我直言,我们在正常应用程序中使用的大多数域模型都是在某些方面的图形。如果您查看UML图表,您会注意到使用定向标记图形,您可以轻松地将它们直接转换为持久性模型。在Neo4j
处有一些例子干杯
/彼得
答案 11 :(得分:3)
图表非常适合管理依赖项。
我最近开始使用Castle Windsor Container,在检查内核后发现了GraphNodes属性。 Castle Windsor使用图形来表示对象之间的依赖关系,以便注入正常工作。看看这个article。
我还使用简单图论来开发插件框架,每个图节点代表一个插件,一旦定义了依赖关系,我就可以遍历图形来创建插件加载顺序。
我计划更改算法以实现Dijkstra的算法,以便每个插件都使用特定版本加权,因此一个简单的更改只会加载最新版本的插件。
我和我早就发现了这个。我喜欢这句话:“只要有人给你一个问题,就想想图表。”我当然认为这是真的。
答案 12 :(得分:3)
以下是基于图论:
答案 13 :(得分:2)
人与人之间的社交关系是一个有趣的图例。我试图使用传统的RDMS在数据库级别对这些连接建模,但发现它太难了。我最终选择了一个图形数据库,这是一个很好的选择,因为它可以很容易地跟踪人(节点)之间的连接(边缘)。
答案 14 :(得分:2)
在代码中分析和/或基准测试算法和实现。
答案 15 :(得分:2)
关系数据库中可以建模为外部键的任何内容本质上都是 edge 和节点在图表中。
也许这会帮助你思考一些例子,因为大多数事情很容易在RDBMS中建模。
答案 16 :(得分:1)
您可以在任何地方利用图表将问题域对象定义到节点中,将解决方案用作节点之间的控制流和/或数据。
考虑到树确实是连通的 - 非循环图,你可以使用更多的图形理论。
答案 17 :(得分:1)
分析数据库理论中的事务serialisability。
答案 18 :(得分:0)
基本上所有常见的数据结构,如树,列表,队列等,都可以被认为是图的类型,有些具有不同类型的约束。
根据我的经验,我在网络流量问题中集中使用了图表,这些问题在电信网络路由和优化,工作负载分配等许多领域中使用,匹配,供应链优化和公共交通规划。
另一个有趣的领域是社交网络建模,如前所述。
还有更多,如集成电路优化等。