图形/点阵简化

时间:2010-12-14 14:36:56

标签: algorithm data-structures graph graph-theory

我正在研究图切算法的数据结构。问题是在最短路径上进行不同的切割。我制作了数据结构,我不确定属性。

输入是最短路径的有向图,它是有界点,有最小和最大元素的部分有序集。

将节点n的下一个节点N(n)定义为一组节点b,其中a <1。 b并且没有c与&lt; c&lt;湾类似定义前一个节点P(n)。扩展集合的定义,N(n)在S中对n的n(n)联合,类似于P(S)。

很容易在节点集L,N(L),N(N(L)),...的列表上进行不同的切割,其中对于每个相邻的对集合A,N(A)= B成立没有分区:

A = A_1 union A_2
B = B_1 union B_2
with B_i = N(A_i), A_i = P(B_i) for i=1,2.

使用此属性创建带有映射的新晶格:

  • 子网格到一个节点
  • 如果找到上部分区而不是创建边缘(分区基数编号)。

简单的格子算法 - &gt;格子映射是:

A = {minimum node}
new_node = [A]
1:
while A, N(A) don't have partitions
  append N(A) to new_node
  A = N(A)
for each partition $B_i$
  last_new_node = new_node
  create new_node = [B_i]
  create edge last_new_node to new_node
  go to 1
At the end fix maximum node in new lattice if needed

可以在新格子上重复调用该算法。我担心:

  • 是否保证达到单节点格?
  • 是否有任何到达单节点晶格的迭代次数的度量?它接缝对我来说是输入图的直径。

我感谢链接到任何类似的数据结构。

TNX

背景

我有一个想法是在我正在使用的东西中使用最大流量网络拦截问题。我正在考虑顶点拦截版本,其中可以从网络中移除给定数量的顶点以最小化最大流量。我正在研究的网络是非常规则的平面有向图(平面分为六边形,每个顶点连接到6个顶点)。我想剪切(禁止)从sourcesink的最短路径。为了使我使用有向图的简化,如果边(a,b)位于从asink的最短路径上,则它是简化图。如果边缘权重为正,则简化的有向图是格子。这就是我所说的“最短路径的有向图”。

我希望顶点切割很好(平行,传播,...),更容易(非常结构化)晶格。

原生切割是'波浪',例如一个不错的剪切C也产生N(C)这很好。因此,我试图通过上述操作简化晶格。我试图描述2个有利于切割并在映射中使用的顶点子集:   - wave - 并行节点集。如果C是一个波,则N(C)是另一个波。   - 条纹 - 一系列波浪,不与其他条纹交叉。 C, N(C), N(N(C))

  B1--C1--D1 ...
 / \ / \ / 
A   X   X  
 \ / \ / \ 
  B2--C2--D2

Waves: {A}, {B1,B2}, {C1,C2}, {D1,D2}
Stripe is made of these 4 waves.

映射将条纹从初始晶格映射到新晶格的节点。新晶格中的节点如果共享波形则相连。边缘的方向是从共享最后一波的条纹到共享第一波的条纹。

因为映射产生具有相同属性的新晶格,所以可以重复过程,直到只有一个节点的晶格。这可以显示,因为每次迭代时晶格直径更小,至少为1。这是因为最小节点MN(M)在同一条带中,这减少了晶格直径。

现在,执行或搜索剪切是递归任务,从最后一个只有一个节点的格子一开始,并在一个整波或相邻波上以阶梯方式剪切。对于切割中的节点,采用映射在其中的子网格,并在该子网格上进行切割。在达到初始晶格之前也一样。

这种结构在晶格压缩上是某种形式。我认为它可以用于动态格子切割搜索。

就我而言,由于其他一些项目限制,我没有使用它。我只用几行代码解决了初始问题非常简单,但我没有意识到它可以像以前那样完成: - )

1 个答案:

答案 0 :(得分:5)

是否可以保证达到单节点晶格?

如果我正确理解你的伪代码,不会:它带有 n - 节点线性顺序到 n - 节点线性顺序。

我会将您的代码描述为接受部分订单并找到series-parallel partial order,其中有一个合理的“忠实”嵌入。

如果您只想在平面图中找到最大流量/最小值切割,那么就会有O(n log n) algorithm