目前,我的算法需要(估计)十多个小时才能完成。它现在仍在运行,这样我就可以更好地估计它有多糟糕。
假设我有一组人P,每个人都有一个不同长度的排序列表,其中i是一个索引变量。我想创建一个图G使得G P i ,P j = n,其中n是P i和P j之间的边权重,表示它们在某个静态范围r内共同出现的次数。
我当前的算法是无意识的,并在 Python 中实现(既可读又明确),如下所示:(为简洁起见,从GitHub 上的存储库中更改)
print '>Generating combinations...',
pairs = combinations(people, 2)
print 'Done'
print 'Finding co-occurences'
radius = 5
for A, B in pairs:
for oA in A.occurances:
for oB in B.occurances:
if oB in range(oA - radius, oA + radius):
try:
network.edge[A.common_name][B.common_name]['weight'] += 1
except:
network.add_edge(A.common_name, B.common_name, weight=1)
我考虑过改变这个算法,这样当oB
超过 current 的范围时oA
,循环就会继续到下一个oA
。
考虑到列表已排序,有没有更好的方法来实现这一点?