我不太确定如何在这里描述我的问题,所以我想我会先尝试解释一下情况。我有一个从 4 边多边形的方形格子网格中提取的数据集。不能保证晶格尺寸是特别的。我可以访问描述网格上任何给定点的邻居的数据(即“点 236 具有点 417、872、123 和 331 的边缘”),仅此而已。
我所拥有的是:
graph = [set([5, 9]), set([4, 11]), set([5, 6, 12]), set([6, 10, 2]), \
set([1, 3, 8]), set([3, 7, 4]), set([6, 12, 10, 16]), \
set([5, 9, 18, 12]), set([1, 8, 13]), set([4, 11, 7, 15]), \
set([2, 10, 17]), set([3, 7, 8, 14]), set([9, 18]), \
set([18, 12, 16]), set([16, 10, 17]), set([14, 7, 15]), \
set([15, 11]), set([13, 8, 14])]
Wheregraph[n]
让我可以通过索引访问任何给定点的邻居n
......整个数据集可以通过下面显示的 2D 图表进行可视化(我无法通过上面列出的数据访问其他数据):
*--------*--------*-------*-------*-------*
| 1 | 5 | 3 | 6 | 4 | 2
| | | | | |
| | | | | |
*--------*--------*-------*-------*-------*
| 9 | 8 | 12 | 7 | 10 | 11
| | | | | |
| | | | | |
*--------*--------*-------*-------*-------*
13 18 14 16 15 17
我试图把它变成一组看起来像这样的数据:
u = [[1, 5, 3, 6, 4, 2], [9, 8, 12, 7, 10, 11], [13, 18, 14, 16, 15, 17]]
v = [[1, 9, 13], [5, 8, 18], [3, 12, 14], [6, 7, 16], [4, 10, 15], [2, 11, 17]]
输出数据描述网格的平行线(从具有最低索引号的角开始)。每个点都保证有一个唯一的索引,并且网格保证有一组连续的索引(在本例中,从 1 到 18),但不保证顺序。网格的尺寸事先是未知的。每个点只会有 2(角点)、3(边缘点)或 4(中心某处的点)的价。
现在,我已经为此编写了一个蛮力方法,但它的效率相当低。它包括找出前两个水平和垂直边缘(在本例中为 [1, 5, 3, 6, 4, 2] 和 [1, 9, 13]),然后通过获取每个点的连接邻居并从中减去一个已经访问过的集合(因此 1 -> 5, 9 -> 8, 13 -> 18)并重复此过程,直到您到达网格的另一侧。
我想知道是否有一种更“pythonic”的方式来处理这个问题。我自己的代码被分成几个不同的阶段,但我认为必须有某种方法可以一举完成,而不是对所有内容进行多次迭代(目前我每次运行大约需要 60 毫秒才能弄清楚这一切,如果可能的话,我正试图将其降低到 20 毫秒)。