对两组中的每个元素进行成对比较,并 return 排名前三

Do a pairwise comparison of each element in two sets and return a top 3 ranklist

给定两组,我如何对一组中的每个元素与另一组中的每个元素进行成对比较。

我想获得初始集中每个元素的前 3 个结果。\

有没有更快的方法来解决这个任务。我正在寻找一种更 pythonic 的方式来完成任务。

set1 = set([str(item) for item in range(100)])   # Pls. note originally set contains strings
set2 = set([str(item) for item in range(50,150)]) # set([str(item) for item in range(50,100)])

for item in set1:
  max = [-1,-1,-1]
  for stuff in set2:
    val = magicComp(item,stuff)
    if val > max[0]:
        max[2] = max[1]
        max[1] = max[0]
        max[0] = val
    elif val > max[1]:
        max[2] = max[1]
        max[1] = val
    elif val > max[2]:
        max[2] = val

你的答案还不错,比每次迭代都对数组排序要好,但它仍然是 O(N^2)。

由于您知道所需的数组索引,因此可以使用 quickselect 算法根据 magicComp 函数在 O(log n) 时间内找到索引 0,1,2。这会将您的 运行 时间减少到 O(n*log n)

根据 link 中的代码,您的代码类似于:

results = {}
ls2 = list(set2)
for el in set1:
    results[el] = [select(ls2, ii) for ii in [0,1,2]]

如果我们想成为真正的 pythonic,比如

from functools import partial

most_valueable = {
    item1: sorted(set2, key=partial(magicComp, item1), reverse=True)[0:3]
    for item1 in set1
}

应该可以解决问题。然而,这仍然是 O(n² ln n),因为我们需要为每个项目重新排序第二组。

嗯嗯,更快的方式。对于每个内部迭代,您的原始版本的时间复杂度为 O(3n)

下面的时间复杂度更快 O(nlg3)

from queue import PriorityQueue

q = PriorityQueue(maxsize=3)
for item in set1:
    map(q.put, (-1 * magicComp(item,stuff) for stuff in set2))
    max = []
    while not q.empty():
        max.append(-1 * q.get())