在边缘特征矩阵中定位边缘索引

时间:2014-05-14 19:04:48

标签: python algorithm

我有G的无向图3 nodesa,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.这只是为了使解释变得简单。

1 个答案:

答案 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的索引和边缘数组的索引。