【问题标题】:Finding the closest possible values from two dictionaries从两个字典中查找最接近的可能值
【发布时间】:2016-09-09 03:11:20
【问题描述】:

假设您有两个现有的字典 AB

如果您已经从字典 AB 中分别选择了值 A1 = 1.0B1 = 2.0 的初始两个项目,有没有办法在字典 ABA1B1 有不同的值(即 A2B2),并且还会最小化 (A2-A1)**2 + (B2-B1)**2 的值?

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

编辑 - 这很重要:AB 的键相同,但与 AB 中的键对应的值不同。特定的键选择将产生一个有序对 (A1,B1),它不同于任何其他可能的顺序对 (A2,B2)——不同的键具有不同的顺序对。例如,AB 都将具有键 3,4,这将为字典 A2.0 生成 1.0 的值 B。然后将这个键与所有其他可能的键进行比较,以找到另一个有序对(即AB 中项目的键和值),以最小化它们之间的平方差。

【问题讨论】:

  • 您的问题不完整。你关心 A2 和 B2 对应的键是什么吗?你只需要价值观吗?如果 A2 & B2 出现多次,是否需要返回所有键的列表?不过,Ozgur(他似乎已经删除了他的评论)走在正确的轨道上,您将按值排序。
  • @MaxWen 我不一定指定键本身是什么,因为它们可能会有所不同。它们通常是j,k 形式的有序对,其中 j 和 k 是整数,但这不是我的问题的严格要求。更通用的方法将不胜感激。最重要的是在字典中找到值接近但不相同的项目。寻求从AB 返回具有最接近A1B1 的值的两个键。是的,我在想某种排序方法是必要的,但任何特别有效的方法都会非常有帮助。
  • @MaxWen 添加,字典中的所有键都是已知的。尽管寻找值最接近上述 A1 和 B1 的项(即其键和值)。我还进行了编辑,因为在比较过程中考虑的键是相同的,所以没有选择的键可以给出与 A2 和 B2 相同的两个值。如果这样更清楚,我可以提供一个例子。

标签: python python-2.7 dictionary


【解决方案1】:

您需要专门的数据结构,而不是标准的 Python 字典。查找四叉树或 kd-tree。您正在有效地最小化两点之间的欧几里得距离(您的目标函数只是距离欧几里得距离的平方根,并且您的字典 A 正在存储 x 坐标,B y 坐标。)。计算几何的人多年来一直在研究这个。

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

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

【讨论】:

  • 是后者——键必须相同。它本质上是一个非均匀的二维网格,我试图在网格上找到与最初指定的网格最近的点。
  • 知道了。我在答案中添加了第三段。
  • 你几乎完全理解了我的情况。这是一个小问题,但对于每个有序对 (An,Bn),只有 Bn 必须与每个其他有序对的 Bm 不同。另一个有序对 (Am,Bm) 可能有也可能没有 Am = An,但 Bn != Bm 总是。我仍在阅读您发送给我的链接,但我想我会澄清这一点。
  • 制作两个单独的 dicts 有点奇怪——一个用于我的每个维度——但它似乎是非均匀自适应网格的最佳方法,即因为有不同的 dicts 具有相同的键作为自变量,但保留与因变量相关的值。我将不得不研究您提到的 kd-tree/quad-tree 结构,看看它们是否适合我的目的,特别是因为当前的方法已经非常计算密集。
猜你喜欢
  • 2017-01-23
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
相关资源
最近更新 更多