我正在实现一个算法,该算法将在计算上非常复杂,并且想要尝试确保我没有做不必要的工作。
有一个nxnxn立方晶格,例如,如果n = 2,则由(0,0,0),(0,1,0),(1,0,0),(1,1,0),(0, 1,1),(0,0,1),(1,0,1),(1,1,1)。
从这个格子中,我将递归地生成所有m点的集合,例如:
solve(set_of_points) {
if set_of_points.size = m, finish
do some useful computation here
for each point in lattice not in set_of_points:
solve(set_of_points + new_point);
}
然后可以从一个空的set_of_points开始调用。
问题的本质是,我实际上不需要m个点的所有排列,而只需要在立方体自然对称下唯一的那些点。
例如,拿一个2x2x2的多维数据集,并假设我们希望所有1点的集合。在以上基本算法下,有8个不同的1点集。
但是,使用立方体的对称性,我们可以将其减少到1个唯一的1点集,因为在立方体的对称性下所有原始的8个点都是等效的(在这种情况下,它们都是“角”)。
如果立方体是2x2x2且m = 2,则基本算法中有28个集合,但是在对称情况下,该集合减少为3个(例如{(0,0,0),(1,0,0)},{(0 ,0,0),(1,1,0)},{(0,0,0),(1,1,1)})
显然,对3个点集进行计算要比28个点好得多,所以我的问题是如何不生成与已经生成的点对称对称的点集?或者,如果这不可能,那么我如何至少减少套数。
(请注意-如果m = 1,这相对容易-只需选择比其他任何一个顶点更接近(0,0,0)的点,并且边界处会有一点毛刺。这是因为m> 1成为一个真正的问题)