我有G
的无向图3 nodes
:a,b,c
。我在图表中创建U
所有可能边的集合:U = [(a,b), (a,c), (b,c)]
我的矩阵M
的形状为3_by_4
。每行代表可能边的特征向量,因此M[0]
是边(a,b)的特征向量。 M
中的元素具有U
中的相应索引。
现在我的问题是给定两个节点(x,y)
,矩阵M
中的哪一行是它们的特征向量?
这有点复杂,因为我有两种可能性:(x,y)和(y,x)。
我考虑解决这个问题的天真方法如下:
创建字典E = {(x,y) : their_U_index}
。因此,对于U
中的每个可能边缘,我将(x,y)
作为关键字,将(x,y)
中的U
索引作为M
中的索引
给定两个节点(x,y):
if (x,y) in E:
index = E[(x,y)]
#get the feature vector M[index] ... then do something with it
else:
index = E[(y,x)]
#get the feature vector M[index] ... then do something with it
但是我担心做if (x,y) in E
可能会慢一点:
index = E[(x,y)]
然后,如果我收到KeyError异常,我会尝试使用其他组合。
现在我的问题是:
1-有没有更好的方法来做我想做的事情?
2- if (x,y) in E
和异常一样快吗?
PS。当然,想象很多的节点不仅仅是3.这只是为了使解释变得简单。
答案 0 :(得分:0)
您可以使用
index = E[(max(x, y), min(x, y))]
更好的是,将它包装在一个函数中并改为调用函数。
但是如果你的图形在每个节点对之间包含一条边,那么就会有一个简单的关系。假设你有一对节点x和y,x> y(如果没有,交换它们)并按顺序存储所有边(1,0),(2,1),(2,0),(3,2),(3,1),(3,0) ),...,然后对于每个x值,所有y值的边缘列表显示为连续块,并且此列表开始的位置以x:2平方增加:
index = x*(x-1)/2 + y
假设x,y的基于0的索引和边缘数组的索引。