订购具有已知对距离的项目

时间:2016-03-30 09:54:42

标签: python algorithm sorting

有许多项目(例如a,b,c,d,e),其中子集之间的相对距离是已知的。子集的大小是有限的,但我希望收到所有带分数的项目的最终排序。例如:

a,b,c
1,3,5

c,d,e
4,1,10

应该导致类似

的内容
a,d,b,c,e

真正的实现将会相当大(每个5个项目大约有5000个子集),所以我试图找到一个可以有效地做到这一点的算法。是否有任何已知的解决方案来解决这样的问题(不需要代码,概念性的想法会更有用)?

1 个答案:

答案 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}

哪个不是最漂亮的,但可以接受。