假设我在一个n维空间中有一组点。以三维为空间为例:
(这不是我所遇到的确切问题,但同构,并且我认为这个解释对其他人来说最容易理解。)
A : [1,2,3]
B : [4,5,6]
C : [7,8,9]
我有一组描述此空间内可能运动的向量:
V1 : [+1,0,-1]
V2 : [+2,0,0]
现在,给定一个点dest,我需要找到一个起始点p和一组向量moves,以最有效的方式将我带到dest。效率被定义为“移动次数最少”,而不一定是“线性距离最短”:如果移动集合使您可以在较少的移动次数内到达目标,则可以选择比其他候选点更远离dest的p。 moves中的向量必须是可用向量的严格子集;除非它在输入集合中出现多次,否则不能重复使用相同的向量。
我的输入包含约100个起始点和大约10个向量,我的维数为20左右。起始点和可用向量将固定应用程序的生命周期,但我将为许多不同的dest点寻找路径。我想优化速度,而不是内存。算法无法找到到dest的可能路径是可以接受的。
采纳的解决方案更新
我采用了与下面标记为“已接受”的解决方案非常相似的解决方案。我遍历所有点和向量,并构建到达它们的所有可达点列表。我将此列表转换为<dest,p+向量>的哈希表,选择每个目标点的最短向量集。(这里还有一些哈希表大小的优化,但与本题无关。)随后的dest查找在常数时间内完成。