我正在尝试使用多组点并将它们分成更小的集合。约束条件是每个集合的每个维度都有一些最小值和一些最大值。我想生成这些集合的所有可能组合(让我们称之为一组集合。)当我完成时,每个点都出现在每个集合中的一组中。
作为一个例子,假设我只有两个独立变量i和j的数据点。他们是:
(1,1) (1,2) (2,2) (3,1),(2,1),(2,3)
任何这些分裂都很好:
(1,1)(1,2) and (2,2)(3,2)(2,1)(2,3)
First set has i < 2, second set has i >= 2.
(1,1)(3,1)(2,1) and (1,2)(2,2)(2,3)
First set has j < 2, second set has j >= 2.
(1,1)(1,2) and (2,2)(3,1)(2,1) and empty and (2,3)
First set has (i < 2, j < 3), second set has (i >= 2, j < 3)
Third set has (i < 2, j >= 3), fourth set has (i >= 2, j >= 3)
如何在不手动迭代每个点(不同数字)的情况下生成整个拆分集!次?
这不是作业,只是我试图写作数据钳工的一部分的程序。
答案 0 :(得分:1)
假设意图是每个维度中最多有一个分界点(从而将点分成最多两个相对于该维度的集合),那么:
对于每个维度,让V为该维度中的坐标集。例如,给定点(4,10),(4,20),(6,10),(6,18),(7,3),那么,对于第一维,V是{4,6,7 }。迭代v通过集合中的每个值。
嵌套那些迭代,每个维度一个,这样,在最里面的循环体中,每个维度都有一个v。我们将它们编号为v0,v1,v2,...
每个v形成一个标准:x&lt; v或v&lt; = x。对于n维,这些标准有2个 n 组合。每个组合指定原始点的子集。例如,一个这样的子集是{p | x0&lt; v0和v1&lt; = x1和v2&lt; = x2和...},其中点p具有坐标(x0,x1,x2,...)。因此,遍历2个 n 潜在子集(由于它们为空,因此有些相同),并将它们收集到一个集合中。这是原始点集的分区。
当您完成对值的迭代时,您将构建符合条件的每个分区。