【问题标题】:How to find closest double in unsorted array如何在未排序的数组中找到最接近的双精度
【发布时间】:2015-06-12 19:06:01
【问题描述】:

我在离散空间中有一组点,坐标以 N 个 double[] 数组的形式给出。

如:

点 T1 = {1.3,2.5,4-3} ---> double[] x = {1.3}, double[] y = {2.5}, double[] z = {4.3}

然后我有一个函数可以在连续空间中的所有方向上从给定点生成偏移量,我需要在我的矩阵/双精度数组中找到最接近的匹配项。

问题是我无法对这些数组进行排序并应用二进制搜索,因为 Point 的组件在排序后很可能不会有相同的索引,相对于彼此。

是否有一些我可以应用的数据结构/算法来避免迭代搜索最接近的匹配点?

将点组织成一个数组实例来描述整个点而不是每个组件的数组会更好吗?

编辑

看起来理想的解决方案将使用评论中建议的 k-d 树。计算机科学算法不是我的领域,因此在我研究该主题时,使用 k-d 树或其他替代方法演示最小示例的答案将是最有帮助的。

【问题讨论】:

  • 所有N double[] 都只包含一个元素吗?
  • 您可以使用 Octree 或其他一些空间数据类型,例如 k-D 树
  • 我不受任何结构的约束。我需要能够以某种方式将点存储在维度空间中以获得尽可能快的搜索。任何考虑到这一点的数据组织都适合我。
  • 解决方案不应绑定到 3 维空间
  • 看起来,据我所知,k-d 树可能是解决这个问题的方法。我以前从未使用过这种结构。 @Samgak 您能否为答案展示最小的可能示例?

标签: java arrays algorithm search optimization


【解决方案1】:

如果我理解您的问题,您有 N 个大小为 M 的浮点数组,每个数组包含一个点在 N 维空间中沿轴的坐标。您还有一个浮点数,并且您想要找到浮点数最接近其中一个组件的点的索引。如果这是正确的,我将创建一个数组,其元素是对 (value, index),其中 value 是组件之一, index 带来组件所属点的索引。然后,您可以使用 value 作为sorting.key 对数组进行排序。此时,您可以使用浮点数进行二进制搜索。

当然,只有当您要搜索多个浮点数时,构建和排序数组才有意义,因为排序需要 O (K log K),K= N*M,然后搜索需要 O (log K )。如果只需要搜索一个浮点数,不妨对数组进行一次全搜索,结果为 O(K)。

【讨论】:

  • 我没有单个浮点数作为距离。我有 N 个双精度数(在 N 个方向上步进),它们代表新点,而不是单个浮点数显示在一个方向上的步进。我需要找到这个新点与我的样本中最接近的匹配。
  • 它是 N 维空间中的一个点,还是其中任意多个?如果是单个点 P,只需遍历整个数组并收集到 P 的最小距离点。如果您必须搜索任意数量的点 P,那么您可能需要在维基百科上查找“最近邻搜索”。
  • 搜索整个数组是我想要避免的。当然,它会起作用,但问题的前提是如何编写比这更有效的算法。空间中不会只有一步,然后是搜索最近的邻居,因此我想要最小的时间复杂度。
  • 谢谢,我会按照你的建议检查最近的邻居。
猜你喜欢
  • 2014-04-19
  • 2019-07-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2022-10-05
  • 2014-11-06
  • 2010-12-10
  • 2018-04-25
相关资源
最近更新 更多