如果有一个既定的算法来做这件事,我不会感到惊讶,如果是的话,你应该使用它。但我不知道其中一个,所以我要推测一下。在
如果必须这样做的话,我首先要做的就是遍历所有可能的数字组合,看看要花多长时间。如果你的数据集足够小,就不值得花时间去发明一个聪明的算法。为了演示设置,我将包括示例代码:# setup
def distance(nplet):
'''Takes a pair or triplet (an "n-plet") as a list, and returns its distance.
A smaller return value means better agreement.'''
# your choice of implementation here. Example:
return variance(nplet)
# algorithm
def brute_force(*lists):
return min(itertools.product(*lists), key = distance)
对于一个大的数据集,我会尝试这样的方法:首先为第一个列表中的每个数字创建一个三元组,其第一个条目设置为该数字。然后检查这个部分填充的三元组的列表,对于每一个,从第二个列表中选择最接近第一个列表中的数字的数字,并将其设置为三元组的第二个成员。然后仔细检查三胞胎的列表,对于每个三胞胎,从第三个最接近前两个数字的列表中选择一个数字(根据您的协议度量)。最后,从中取其精华。此示例代码演示如何使运行时在列表长度上保持线性。在
^{pr2}$
问题是,我可以想象这