Questions tagged «graph»

一种数学结构,其中包含顶点或“节点”的集合以及连接成对顶点的边的集合


3
如何找到带有虫洞节点的最短路径?
这是我想通过代码执行的示例。我知道您可以使用跳转点搜索轻松地从绿色节点到红色节点,甚至A *也不会出现问题。但是,如何计算变形呢? 在图中,您可以看到,沿着蓝色路径,从绿色节点到红色节点仅需8步。蓝色路径会立即将您的位置从一个紫色节点移动到另一个紫色节点。花费2个动作的中间空间是您必须移动到的两个变形区域之间的一个点。 显然,走蓝色路径更快,因为您只需要(大约)移动一半到黄色路径,但是我该如何编程呢? 为了解决此问题,我们假设您可以使用图形周围有多个紫色“变形”,并且我们确切知道每个紫色点将变形到什么位置以及它们在图形上的位置。 有些紫色经线是双向的,而有些不是,这意味着,有时您只能从一侧进入经线,而在扭曲后不能返回。 我已经考虑了解决方案,但得出的结论是,我可以通过检查到每个变形点的距离(减去单向点)以及这些点之间的差以及与之接近的点来计算问题。 。 该程序必须弄清楚采用第二种经线比从第一条跳跃走更有益。因此,与其先移动6个点,然后进行变形,然后再步行剩余的8步(这比根本不使用经线要快),不如先移动6个点,然后再进行两次移动到第二个经线。 编辑:我意识到蓝色的路径实际上将采取12步,而不是8步,但问题仍然相同。

3
高效图聚类算法
我正在寻找一种在大型图形上查找聚类的有效算法(它具有大约5000个顶点和10000条边)。 到目前为止,我正在使用在JUNG java库中实现的Girvan–Newman算法,但是当我尝试去除很多边缘时,它的速度相当慢。 您能建议我一个适合大图的更好的选择吗?

7
如何使用图形结构对代码进行单元测试?
我正在编写(递归)代码来浏览依赖关系图,以查找依赖关系中的循环或矛盾。但是,我不确定如何进行单元测试。问题是我们主要关心的问题之一是将对可能出现的所有有趣的图结构进行代码处理,并确保所有节点都将得到适当处理。 尽管通常100%的行或分支覆盖率足以确保某些代码可以工作,但即使100%的路径覆盖率,您仍然会有疑问。 因此,如何为测试用例选择图形结构,以确保其代码可以处理您在真实数据中发现的所有可能的排列。 PS-如果重要的话,我图中的所有边都标记为“必须具有”或“不能具有”,并且没有琐碎的循环,并且任何两个节点之间只有一条边。 PPS-此附加问题声明最初由问题的作者在以下评论中发布: For all vertices N in forest F, for all vertices M, in F, such that if there are any walks between N and M they all must either use only edges labelled 'conflict' or 'requires'.

6
数字线上的访问点,同时将与距离无关的成本最小化
我需要有关此ACM ICPC问题的帮助。我目前的想法是将此模型建模为最短路径问题,在问题说明中对此进行了描述。 问题 除了以外,N = 1000沿一维数字线位于不同位置的有核废料容器。一个人的任务是收集所有垃圾箱。垃圾容器每秒钟收集一次,就会发出1单位的辐射。人开始时可以每秒移动一次,收集废物所花费的时间可以忽略不计。我们希望找到收集所有容器时释放的最小辐射量。-500,000 to 500,000x=0x = 01 输入样例: 4位于的集装箱[-12, -2, 3, 7]。 收集这些容器的最佳顺序是[-2, 3, 7, -12],以减少50单位散发。说明:该人-2在2秒钟内进入,在此期间2 units辐射被发射。然后,他到达3(距离:),5以便枪管释放2 + 5 = 7出辐射单位。他需要4更多的时间才能到达x = 7那个发射桶的地方2 + 5 + 4 = 11。他花了19几秒钟到达x = -12那个桶发射2 + 5 + 4 + 19 = 30单位的地方。2 + 7 + 11 + 30 = 50,这就是答案。 …
18 algorithms  graph 

4
外行术语是什么图
计算机科学中的图是什么,它们的用途是什么?从外行的角度来看最好。 我已经阅读了维基百科的定义: 在计算机科学中,图是一种抽象数据类型,旨在从数学上实现图和超图概念。 图数据结构由一组有限的(可能是可变的)有序对集合(称为边或弧)组成,这些对对称为某些实体,称为节点或顶点。就像在数学中一样,边(x,y)被称为指向x或从x指向y。节点可以是图结构的一部分,也可以是由整数索引或引用表示的外部实体。 但我正在寻找一个不太正式,更容易理解的定义。

5
确定最快路线的算法?
假设我们要从1转到5。最短的路线将是1-4-3-5(总计:60公里)。 我们可以使用Dijkstra的算法来做到这一点。 现在的问题是,由于交通拥堵或其他因素,最短的路线不一定总是最快的路线。 例如: 1-2被认为经常发生交通拥堵,因此应避免这种情况。 突然在4-3发生车祸,因此也应该避免。 等等... 因此,由于没有交通阻塞/事故,我们大概可以在1-4-5号路线上加速行驶,因此速度会更快达到5。 好吧,这是总体思路,我还没有考虑更多细节。 有没有解决这个问题的算法?
17 graph  dijkstra 

1
灵活实施DIFF的启发式方法
我创建了一个DIFF实现,以比较工作中的文档修订。它基于O(ND)差分算法及其变体。 变得很重要的一件事是获取更改列表并将其解释为人类可读的文本。尽管当前算法非常有效,但它是如此之大,以至于难以扩展。 简短问题 我当时正在考虑尝试使用A *和一种启发式方法,该方法会增加“转弯”的惩罚。想法是消除不必要的“添加,删除,添加,删除,添加,删除”,以便更轻松地解析为人类可以阅读的内容。基本上,将我的最短路径问题变成最简单的路径问题。 当然,不要创建始终为“删除所有内容,添加所有内容 ”的输出 听起来合理吗? 在DIFF实现中使用启发式算法是否有优先权?什么是启发式? 问题: 如果删除了一个长句子,又删除了另一个长句子,但它们确实共享至少一个单词,请说“与”。不理会常见单词(不要同时添加和删除它)将创建最短路径。但是,这实际上只是使尝试混淆更改打印内容的人感到困惑。 当前DIFF的示例: 旧文本: 清洁:用力洗净并用车间空气吹干。 新文本: 清洁:用丙酮和无绒布擦拭。 变更单清单: 将“强力清洗并吹干”更改为“用丙酮擦拭” 将“商店空气”更改为“丙酮和无绒布” 注意:使用“更改”代替 “删除'购买空气',添加'丙酮'” 如您所见,第二个注释失去了所有上下文,并且在没有查看完整的旧文本和新文本集的情况下,您无法理解其含义。 关于标点符号的注意事项: 我将标点符号分隔为单独的“单词”,这样我就可以 添加“(” 代替 将“修复”更改为“((修复) 因为这令人讨厌。但是,这意味着如果两个文本中甚至有一个逗号(与前面示例中的单词“ with”相对),就会发生相同的情况。 可能的解决方案: 我认为我可以使用不同的路径查找算法,从而使我能够灵活地为可能对人更有意义的不同更改“路径”增加权重。也许,我什至可以使旅行到包含标点符号的节点的权重很小(不确定这将如何影响其他事情)。 然后,我可以得到前面的示例以列出以下内容: 变更单清单: 将“ Powerwash并用商店空气吹干”更改为“用丙酮和不起毛的布擦拭” 看到!更清晰! 我知道我会在性能上受到打击,并且可能必须对程序进行大刀阔斧的检修,但是获得所需的最终结果更为重要。 底线: 同样,在DIFF实现中使用启发式方法是否有优先次序,这是什么? 其他想法?合理的时间投入?还有其他想法吗?其他算法? 提前致谢! 编辑: 我试图澄清/巩固我的问题,并推广我的问题,以在我的算法中添加启发式方法,而不是使用A *。在这种情况下,基本上是相同的事情,但是我现在仍然认为更准确。 这篇文章很有见地。

3
是否可以有效地表示具有不变状态的对象图的突变?
我正在练习在C ++中使用不可变对象。我的个人目标是用不可变图序列表示通用对象图(在堆中)。 构建多版本图本身并不难。问题是性能。蛮力版本控制需要图形的完整副本,这是不可接受的。 我试图共享不变的节点。但是在这种情况下,我遇到了一个新问题。参考。对其他对象的引用必须在整个图中进行更新。每次派生新图版本时,都需要访问所有节点。并且这会使带有引用的节点发生变异,因此也应该派生它们(通过复制)。性能不会比暴力复制更好。 据我所能想象,没有真正有效的方法来表示具有不变状态的对象图的突变。因此,我希望对此有所想法。 是否可以用不变状态有效地表示对象图的变化?

1
关于Floyd-Warshall,Dijkstra和Bellman-Ford算法之间的区别,我是否正确?
我一直在研究这三个,并在下面说明了他们的推论。有人可以告诉我我是否足够正确地理解它们?谢谢。 Dijkstra的算法仅在您只有一个来源并且想知道从一个节点到另一个节点的最小路径时使用,但是在这种情况下会失败 当所有节点中的任何一个都可以作为源时,将使用Floyd-Warshall算法,因此您希望从任何源节点到任何目标节点的距离最短。仅在出现负循环时失败 (这是最重要的一个。我的意思是,这是我最不确定的一个:) 3,贝尔曼·福特(Bellman-Ford)和迪杰斯特拉(Dijkstra)一样,只有一个来源。它可以处理负数权重,其工作方式与Floyd-Warshall相同,只是有一个来源,对吗? 如果需要看一下,相应的算法是(由维基百科提供): 贝尔曼福特: procedure BellmanFord(list vertices, list edges, vertex source) // This implementation takes in a graph, represented as lists of vertices // and edges, and modifies the vertices so that their distance and // predecessor attributes store the shortest paths. // Step 1: initialize graph …

1
从原点向外产生最大边数为3的边和顶点的算法
我正在为一个网站创建2D游戏,在该网站上,宇宙可以变得非常大(基本上是无限大)。最初,宇宙由6个与原点(0,0)等距离的恒星组成。我的任务是能够生成更多的恒星,这些恒星将具有相互连接的“路径”(边缘)。如何设计满足以下限制的算法: 恒星是向外随机产生的。(例如,新星的(x,y)坐标将在所有方向上从(0,0)缓慢向外移动,最好采用螺旋格式) 边缘不会交叉。 尽管应该有一些差异,但新星不应与其他星相距太远或太近。(例如必须有一个最小半径) 星星/点的倍数不得超过3。 鉴于所有这些都将存储在数据库中,该算法不会太昂贵。换句话说,我很想达到O(n)的复杂度(我不知道这是否可行)。 本质上,我要寻找的是一个螺旋状的星系,其中的恒星是图形上的点,恒星之间的行进由这些恒星之间的边缘描绘。 我需要解决的特定步骤是: 在尚未重合3的其他恒星附近随机产生一个点。 查找尚未有多重度3且不会产生边缘冲突的第一颗恒星。 如果星形距离最小x单位,则在两点之间创建一条边。 我尝试寻找解决方案,但是我的数学技能(以及关于图论的知识)需要大量工作。此外,将不胜感激与此问题有关的任何资源/链接。 这是我在想的一些伪代码,但是我不确定这是否还能奏效,并且我确定在经过10,000次等运算后,它的性能将无法令人满意。 newStar = randomly generated (x, y) within radius of last star from origin while(newStar has not been connected): for (star in the known universe): if(distance between newStar and star > x units): if(star has < 3 multiplicity): …

2
如何表示在节点和可以有选择地消失的边之间允许有多个边的图
我正在尝试找出用于建模一些假设的理想化网络使用情况的数据结构。 在我的方案中,许多互相敌对的用户都试图组成已知所有潜在连接的计算机网络。但是,一个用户需要连接的计算机可能与另一用户需要连接的计算机不同;用户1可能需要连接计算机A,B和D,而用户2可能需要连接计算机B,C和E。 在NCTM Graph Creator的帮助下生成的图像 我认为其核心将是无向循环图,其中节点表示计算机,边缘表示以太网电缆。但是,由于场景的性质,有一些不常见的功能可以排除邻接表和邻接矩阵(至少,没有进行不重要的修改): 边缘可能会限制使用;也就是说,如果一个用户获得了给定的网络连接,则其他任何用户都不能使用该连接 在该示例中,绿色用户可能无法连接到计算机A,但是红色用户已将B连接到E,尽管它们之间没有直接链接 在某些情况下,一对给定的节点将通过多个边连接 在该示例中,有两条独立的电缆从D到E,因此绿色和蓝色用户都可以直接连接这些计算机。但是,红色不再能建立这种联系 如果两台计算机通过一根以上的电缆连接,则每个用户最多只能拥有其中一根电缆 我需要在此图上执行一些操作,例如: 确定是否为给定用户连接了任何特定的计算机对 确定给定用户连接目标计算机的最佳路径 识别给定用户的最高延迟计算机连接(即最长路径而不分支) 我的第一个想法就是简单地创建所有边缘的集合,但这对于搜索来说是很糟糕的。我现在想做的最好的事情就是修改一个邻接表,以使列表中的每个项目不仅包含边长,还包含其成本和当前所有者。这是明智的做法吗?假设空间不是问题,那么创建图的多个副本(每个用户一个)而不是单个图是否合理?

3
在网格上随机生成有向图
我试图随机生成一个有向图,目的是制作类似于口袋妖怪的滑冰拼图游戏的拼图游戏。 本质上,这就是我希望能够随机生成的内容:http : //bulbanews.bulbagarden.net/wiki/Crunching_the_numbers : _Graph_theory。 我需要能够在x和y维度上限制图形的大小。在链接中给出的示例中,它将限于8x4网格。 我遇到的问题不是随机生成图,而是随机生成图,我可以在2d空间中正确地绘制它,因为我需要在节点的另一侧做一些事情(例如岩石)来制作它停止滑动时在视觉上有意义。这样做的问题是,岩石有时会终止于两个其他节点之间或可能位于另一个节点本身的路径中,这会导致整个图形损坏。 与几个我认识的人讨论了这个问题之后,我们得出了两个结论,可能会得出一个解决方案。 构造网格时,将网格中的障碍物包括在图中。 从一个完全填充的网格开始,然后绘制一条随机路径并删除将使该路径起作用的块。 然后问题就变成了要删除哪些,以避免引入额外的较短路径。我们还认为动态规划算法可能是有益的,尽管我们每个人都不擅长从零开始创建动态规划算法。关于此问题被正式称为(如果是官方图形问题)的任何想法或参考将是最有帮助的。 这是到目前为止我已经完成的一些示例,仅通过随机放置块并从选定的开始/结束位置生成导航图即可。想法(如上一链接所述)是从绿色S开始并想要到达绿色F。您可以通过向上/向下/向左/向右移动来实现此目的,并继续沿选定的方向移动,直到碰到一个壁。在这些图片中,灰色是墙,白色是地板,紫色线是从头到尾的最小长度,黑色线和灰色点表示可能的路径。 以下是一些随机生成图的不良示例: 以下是随机生成(或手动调整)图的一些好示例: 我似乎还注意到,实际上在玩拼图游戏时更具挑战性的是那些在最小路径上具有很多高次节点的游戏。

2
在具有不可变数据的语言中对双向链接或循环数据结构实施操作的解决方法
我想学习如何在Haskell中制作图并对其执行一些本地操作,但是问题不是特定于Haskell的,我们可以考虑使用双链表来代替图。 问题:用 主要支持和倡导不可变数据结构(Haskell,Clojure等)的语言,惯用或推荐的方式来实现双链表(或其他双链或循环数据结构)及其操作。 ?特别是,如何使用语言正式禁止的就地更新? 我很容易想到,如果对双向链接列表执行某些本地操作(例如,如果插入了一个项目),由于语言的惰性,可能不需要立即复制整个列表。但是,由于列表是双重链接的,因此如果在一个地方进行修改,则旧节点都不能在列表的新版本中使用,因此,迟早需要对它们进行标记,复制和垃圾收集。显然,如果仅使用列表的更新副本,则这些操作是多余的,但是它们会增加与列表大小成比例的“开销”。 这是否意味着对于此类任务,不可变数据根本不合适,并且对可变数据没有“本地”支持的功能性声明语言不如命令式语言那么好?还是有一些棘手的解决方法? 附言:我已经在互联网上找到了一些有关该主题的文章和演示,但是很难追踪它们,而我认为这个问题的答案不应该超过一个段落或者是一个图表...我的意思是,如果有对于此问题,没有“功能性”解决方案,答案可能是“使用C”。如果有一个,那么它有多复杂? 相关问题 “函数式编程中的数据结构”。此处没有讨论我有关使用就地更新而不是效率低下的替代方案的具体问题。 “持久性数据结构的内部变异”。那里的重点似乎是用一种未指定的语言进行的低级实现,而我的问题是关于一种语言(功能语言或其他功能)的正确选择以及功能语言的可能惯用的解决方案。 相关报价 纯粹的函数式编程语言允许非常简洁地表达许多算法,但是在少数算法中,就地可更新状态似乎起着至关重要的作用。对于这些算法,缺乏可更新状态的纯功能语言似乎固有地效率低下([Ponder,McGeer and Ng,1988])。 -约翰·劳伯伯里(John Launchbury)和西蒙·佩顿·琼斯(Simon Peyton Jones),《懒惰的功能状态线程》(1994),还有约翰·劳伯伯里和西蒙·佩顿·琼斯,《哈斯克尔州》(1995)。这些论文ST在Haskell中介绍了Monadic类型构造函数。

1
为复杂的工作时间表建模
我遇到了一个现实世界的问题,我试图代表并实现自动化。我已经将其简化并抽象为以下内容: 有n个工作地点(P1,P2,...,Pn)。 每个位置Pn都有一个密钥Kn。 有m个工人(W1,W2,...,Wm)。 为了在Pn工作,工人必须持有Kn。 每个密钥既可以由工作人员持有,也可以留在交易所E中。 工人可以随时到交易所旅行,以拿起一些无人认领的钥匙或放下一些钥匙以供其他人使用。 现在,必须严格执行外部工作计划。例如: 2016-04-21 W1必须在P6工作 2016-04-21 W2必须在P3工作 **需要交换钥匙** 2016-04-22 W3必须在P3工作 2016-04-22 W2必须在P6工作 任何数量的工人都可能必须在其计划的某个时间在Pn工作,尽管从来没有在同一天 我们知道: 所有键的起始位置,包括工作人员或E 每个工人必须履行的未来工作指令 因此,我正在努力为整个情况建模。您能提出我应该考虑的数据结构和算法,以便掌握它并开始优化每个工人的交易所旅行吗? 我要最小化的是去E的行程总数。第二个目标是确保没有工人进行不成比例的行程。 提前致谢!!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.