algorithm - 查询 3d 点

标签 algorithm optimization 3d

我有一组 3d 点。每个点都有一个 x、y 和 z 坐标。数组的最大大小可以是 777777。我有 Q 个查询,每个查询都为我提供四个数字 A、B、C、D。对于每个查询,我必须输出以下总和。

enter image description here

Q <=77
1 <= A, B, C <=77
1 <= Xi, Yi, Zi <=77
1 <= Di <= 777
N <= 777777

我所做的:对于每个查询,使用两个嵌套循环计算给定的总和,复杂度为 O(Q*N^2)。有没有更好的计算方法?

编辑: 我可以肯定的是,这不是几何问题。 xi-xj 的最大值为 76,最小值为 -76。这也适用于 yi 和 zi。所以总共可能的组合是 153*153*153。现在在一个查询中,我们必须计算特定组合在数组中出现的次数,并且只计算该组合的总和一次。问题简化为查找特定组合 (xi-xj, yi-yj, zi-zj) 的次数。有人可以从这里开始吗?我怀疑我们可以在这里使用快速傅里叶变换。我以前见过他们习惯于解决这类问题。但我不知道如何开始

最佳答案

下面是错误的,因为它忽略了绝对值函数。我看不出有什么办法可以克服这个问题。

您可以将查询重写为 A * SUM_i!=j (Xi-Xj)/sqrt(...) + B * SUM_i!=j(Yi-Yj)/sqrt(...) + ...

完成此操作后,您可以看到,如果您计算了 A=1、B=C=D=0、B=1、A=C=D=0 和 C=1、A= 的值B=D=0 和 D=1,A=B=C=0,例如Qa、Qb、Qc、Qd,然后你可以找到 A、B、C 和 D 的任何其他值的值作为 A * Qa + B * Qb + C * Qc + D * Qd。

这将复杂度降低到 O(N^2)

关于algorithm - 查询 3d 点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32554822/

相关文章:

php - 将 IP 存储为 unsigned int?

c# - C# 中的优化技术

javascript - 使用四元数在 Three.js 中将平移/倾斜 Angular 转换为 XYZ?

javascript - 在 p5.js 中创建实体 3D 形状

java - 使用合并排序从文本文件中读取的 100000 个整数的反转计数。但无法获得正确的反转计数

php - 我如何整合 Reddit 页面/帖子排名算法?

algorithm - 基于相似词序列的聚类字符串

algorithm - 将两个相邻的 x 转换为一个 (x+1) 可实现的最大数量

c++ - 优化、断言和 Release模式

algorithm - 3d 空间中的三角形三角形交点