我有一个包含四个节点的图形,每个节点代表一个位置,它们的布局就像一个二维网格。每个节点都具有与所有(根据位置)相邻节点的连接(边缘)。每个边缘也都有重量。
以下是由A,B,C,D表示的节点,边缘的权重由数字表示:
A 100 B
120 220
C 150 D
我想构建一个容器和一个算法,用于切换共享具有最高权重的边缘的节点。然后重置该边缘的重量。每次执行算法时,都不能多次切换节点(位置)。
例如,处理上述,最高权重是在边缘BD,所以我们切换那些。由于没有节点可以多次切换,因此B或D中涉及的所有边沿都会被重置。
A D
120
C B
然后,下一个最高权重是在唯一的边缘左侧,切换那些将给我们最终的布局:C,D,A,B。
我目前正在执行这个非常糟糕的实现。我存储了一长串边,为它们(可能)连接的节点保存了四个值,它的权重值和节点本身的位置。每次请求任何内容时,我都会遍历整个列表。
我是用C ++编写的,STL的某些部分可以帮助加快速度吗?另外,如何避免重复数据?节点位置当前在五个对象中。存在的节点本身以及指示与其连接的四个节点。
简而言之,我需要帮助:
答案 0 :(得分:2)
至于名称,这是一个顶点覆盖问题。最佳顶点覆盖是NP-hard,具有适当的近似解决方案,但您的问题更简单。您正在根据更严格的边缘选择标准查看伪最大值。具体来说,一旦选择了边缘,每个连接的边缘都被移除(表示删除要交换的顶点)。
例如,这是一种标准的贪婪方法:
0)对边缘进行排序;保留邻接信息
边缘仍然存在:
1)选择最高边缘
2)从列表中删除所有相邻边 ENDWHILE
选择的边列表为您提供了交换的顶点 时间复杂度为O(排序顶点+顶点上的线性传递),通常会归结为O(排序顶点),这很可能是O(V * log(V))。
保留邻接信息的方法取决于图形属性;看你友好的本地算法文本。为简单起见,请尽量从邻接矩阵开始。
与邻接信息一样,大多数其他速度改进最适用于某种形状的图形,但需要权衡时间与空间复杂度。
例如,您的问题陈述似乎暗示顶点以方形图案布局,我们可以从中获得许多有趣的属性。例如,该系统非常容易并行化。此外,邻接信息将是高度规则的,但在大图形大小时稀疏(大多数顶点不会彼此连接)。这使得邻接矩阵产生高开销;你可以将邻接存储在一个4元组的数组中,因为它可以保持快速访问,但几乎完全消除了开销。
答案 1 :(得分:0)
如果您有更大的图表,请查看boost graph库。它为图形和基本迭代器提供了良好的数据结构,适用于不同类型的图遍历