从两个词典中查找最接近的可能值

时间:2016-09-09 03:11:20

标签: python python-2.7 dictionary

假设您有两个现有词典AB

如果您已经分别从词典AB选择了值A1 = 1.0B1 = 2.0的前两个项目,那么有没有办法找到任何两个不同的现有项目词典AB中的每个词都有不同的值(即A2B2来自A1B1,并且还会最小化值(A2-A1)**2 + (B2-B1)**2

字典中的项目数不固定,可能超过100,000。

修改 - 这很重要:AB的密钥相同,但与AB中的密钥对应的值不同。密钥的特定选择将产生与任何其他可能的订单对(A2,B2)不同的有序对(A1,B1) - 不同的密钥具有不同的订单对。例如,AB都有密钥3,4,这将为dict 1.0A生成2.0的值B。然后将该一个密钥与可能的每个其他密钥进行比较,以找到另一个有序对(即AB中的项的密钥和值),以最小化它们之间的平方差。

1 个答案:

答案 0 :(得分:2)

您需要一个专门的数据结构,而不是标准的Python字典。查找四叉树或kd树。您实际上是最小化两点之间的欧几里德距离(您的目标函数只是远离欧几里德距离的平方根,而您的字典A存储x坐标,B坐标。)。计算几何人已经研究了多年。

好吧,也许我误读了你的问题并使它变得更难。您是说可以从A中选择任何值,而从B中选择任何值,无论它们的键是否相同?例如,A的选择可能是K:V(3,4):2.0,B的选择可能是(5,6):3.0?或者它必须是(3,4):来自A和(3,4)的2.0:来自B的6.0?如果是前者,问题很简单:只需运行A中的值并找到最接近A1的值;然后运行B中的值并找到最接近B1的值。如果是后者,我的第一段是正确答案。

你的评论说,更难的问题是你要解决的问题,所以这里还有一点。 Sedgewick的幻灯片解释了静态网格,2d树和四叉树的工作原理。 http://algs4.cs.princeton.edu/lectures/99GeometricSearch.pdf。幻灯片15到29主要解释了2d树,27到29覆盖了最近邻问题的解决方案。由于您具有约束,即算法找到的点必须与查询点不共享x坐标和y坐标,您可能必须自己实现算法或修改现有实现。一种替代策略是使用kNN数据结构(k个最近邻居,而不是单个最近邻居),用k进行实验,并希望您选择的k总是足够大,以找到至少一个满足约束条件的邻居。