有许多项目(例如a,b,c,d,e),其中子集之间的相对距离是已知的。子集的大小是有限的,但我希望收到所有带分数的项目的最终排序。例如:
a,b,c
1,3,5
c,d,e
4,1,10
应该导致类似
的内容a,d,b,c,e
真正的实现将会相当大(每个5个项目大约有5000个子集),所以我试图找到一个可以有效地做到这一点的算法。是否有任何已知的解决方案来解决这样的问题(不需要代码,概念性的想法会更有用)?
答案 0 :(得分:1)
在(未正确地)因没有发布解决方案而被投票后,我想出了以下内容:
sets = [
[["a", 1], ["b", 5], ["c", 9]],
[["c", 3], ["d", 1], ["e", 5]]
]
pairs = {}
for set in sets:
processed_pairs = []
for first in set:
for second in set:
if first[0] is second[0]:
continue
pair = first[0]+second[0]
if pair in processed_pairs:
continue
processed_pairs.append(pair)
if second[0] not in pairs:
pairs[second[0]] = {}
if first[0] not in pairs[second[0]]:
pairs[second[0]][first[0]] = {}
pairs[second[0]][first[0]] = second[1]/first[1]
pairs
导致这些对:
{'a': {'b': 0.2, 'c': 0.1111111111111111},
'b': {'a': 5.0, 'c': 0.5555555555555556},
'c': {'a': 9.0, 'b': 1.8, 'd': 3.0, 'e': 0.6},
'd': {'c': 0.3333333333333333, 'e': 0.2},
'e': {'c': 1.6666666666666667, 'd': 5.0}}
values = {"a": 1}
for i in ['b', 'c', 'd', 'e']:
for letter in pairs[i]:
if letter in values:
values[i] = values[letter]*pairs[i][letter]
values
导致:
{'a': 1, 'b': 5.0, 'c': 9.0, 'd': 3.0, 'e': 15.0}
哪个不是最漂亮的,但可以接受。